是的,我们可以使用MutationObserver来实现这个功能,当任何元素的class或_msttexthash属性发生变化时,这段代码将会运行。
Chrome在翻译时会给文档添加translated-ltr类,
而Edge在翻译时会给元素添加_msttexthash属性。
const attributeAddedCallback = function (mutationsList) {
};
const observer = new MutationObserver(attributeAddedCallback);
observer.observe(langspan, { attributes: true, subtree: true, attributeFilter: ['class', '_msttexthash'] });
现在我们必须检查页面是否已经翻译完成。
const attributeAddedCallback = function (mutationsList) {
if (document.documentElement.className.match('translated-ltr')) {
dotranslations();
} else {
var translated = false;
for (const mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === '_msttexthash') {
translated = true;
}
}
if (translated) {
dotranslations();
}
}
};
const observer = new MutationObserver(attributeAddedCallback);
observer.observe(langspan, { attributes: true, subtree: true, attributeFilter: ['class', '_msttexthash'] });
现在我们可以通过使用控制文本来检测页面翻译成哪种语言
- 如果“language”翻译成“dil”,那么页面翻译成土耳其语
- 如果“language”翻译成“Γλώσσα”,那么页面翻译成希腊语
...
langs = { 'dil': 'tr', 'language': 'en', 'Γλώσσα': 'el' };
var langspan = document.createElement("span");
langspan.innerText = "dil";
langspan.lang = "tr";
langspan.translate = "yes";
function dotranslations() {
var lang = langs[langspan.innerText];
document.querySelectorAll("*").forEach(element => {
if (element.hasAttribute('translate-suggestion-' + lang)) {
element.innerText = element.getAttribute('translate-suggestion-' + lang);
}
});
}
现在开始编写代码:
translationsuggests.js
langs = { 'dil': 'tr', 'language': 'en', 'Γλώσσα': 'el' };
var langspan = document.createElement("span");
langspan.style.position = "fixed";
langspan.style.opacity = "0";
langspan.style.pointerEvents = "none";
langspan.innerText = "dil";
langspan.lang = "tr";
langspan.translate = "yes";
document.body.appendChild(langspan);
function dotranslations() {
var lang = langs[langspan.innerText];
document.querySelectorAll("*").forEach(element => {
if (element.hasAttribute('translate-suggestion-' + lang)) {
element.innerText = element.getAttribute('translate-suggestion-' + lang);
}
});
}
const attributeAddedCallback = function (mutationsList) {
if (document.documentElement.className.match('translated-ltr')) {
dotranslations();
} else {
for (const mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === '_msttexthash') {
dotranslations();
}
}
}
};
const observer = new MutationObserver(attributeAddedCallback);
observer.observe(langspan, { attributes: true, subtree: true, attributeFilter: ['class', '_msttexthash'] });
使用方法
<html lang="tr">
<body>
<script src="path/to/translationsuggests.js"></script>
<p translate="yes" translate-suggestion-el="Κάμερα:" translate-suggestion-en="Cam:">Kamera:</p>
<span translate="no">XYZ</span>
</body>
</html>
编辑
我说过“Chrome会给文档添加translated
类”,但实际上它添加的是translated-ltr
,抱歉,是我的错误。