Попробуйте это:
const translateElement = async element => {
const
elementNode = element.childNodes[0],
sourceText = elementNode && elementNode.nodeValue;
if (sourceText)
try {
const
url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=es&dt=t&q=' + sourceText,
resultJson = await fetch(url),
result = await resultJson.json(),
translatedText = result[0][0][0].split(', ');
elementNode.nodeValue = translatedText;
} catch (error) {
console.error(error);
}
}
}
Для одного элемента - просто назовите его так:
(async () => await translateElement(document.body))();
Для всех элементов в DOM - вам потребуется рекурсивно go по всем элементам, начиная с нужного родительского тега (body
, в вашем случае), и вызовите вышеуказанную функцию для каждого элемента, например:
(async () => {
const
parent = 'body',
selector = `${parent}, ${parent} *`,
elements = [...document.querySelectorAll(selector)],
promises = elements.map(translateElement);
await Promise.all(promises);
})();
Примечания:
- Я использовал
childNodes[0].nodeValue
вместо innerHtml
или innerText
для хранения дочерних элементов. - Обратите внимание, что go по всему DOM не рекомендуется и может привести к таким проблемам, как изменение
script
и style
метки.