离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言。
要实现翻译需要解决以下3个主要问题:
1)from:内容本身的语言类型是什么?
2)to:需要翻译为目标语言是什么?
3)text:需要翻译的文本内容是什么?
转化为:
1)首先,如何识别文档内容的语言?一篇文章中有多种语言混合的如何识别?
2)其次,用户使用的是什么语言?如何获取目标语言?
3)在文档或者网页中,所有内容都是带有格式的,如何翻译之后进行还原保证样式不丢失?
在网上查了很多资料,也下载了很多 收费 的资料,结果不尽人意。
获取用户的语言:
1)通过浏览器的默认语言判断用户使用的语言:
<script>
// 获取浏览器默认语言
const getBrowserLang = function () {
let browserLang = navigator.language ? navigator.language : navigator.browserLanguage;
let defaultBrowserLang = "";
if (
browserLang.toLowerCase() === "us" ||
browserLang.toLowerCase() === "en" ||
browserLang.toLowerCase() === "en_us"
) {
defaultBrowserLang = "en_US";
} else {
defaultBrowserLang = "zh_CN";
}
return defaultBrowserLang;
};
console.log(getBrowserLang());
</script>
或者:
<script>
var type = navigator.appName; //BOM对象获取浏览器名称
if (type == "Netscape") {
var lang = navigator.language.toLowerCase(); //获取浏览器配置语言,支持非IE浏览器
} else {
var lang = navigator.browserLanguage.toLowerCase(); //获取浏览器配置语言,支持IE5+
}
console.log(lang);
var lang = lang.substr(0, 5); //获取浏览器配置语言前4位
console.log(lang);
</script>
如何通过js在html中动态导入其他的js库:
<script>
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "http://localhost:8060/static/translate.min.js";
script.onload = script.onreadystatechange = function () {
translate.storage.set("to", "");
//设置使用v2.x 版本
translate.setUseVersion2();
//SELECT 修改 onchange 事件
translate.selectLanguageTag.selectOnChange = function (event) {
//判断是否是第一次翻译,如果是,那就不用刷新页面了。 true则是需要刷新,不是第一次翻译
var isReload = translate.to != null && translate.to.length > 0;
if (isReload) {
//如果要刷新页面的话,弹出友好提示
alert(
"您好,快速体验暂时只能切换其中一种语言进行体验,只是提供效果展示,您可参考接入文档来接入您的项目中进行完整体验及使用。",
);
} else {
var language = event.target.value;
console.log(language);
// translate.changeLanguage(language);
}
};
};
</script>
如何获取文档或者网页的需要翻译的内容?找了一个网页翻译助手实现的js插件代码进行参考,完整代码如下:
// ==UserScript==
// @name 网页翻译助手
// @version 1.3.3
// @namespace https://github.com/zyufstudio/TM/tree/master/webTranslate
// @description 支持划词翻译,输入文本翻译,谷歌整页翻译。可以自行选择谷歌翻译,有道字典翻译和百度翻译。
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAENklEQVRoQ+2ZTVITQRTH/28qyNIJFxCqnGwNJzCcwHACcelkIZxAPAG4IFkaTyCegHgC4jZjVfACzLBEUvOs7jCx57unZ6JSRZZJ9+v3e+/1++gQHviHHrj+eAT41x4s9YA99F5qK3nb+h4c7QTa6xtYmAuwNfLeg3Fc5QxmBGy1doO3O1dV9tVZmwmwdeYdg/DeTDB/vnY7B2Z7q+/KBhh6XF3UcgeDr3y3s2O6v+q+FIB9NutaRJdVBanrQ+bdYNCZ1pGhuzcNMPJ6FuNCV0DWuhA4ClzntI4M3b1rARBhRERjXSWK1oUhfy3y5loAmlBclcHAue86+1lyHwTAfXb4cD1wUmm9EgAzfhLoPLT4fGUNRpeAPgH6Bc/ARcw89Qed3eRWLQAGbhg4LrqY9sjrUYgxEZ7FDmH6GAPWUZ7JJvBh0ijXrpPStxRAKs/c00mLAiKewcyLmn0yt63Nha/yGgGEoP3Afb4KGSEYT+5eWxbZQniUJUT9INAFEeT3RXGr4wSxpj30JqoXKgMw8M13nV50oH02OyDQSUxJWX55zKB+8vu8uP1rAKr17dF8m8LFZUr5Em1Cau2ozZ09/NEn8Dum1puypq+2B1SXbQ1nY4Be61rvTxjxOPy1cRS12e2z2SURdcHITIuq/FoA4vL6rrOK56QwBn/n241eXv/fHs6mBHpRFViEHVsb+8I79QAYgT9w2pECSWFlFlxZuiqBSAz3YVcLQJxbFEJyeGEcwMJyAmO+UVPtltKSJzOZyiTuhAX+woyv/sDpNxZCMkUqKVReYl5MCXiaZdSQ+U0w6MgGLt2S59eD9tC7IKCn7s/zukkanfiusxdLo0SnaYi4gnkTXXLYiQqfLJa3re3kfaodQkkvSOuKQra5OLB4WbBCC5PgrTNZQZ7MbXqymKdqAnAjwZXsU5aRGgGQsQ7e02olpPJ3FzJNJj4ixonwSkIz71qgvpi7RYPoD5ztrLBsBCASHDIfBoPOx7yksmwl8ClLeXnHgW/ENAXxO2GUyENF42ejAEsl+Eq204DSTnOXiHqipS7LmOFtq02bi/OovykbPRsHKFNQ4/dTkXoj68ui9WtjL78Y1mzmNBQyWiKqOETPT3hWBPE/egBRwRLZjDbvJqLdyIP4LwFCwl6UdssgzAAaeNgqjKtEFxqDAGKF0whAHK72MUZBXrApOSRFxXGZnfhKfVc1B6j1uFuGrD8nGwNIL6wBIq/nyUOuBbDqbUbeaiYus230uxWil/U8X9RWZ7cSszmBVm2GVjeqq2TZuqwRtAqAeECwiD6p5/xVgGhQSTd1PAVRyd9QvK1a/r6Xio24kdzS/8jKLF30e3voBXkDUFW5WRObkLFWAOOXjASdvPzU6mY9w6wVYFmk/nSfla0O3IAxYat1mPeGtFaAqgqbrH8EMLFak3sePdCkNU1k/QadtchPhjx3/AAAAABJRU5ErkJggg==
// @author Johnny Li
// @license MIT
// @match *://*/*
// @grant GM_info
// @grant GM_xmlhttpRequest
// @grant GM_addStyle
// @grant GM_registerMenuCommand
// @grant GM_setValue
// @grant GM_getValue
// @connect cdn.jsdelivr.net
// @connect cdn.bootcss.com
// @connect translate.google.com.hk
// @connect fanyi.youdao.com
// @connect dict.youdao.com
// @connect fanyi.baidu.com
// @connect shared.ydstatic.com
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/index.min.js
// @require https://cdn.jsdelivr.net/gh/zyufstudio/jQuery@3a09ff54b33fc2ae489b5083174698b3fa83f4a7/jPopBox/dist/jPopBox.min.js
// ==/UserScript==
//文件使用Rollup+Gulp编译而成,如需查看源码请转到GitHub项目。
(function () {
'use strict';
/**
* 字符串模板格式化
* @param {string} formatStr - 字符串模板
* @returns {string} 格式化后的字符串
* @example
* StringFormat("ab{0}c{1}ed",1,"q") output "ab1cqed"
*/
function StringFormat(formatStr) {
var args = arguments;
return formatStr.replace(/\{(\d+)\}/g, function (m, i) {
i = parseInt(i);
return args[i + 1];
});
}
/**
* 日期格式化
* @param {Date} date - 日期
* @param {string} formatStr - 格式化模板
* @returns {string} 格式化日期后的字符串
* @example
* DateFormat(new Date(),"yyyy-MM-dd") output "2020-03-23"
* @example
* DateFormat(new Date(),"yyyy/MM/dd hh:mm:ss") output "2020/03/23 10:30:05"
*/
function DateFormat(date, formatStr) {
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(formatStr)) {
formatStr = formatStr.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
}
for (var k in o) {
if (new RegExp("(" + k + ")").test(formatStr)) {
formatStr = formatStr.replace(
RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return formatStr;
}
/**
* 生成Guid
* @param {boolean} hasLine - guid字符串是否包含短横线
* @returns {string} guid
* @example
* Guid(false) output "b72f78a6cb88362c0784cb82afae450b"
* @example
* Guid(true) output "67b25d43-4cfa-3edb-40d7-89961ce7f388"
*/
function Guid(hasLine){
var guid="";
function S4() {
return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}
if(hasLine){
guid=(S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}
else {
guid=(S4()+S4()+S4()+S4()+S4()+S4()+S4()+S4());
}
return guid;
}
/**
* 清除dom元素默认事件
* @param {object} e - dom元素
*/
function ClearBubble(e) {
if (e.stopPropagation) {
e.stopPropagation();
} else {
e.cancelBubble = true;
}
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
}
function ObjectToQueryString(object){
var querystring=Object.keys(object).map(function(key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(object[key])
}).join('&');
return querystring;
}
/**
* 配置参数
*/
var options={
//默认翻译引擎
defaulttransengine:"yd"
};
/**
* 获取配置参数
*/
function GetSettingOptions(){
var optionsJson=GM_getValue("webtranslate-options")||"";
if(optionsJson!=""){
var optionsData=JSON.parse(optionsJson);
for (var key in options) {
if (options.hasOwnProperty(key) && optionsData.hasOwnProperty(key)) {
options[key]= optionsData[key];
}
}
}
return options;
}
/**
* 设置配置参数
*/
function SetSettingOptions(){
var optionsJson=JSON.stringify(options);
GM_setValue("webtranslate-options", optionsJson);
}
//谷歌翻译
var googleTrans = {
code: "ge",
codeText: "谷歌",
defaultOrigLang: "auto", //默认源语言
defaultTargetLang: "zh-CN", //默认目标语言
langList: {
"auto": "自动检测",
"zh-CN": "中文简体",
"zh-TW": "中文繁体",
"en": "英文",
"ja": "日文",
"ko": "韩文",
"fr": "法文",
"es": "西班牙文",
"pt": "葡萄牙文",
"it": "意大利文",
"ru": "俄文",
"vi": "越南文",
"de": "德文",
"ar": "阿拉伯文",
"id": "印尼文"
},
Execute: function (h_onloadfn) {
GM_xmlhttpRequest({
method: "POST",
url: "https://translate.google.com.hk/_/TranslateWebserverUi/data/batchexecute",
headers: {
"Referer": `https://translate.google.com.hk/`,
"Cache-Control": "max-age=0",
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
},
data: "f.req=" + encodeURIComponent(JSON.stringify([
[
["MkEWBc", JSON.stringify([
[Trans.transText, Trans.transOrigLang, Trans.transTargetLang, true],
[null]
]), null, "generic"]
]
])),
onload: function (r) {
setTimeout(function () {
var resData=r.responseText;
var transData=JSON.parse(JSON.parse(resData.match(/\[{2}.*\]{2}/g)[0])[0][2]);
var transList=transData[1][0][0][5];
var transTexts=[];
for (let index = 0; index < transList.length; index++) {
var transItem = transList[index];
transTexts.push(transItem[0]);
}
Trans.transResult.trans = transTexts;
Trans.transResult.orig = transData[1][4][0].split("\n");
Trans.transResult.origLang = transData[2];
h_onloadfn();
}, 300);
},
onerror: function (e) {
console.error(e);
}
});
},
};
//获取sign
function getSign() {
GM_xmlhttpRequest({
method: "GET",
url: "http://fanyi.youdao.com/",
timeout: 5000,
onload: function (ydRes) {
var fanyijsUrlMatch = /',cbscript));
});
GM_registerMenuCommand("设置",function(){
$("div#wordTrans"+randomCode).hide();
Trans.Clear();
Panel.Destroy();
SettingPanel.Create($body,randomCode);
});
};
this.init=function(){
randomCode=DateFormat(new Date(),"yyMM").toString()+(Math.floor(Math.random() * (999999 - 100000 + 1) ) + 100000).toString();
Trans.RegisterEngine();
createStyle();
createHtml();
ShowWordTransIcon();
RegMenu();
};
};
var webTrans=new WebTranslate();
webTrans.init();
})();
如何判断文本内容的语言语种?
遍历所有字符,统计频率最高的语种为文档或者网页的语种,核心代码如下:
function isChinese(temp)
{
var re = /[^\u4e00-\u9fa5]/;
if(re.test(temp)) return false;
return true;
}
function isJapanese(temp)
{
var re = /[^\u0800-\u4e00]/;
if(re.test(temp)) return false;
return true;
}
function isKoera(chr) {
if(((chr > 0x3130 && chr < 0x318F) ||
(chr >= 0xAC00 && chr <= 0xD7A3)))
{
return true;
}
return false;
}
function isContainKoera(temp)
{
var cnt = 0;
for(var i=0;i < temp.length ; i++)
{
if(isKoera(temp.charAt(i)))
cnt++;
}
if (cnt > 0) return true;
return false;
}
function isContainChinese(temp)
{
var cnt = 0;
for(var i=0;i < temp.length ; i++)
{
if(isChinese(temp.charAt(i)))
cnt++;
}
if (cnt > 5) return true;
return false;
}
function isContainChinese2(temp)
{
var cnt = 0;
for(var i=0;i < temp.length ; i++)
{
if(isChinese(temp.charAt(i)))
cnt++;
}
if (cnt > 0 && temp.length<=3) return true;
return false;
}
function isContainJapanese(temp)
{
var cnt = 0;
for(var i=0;i < temp.length ; i++)
{
if(isJapanese(temp.charAt(i)))
cnt++;
}
if (cnt > 2) return true;
return false;
}
当然也可以 截取 一段文本内容发送给 语言 模型 进行识别,但是对于混合文档还是不准确,还不如放在前端做节省计算资源。
看下谷歌翻译之前的实现方式:
<script type="text/javascript" src="http://www.google.com/jsapi"></script >
<script type="text/javascript">
google.load("language", "1");
function initialize()
{
var text = document.getElementById("text").innerHTML;
google.language.detect(text,
function(result)
{
if(!result.error && result.language)
{
google.language.translate(text, result.language, "en",
function(result)
{
var translated = document.getElementById("translation");
if(result.translation)
{
translated.innerHTML = result.translation;
}
});
}
});
}
google.setOnLoadCallback(initialize);
</script>
或者:
<script src="https://translate.google.cn/translate_a/element.js?cb=googleTranslateElementInit"></script>
还有网友改进后的一种方式:
<script src="./el_main.js"></script>
<script src="./el_main.css"></script>
<script>
function googleTranslateElementInit() {
new google.translate.TranslateElement(
{
//这个参数不起作用,看文章底部更新,翻译面板的语言
//pageLanguage: 'zh-CN',
//这个是你需要翻译的语言,比如你只需要翻译成越南和英语,这里就只写en,vi
includedLanguages: 'en,zh-CN,hr,cs,da,nl,fr,de,el,iw,hu,ga,it,ja,ko,pt,ro,ru,sr,es,th,vi',
//选择语言的样式,这个是面板,还有下拉框的样式,具体的记不到了,找不到api~~
layout: google.translate.TranslateElement.InlineLayout.SIMPLE,
//自动显示翻译横幅,就是翻译后顶部出现的那个,有点丑,这个属性没有用的话,请看文章底部的其他方法
autoDisplay: true,
//还有些其他参数,由于原插件不再维护,找不到详细api了,将就了,实在不行直接上dom操作
},
'google_translate_element'//触发按钮的id
);
}
</script>
还用另一个 js 库 去实现的:
<script src="./franc.js">
// import {franc, francAll} from './franc.js'
var ll=franc('Alle menneske er fødde til fridom') //=> 'nno'
console.log(ll);
</script>
依赖的 js 库太大了,不贴出来了,有需要可以留言。
查资料看到还有这种用法的:
<script>
javascript: void((function () {
var script = document.createElement('script');
script.src = '//translate.google.cn/translate_a/element.js?cb=googleTranslateElementInit';
document.getElementsByTagName('head')[0].appendChild(script);
var google_translate_element = document.createElement('div');
google_translate_element.id = 'google_translate_element';
google_translate_element.style = 'position:fixed; bottom:10px; right:10px; cursor:pointer;';
document.documentElement.appendChild(google_translate_element);
script = document.createElement('script');
script.innerHTML = "function googleTranslateElementInit() {" +
"new google.translate.TranslateElement({" +
"layout: google.translate.TranslateElement.InlineLayout.SIMPLE," +
"multilanguagePage: true," +
"pageLanguage: 'auto'," +
"includedLanguages: 'zh-CN,zh-TW,en'" +
"}, 'google_translate_element');}";
document.getElementsByTagName('head')[0].appendChild(script);
})());
</script>
获取网页内容的所有标签的文本内容,过滤非文本标签,实现如下:
<script>
function listen(callback) {
// 获取 HTML 文档中的所有元素,但不包括 下列 选择器的元素
var exclude = ['head', 'pre', 'script', 'textarea']//排除名单
var selectors = []
exclude.forEach((item, index) => {
selectors.push(item)//排除该元素
selectors.push(item + ' *')//排除该元素后代
})
get(document.querySelectorAll('*:not(' + selectors.join(',') + ')'))//*:not(pre,pre *)
// 创建 MutationObserver 对象
let observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
// 遍历新添加的节点
for (let i = 0; i < mutation.addedNodes.length; i++) {
let node = mutation.addedNodes[i];
// 如果节点是元素节点,就调用 get 函数
if (node.nodeType === 1) {
callMyFunction(node)
function callMyFunction(param1) {
setTimeout(function () {
get([...param1.querySelectorAll('*'), param1])
}, 300);
}
}
}
});
});
// 设置 MutationObserver 的参数,表示监听所有元素的变化
let config = {
childList: true,
subtree: true
};
// 启动 MutationObserver
observer.observe(document, config);
function get(elements) {
// 遍历所有元素
for (let i = 0; i < elements.length; i++) {
let element = elements[i];
// 遍历元素的 childNodes
for (let j = 0; j < element.childNodes.length; j++) {
let node = element.childNodes[j];
// 如果当前节点是一个文本节点(nodeType 为 3)且不包含子节点(nodeName 为 '#text'),就将文本添加到数组中
if (node.nodeType === 3 && node.nodeName.toLowerCase() === '#text') {
// 过滤掉文本中的换行符
let text = node.nodeValue
var v = { a: false, b: false }
text.slice(0, 1) == " " ? v.a = true : v.a = false
text.slice(-1) == " " ? v.b = true : v.b = false
text = text.replace(/[\n\t\r]/g, '').trim();
// 如果文本不仅包含空白字符,就将它添加到数组中
if (/\S/.test(text)) {
//不处理只有数字和符号的文本
if (!/^[0-9\+\-\*\/\=><&\!@#\$%\^\*\\(\)\[\]\{\}_,.;',。、;’、]{1,}$/.test(text)) {
//---------------处理
//翻译text
//text = "$" + text
//---------------处理结束--显示
v.a == true ? text = " " + text : text
v.b == true ? text = text + " " : text
if (!element.matches('script,textarea')) {//单元素阻断,白名单
node.nodeValue = text
callback.call({ text: text, node: node, element: element })
} else {
//console.log("位于排除标签列表", element);
}
} else {
//console.log("只有数字和符号的文本", text);
}
}
}
}
}
}
}
let time = null;
var data = []
listen(
function () {
if (time !== null) {
clearTimeout(time);
}
time = setTimeout(async () => {
console.log(data);//抖动结束,开始翻译
var sl = []
data.forEach((item, index) => {//取text
sl.push(item['text'])
});
// var tl = await translation_arr(sl) //返回一个数组[[翻译结果,源语言类型],...*]//使用的谷歌批量翻译API,这里就不提供了
var tl = []
sl.forEach((item, index) => {
tl.push('[ 编辑:' + item + ',' + index + '] ')
});
tl.forEach((item, index) => {
data[index]['node'].origText = data[index]['node'].nodeValue
data[index]['node'].nodeValue = item//更改文本
});
//这里的this指向的是input
}, 500)
data.push(this)
}
)
/* 监听文本节点被点击
document.onselectstart = function (e) {
console.log(e.target,e.target.origText);
}*/
</script>
在网页中自动插入一个 下拉框 用于展示支持的翻译语种,并根据网页内容识别的语种自动选中语种类型:
<script>
// 获取浏览器默认语言
const getBrowserLang = function() {
let browserLang = navigator.language
? navigator.language
: navigator.browserLanguage;
let defaultBrowserLang = "";
if (
browserLang.toLowerCase() === "us" ||
browserLang.toLowerCase() === "en" ||
browserLang.toLowerCase() === "en_us"
) {
defaultBrowserLang = "en_US";
} else {
defaultBrowserLang = "zh_CN";
}
return defaultBrowserLang;
};
console.log(getBrowserLang());
</script>
<script>
var type = navigator.appName; //BOM对象获取浏览器名称
if (type == "Netscape") {
var lang = navigator.language.toLowerCase(); //获取浏览器配置语言,支持非IE浏览器
} else {
var lang = navigator.browserLanguage.toLowerCase(); //获取浏览器配置语言,支持IE5+
};
console.log(lang);
var lang = lang.substr(0, 5); //获取浏览器配置语言前4位
console.log(lang);
/*
极速测试体验,用于审查元素时直接执行的
1. 随便打开一个网页
2. 右键-审查元素
3. 粘贴入一下代码:
var head= document.getElementsByTagName('head')[0]; var script= document.createElement('script'); script.type= 'text/javascript'; script.src= 'http://localhost:8060/static/inspector.js'; head.appendChild(script);
4. Enter 回车键 , 执行
5. 在当前网页的左上角,就出现了一个大大的切换语言了
使用的是 v2.x 版本进行的翻译
*/
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= 'http://localhost:8060/static/translate.js';
script.onload = script.onreadystatechange = function() {
translate.storage.set('to','');
//设置使用v2.x 版本
translate.setUseVersion2();
//SELECT 修改 onchange 事件
translate.selectLanguageTag.selectOnChange = function(event){
//判断是否是第一次翻译,如果是,那就不用刷新页面了。 true则是需要刷新,不是第一次翻译
var isReload = translate.to != null && translate.to.length > 0;
if(isReload){
//如果要刷新页面的话,弹出友好提示
alert('您好,快速体验暂时只能切换其中一种语言进行体验,只是提供效果展示,您可参考接入文档来接入您的项目中进行完整体验及使用。');
}else{
var language = event.target.value;
translate.changeLanguage(language);
console.log("ttttt");
console.log(language);
}
}
translate.listener.start(); //开启html页面变化的监控,对变化部分会进行自动翻译。注意,这里变化区域,是指使用 translate.setDocuments(...) 设置的区域。如果未设置,那么为监控整个网页的变化
translate.execute();
document.getElementById('translate').style.position = 'fixed';
document.getElementById('translate').style.color = 'red';
document.getElementById('translate').style.left = '10px';
document.getElementById('translate').style.top = '10px';
document.getElementById('translate').style.zIndex = '9999999999999';
setInterval(function() {
try{
if(document.getElementById('translateSelectLanguage') == null){
return;
}
document.getElementById('translateSelectLanguage').style.fontSize = '2rem';
document.getElementById('translateSelectLanguage').style.borderWidth = '0.5rem';
document.getElementById('translateSelectLanguage').style.borderColor = 'red';
}catch(e){
//select数据是通过接口返回的
}
},1000);
}
head.appendChild(script);
</script>
不同页面或者不同 js 之间传递数据,粗暴简单一点可以通过如下方式:
window.localStorage.setItem('local_language',translate.language.local);
通过对前端js和后端翻译服务进行了长时间的研究和测试,最终实现的效果可以达到:
1)如果是自己的网站
在网页最末尾, 之前,加入以下代码,一般在页面的最底部就出现了选择语言的 select 切换标签。 其实就这么简单:
<script src="http://localhost:8060/static/translate.min.js"></script>
<script>
// translate.language.setLocal('chinese_simplified');
translate.request.api.host='http://localhost:8060/';
translate.execute();
</script>
或者:
<script src="http://localhost:8060/static/i18n.js"></script>
2)如果是第三方的网站
随便打开一个网页
右键 - 检查(审查元素)〉控制台:
粘贴入以下代码:
var head= document.getElementsByTagName('head')[0]; var script= document.createElement('script'); script.type= 'text/javascript'; script.src= 'http://localhost:8060/static/inspector.js'; head.appendChild(script);
或者:
var head= document.getElementsByTagName('head')[0]; var script= document.createElement('script'); script.type= 'text/javascript'; script.src= 'http://localhost:8060/static/inspector.js'; head.appendChild(script);
Enter 回车键 , 执行
在当前网页的左上角,就出现了一个大大的切换语言,切换试试看。
效果参考:
点击查看
https://blog.csdn.net/u014374009/article/details/135401003
源码及后端翻译服务支持docker一键部署:
点击查看
https://blog.csdn.net/u014374009/article/details/135370222
有任何定制化的需求可以联系作者完成开发。