本脚本接口摘自新edge浏览器,应该会稳定;
这是一个能自动将 html 网页自动翻译为多国语言JS脚本,只需在网页中引入下面的js,一行代码实现网页全页翻译!效果同 Chrome 自动翻译。
适用给网站快速增加多种语言切换的能力。
适合一些预算低,但是有想要多国语言的网站。
PS:本脚本由chatgpt编写,本人修改整理
引入脚本
<script src="/translate.js"></script>
执行翻译:
translatePage('en');
函数接受两个可选参数:Tolang 和 FromLang。
Tolang 参数指定翻译的目标语言。如果未指定此参数,则默认值为英语 ('en')。
FromLang 参数指定翻译的源语言。如果未指定此参数,则API将尝试自动检测源语言。
调用示例:
<ul class="language">
<li><a onclick="translatePage('en')">English</a></li>|
<li><a onclick="translatePage('ja')">日语</a></li>|
<li><a onclick="translatePage('zh-TW')">繁體中文</a></li>
</ul>
更多语言代码参考
https://cloud.google.com/translate/docs/languages?hl=zh-cn使用效果:


代码如下:
var wordArr = [], domArr = [];
function traverse(node) {
if(!wordArr.length){
wordArr.push({ "Text": document.title });
}
if (
node.nodeType === Node.ELEMENT_NODE
&&(node.tagName.toLowerCase() === 'head'
|| node.tagName.toLowerCase() === 'pre'
|| node.tagName.toLowerCase() === 'script'
|| node.tagName.toLowerCase() === 'textarea'
|| getComputedStyle(node).display === 'none'
))
{
return; // 排除 <head>, <pre>, <script>, <textarea> 标签和不显示元素
}
if (node.nodeType === Node.TEXT_NODE) {
const text = node.textContent.trim();
if (text !== '') {
wordArr.push({ "Text": text }); // 添加文本内容到 JSON 数组中
domArr.push(node); // 存储dom
}
}
for (const child of node.childNodes) {
traverse(child); // 递归遍历子节点
}
}
/**
* 将网页内容从一种语言翻译成另一种语言
* @async
* @param {string} Tolang - 目标语言,默认为英语 ('en')
* @param {string} FromLang - 源语言,API 将尝试自动检测源语言
* @returns {Promise<Object>} 翻译后的数据作为一个 JSON 对象
*/
async function translatePage(Tolang='en',FromLang) {
if(wordArr.length){
wordArr = [], domArr = [];
}
traverse(document.body);
let translateauth = await getTranslateAuth();
try {
FromLang ?`from=${FromLang}`:'';
const response = await fetch(`https://api.cognitive.microsofttranslator.com/translate?${FromLang}&to=${Tolang}&api-version=3.0&includeSentenceLength=true`, {
method: 'POST',
headers: {
'authority': 'api.cognitive.microsofttranslator.com',
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'authorization': 'Bearer ' + translateauth,
'content-type': 'application/json',
'origin': window.location.origin,
'referer': window.location.origin,
'sec-ch-ua': '"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51'
},
body: JSON.stringify(wordArr),
redirect: 'follow'
});
if (!response.ok) {
if (response.status === 401) {
sessionStorage.removeItem("translateauth");
return await translatePage();
}
}
const data = await response.json();
console.log(data);
let translated = data.map(obj => {
return { text: obj.translations[0].text };
})
translated.forEach(function (element, index) {
if(index == 0){
document.title = element.text;
}else{
domArr[index-1].textContent = element.text;
}
})
wordArr = [], domArr = [];
return data;
} catch (error) {
console.error(error);
}
}
async function getTranslateAuth() {
let translateauth = sessionStorage.getItem('translateauth');
if (translateauth) {
return await translateauth;
} else {
const response = await fetch('https://edge.microsoft.com/translate/auth', {
method: 'GET',
headers: {
'authority': 'edge.microsoft.com',
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'origin': window.location.origin,
'referer': window.location.origin,
'sec-ch-ua': '"Microsoft Edge";v="111", "Not(A:Brand";v="8", "Chromium";v="111"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'sec-mesh-client-arch': 'x86_64',
'sec-mesh-client-edge-channel': 'stable',
'sec-mesh-client-edge-version': '111.0.1661.51',
'sec-mesh-client-os': 'Windows',
'sec-mesh-client-os-version': '10.0.18362',
'sec-mesh-client-webview': '0',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.51'
}
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.text();
sessionStorage.setItem('translateauth', data);
return data;
}
}
@张小强,写成via插件全网调用可行???
@张小强,那插件要科学和魔法才能用。比较鸡肋
@张小强,Web Serial API是一种新的Web API,允许Web应用程序直接访问串口设备。借助Web Serial API,您可以轻松地开发一个网页版的串口助手,用于与串口设备进行通信。
以下是一个使用Web Serial API编写的网页版串口助手的示例代码:
@张小强,
');
}
}
</body>
</html>
```
上述代码中,我们使用了Web Serial API提供的
navigator.serial
接口来访问串口设备。我们首先使用navigator.serial.getPorts()
函数列出可用的串口设备,并将它们添加到下拉框中供用户选择。用户选择设备后,点击“连接串口”按钮,调用navigator.serial.requestPort()
函数请求打开指定的串口设备,并指定波特率为9600。如果连接成功,则监听port
对象的readable
事件,并在事件处理函数中读取串口数据并显示到输出框中。用户可以在输入框中输入要发送的数据,并点击“发送”按钮发送到串口设备中。需要注意的是,Web Serial API目前仅支持Chrome浏览器,并且需要在浏览器中启用实验性功能。此外,使用Web Serial API需要使用HTTPS协议访问页面,或者在localhost环境下访问。