全文翻译
function getTextNodes(node) {
let textNodes = [];
if (node.nodeType === Node.TEXT_NODE) {
textNodes.push(node);
} else {
for (let child of node.childNodes) {
textNodes = textNodes.concat(getTextNodes(child));
}
}
return textNodes;
}
async function translateText(text, targetLanguage = 'en') {
const response = await fetch('https://api.example.com/translate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
q: text,
target: targetLanguage,
}),
});
const data = await response.json();
return data.translatedText;
}
async function insertTranslations() {
const textNodes = getTextNodes(document.body);
for (let node of textNodes) {
const originalText = node.nodeValue.trim();
if (originalText) {
const translatedText = await translateText(originalText);
const span = document.createElement('span');
span.style.color = 'blue';
span.textContent = ` (${translatedText})`;
node.parentNode.insertBefore(span, node.nextSibling);
}
}
}
insertTranslations();
cmd + 鼠标悬停翻译
let isCmdPressed = false;
document.addEventListener('keydown', (event) => {
if (event.key === 'Meta') {
isCmdPressed = true;
}
});
document.addEventListener('keyup', (event) => {
if (event.key === 'Meta') {
isCmdPressed = false;
}
});
async function translateText(text, targetLanguage = 'en') {
const response = await fetch('https://api.example.com/translate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
q: text,
target: targetLanguage,
}),
});
const data = await response.json();
return data.translatedText;
}
document.addEventListener('mousemove', async (event) => {
if (isCmdPressed) {
const target = event.target;
if (target && target.nodeType === Node.ELEMENT_NODE && !target.dataset.translated) {
const originalText = target.textContent.trim();
if (originalText) {
const translatedText = await translateText(originalText);
const newElement = document.createElement(target.nodeName.toLowerCase());
newElement.textContent = translatedText;
newElement.style.color = 'blue';
target.parentNode.insertBefore(newElement, target.nextSibling);
target.dataset.translated = 'true';
}
}
}
});
