• 切换语言select选择框的自定义设置

    [TOC] 这里介绍对切换语言的select选择框进行的一系列自定义设置,也就是 [https://res.wang.market/translate/demo.html](https://res.wang.market/translate/demo.html) 中的这个位置:
    ## 指定切换语言选择框在代码中的位置 你想在你页面什么地方显示,就吧下面这个放到哪即可。 ````
    ```` 主要是这个 id="translate" 切换语言的按钮会自动赋予这个id里面。当然你也不一定非要是div的,也可以这样 ```` ```` 另外,如果您网页中不存在任何元素的id为translate时, translate.js 会自动创建一个 ````
    ```` 用来显示语言切换 ## 美化切换语言按钮 可使用css来控制切换语言选择的显示位置及美观。如: ```` ```` 这就是控制切换语言的 `` ```` 那么设置如下: ```` translate.element.tagAttribute['input']={ attribute:['value','data-value'], condition:function(element){ if(typeof(element.disabled) != 'undefined' && element.disabled == true){ return true; }else{ return false; } } }; ```` 其中, **condition** 便是条件判断,只有当返回的布尔值是true时,才会对上面设置的 attribute 进行翻译,否则并不会对当前设定标签的 attribute 进行任何翻译操作。 function 方法接收的 element 是当前扫描到要进行判断的元素 比如这里是 translate.element.tagAttribute['input'] 那这个 element 参数便是扫描到的具体的 input 元素 可以针对 element 这个当前元素本身来进行判定,来决定是否进行翻译。 如果返回 false,则不对 attribute中设置的 ['value','data-value'] 这两个input 的属性的值进行任何操作 ## 注意 * 这行要加在 ````translate.execute();```` 前面 * 需要 translate.js v3.17.9.20250729 及以上版本才支持此设置
  • 本地语种也进行强制翻译

    比如,正常情况下,网页设置的本地语种是简体中文, 但是网页中也有一段英文, 我们当翻译时切换为中文观看,也就是要以中文显示 默认的情况下,整个页面是不会被任何翻译的,也就是有的那段英文也不会进行任何翻译,依旧是显示英文。 如果你想切换为中文时,即使本地语种设置的是中文,网页中只要不是中文的元素,都会被翻译为要显示的语种,也就是都会被翻译为中文,那可以这么设置: ```` translate.language.translateLocal = true; ```` ## 注意 1. 这行要放到 translate.execute(); 上面 2. 需要 translate.js v3.12.0.20241210 及更高版本才支持
  • 自定义通过翻译API进行时的监听事件

    [TOC] 当 translate.execute() 触发执行翻译时,它会先从 [浏览器缓存](4026.html) 中取,如果有则会直接从缓存中将翻译结果拿出来渲染到页面上,以做到瞬间翻译。 但是如果有的在本地没有缓存时,这部分没有缓存的文字将会通过API的方式进行请求翻译接口进行翻译。而这种方式毕竟是网络请求,考虑到网络延迟以及翻译API的执行耗时,这个可能要消耗0.5~2秒的时间才会完成翻译。 这样在用户(使用者)看来,就是页面先显示了原本的语种1秒,然后才会翻译成用户需要的语种。 而本文章则是针对这个过程,来进行自定义监听做一些你想做的事情。 # 两个触发事件 ### 1. 请求翻译API之前触发 已经扫描完整个DOM,并且经过了一系列处理,拿到最终要通过翻译API接口进行翻译的文本,进行向API接口发送网络请求之前,触发,触发这个后会立即向翻译API发送网络请求。 ```` translate.listener.execute.renderStartByApi.push(function(uuid, from, to){ console.log('这里你可以做一些自己的自定义操作'); }); ```` ### 2. 请求翻译API完成并在DOM渲染完毕后触发 也就是在也面上被翻译的元素的内容,已经完全被翻译过来(眼睛已经能看到文字被翻译过来)之后,才会触发。 ```` translate.listener.execute.renderFinishByApi.push(function(uuid, from, to){ console.log('这里你可以做一些自己的自定义操作'); }); ```` # 使用说明 ### 1. 参数说明 上面两个事件都是传入了一个自定义方法 ```` function(uuid, from, to){ ... } ```` 其中有个uuid的参数,可以用这个来取得当前传入到翻译API的文本以及所设计到的DOM节点。 可以这样来取 uuid 对应的相关数据: ```` translate.nodeQueue[uuid] ```` 打印出来可以看到: ![](https://translate.zvo.cn/fileupload/2025/02/20/bb837b21755a4db782527b5310ccbdb3.png) 需要注意的是,当前我执行的是将当前页面翻译为英文的操作。 上图可以看到 list 下有 简体中文、也有英文。 因为我们是要翻译为英文,也就是 上图中 english 的数组部分它只是被扫描出来了,但它并不会实际参与进翻译中去的,也就是在通过翻译API进行翻译的文本中,是不包含 list[english] 这个的。 也就是当前触发我们function 这个方法的翻译元素,实际是: ```` translate.nodeQueue[uuid].list[from] ```` 也就是展开其中某个语种,可以看到: ![](https://translate.zvo.cn/fileupload/2025/02/20/6919c60e42d84b8bb30960f2d3fda983.png) 也就是 如果你想获得参与当前翻译的实际的文本,可以从 ````translate.nodeQueue[uuid].list[from][遍历集合].translateText```` 取得; 如果你想获得参与当前翻译的原本DOM中的文本,可以从 ````translate.nodeQueue[uuid].list[from][遍历集合].original```` 取得; 如果你想获得参与当前翻译的node节点,可以从 ````translate.nodeQueue[uuid].list[from][遍历集合].nodes```` 取得; 另外有关uuid的解释: 页面可能会触发多次翻译,每执行一次翻译,就会生成一个uuid,来存储跟当前执行的翻译相关的数据,不至于翻译执行多了使数据产生错乱。 **注意**,请不要直接对 ````translate.nodeQueue```` 的数据进行操作,你只可以读,不可以写。避免造成数据错乱。你想对数据处理,可以读出数据来后自行创建一个变量进行赋予,处理你自己定义的变量。 ### 2. 可触发多次 触发可以触发多次,并不是只能触发一次,比如你可以这样写: ```` translate.listener.execute.renderStartByApi.push(function(uuid, from, to){ console.log('111'); }); translate.listener.execute.renderStartByApi.push(function(uuid, from, to){ console.log('222'); }); translate.listener.execute.renderStartByApi.push(function(uuid, from, to){ console.log('333'); }); ```` 这个 111、222、333 都会被打印出来。至于它的执行顺序,则是跟代码的顺序一样,先打印 111、在打印 222、在打印 333 ,因为你代码的顺序就是这样的,它跟你代码的顺序是保持一致的。 ### 3. 根据源语言不通进行多次触发 正常情况下,是根据本地语言不同,进行分别请求翻译的,比如本地中包含中文、英文、俄语三种语种,要翻译为韩语,那么 * 中文->韩语会请求一次api * 英文->韩语会请求一次APi * 俄语->韩语会请求一次APi 也就会触发三次 ## 使用示例 - 控制按钮显示文字 这个示例的实际场景是,网页中有个按钮 ````
  • 对某个句子中的某个单词进行翻译替换-文本处理

    这个主要是给开发使用的。 1. 它能自动根据你最终的语种不同,根据翻译的单词跟上下文的联系,来判断是否给翻译的单词前、后追加空格等操作。 1. 它可以对句子中,出现多个位置的同一个单词进行全部翻译替换处理。 使用方法为: ```` translate.language.textTranslateReplace(text, translateOriginal, translateResult, 'english'); ```` **text**: 原始文本,翻译的某句或者某个词就在这个文本之中 **translateOriginal**: 翻译的某个词或句,在翻译之前的文本 **translateResult**: 翻译的某个词或句,在翻译之后的文本,翻译结果 **language**: 显示的语种,这里是对应的 translateResult 这个文本的语种。 也就是最终替换之后要显示给用户的语种。比如将中文翻译为英文,这里也就是英文。 这里会根据显示的语种不同,来自主决定是否前后加空格进行分割。 另外这里传入的语种也是 translate.js 的语种标识 **方法返回**:将翻译处理好的文本返回。 实际调用使用示例: ```` var text = '你世好word世界'; var translateOriginal = '世'; var translateResult = 'shi'; //翻译结果 translate.language.textTranslateReplace(text, translateOriginal, translateResult, 'english'); ```` 运行后,如下图: ![](https://translate.zvo.cn/fileupload/2025/03/10/851cf65380b94b9f9197c04308e14a20.jpg) ## 注意 需要 translate.js v3.13.13.20250310 及以上版本
  • 启用翻译中的遮罩层

    在执行翻译时,浏览器本地缓存没有,需要走API接口时,这个API接口会有网络延迟,比如有1、2秒延迟的话,然后等翻译API拿到结果后再显示到网页,对用户来说,他看到的就是先出现原语种一两秒,然后又变成了翻译后的文本。 本能力就是解决这个问题,在翻译的这段时间,会在原语种的元素上面显示一层加载中的动画效果,让用户知道这段文本正在进行处理中。 而不需要走翻译API接口的部分,则不会显示这个加载中的动画效果。 它并不会影响你本身网页的阅读观看,它的作用是给用户一个友好提示,免得让用户感觉是你网页有问题。 ## 使用方式 #### 简单使用 增加一行代码,用以标记启用此能力: ```` translate.progress.api.startUITip(); ```` #### 高级使用 如果你对翻译中的遮罩层加载中的动画样式美观度不满意,你还可以自定义样式,自定义方式为: ```` translate.progress.style=` /* CSS部分 */ /* 灰色水平加载动画 */ .translate_api_in_progress { position: relative; overflow: hidden; /* 隐藏超出部分的动画 */ } /* 蒙版层 */ .translate_api_in_progress::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 1); /* 半透明白色遮罩 */ z-index: 2; } /* 水平加载条动画 */ .translate_api_in_progress::before { content: ''; position: absolute; top: 50%; left: 0; width: 100%; height:100%; /* 细线高度 */ background: linear-gradient( 90deg, transparent 0%, #e8e8e8 25%, /* 浅灰色 */ #d0d0d0 50%, /* 中灰色 */ #e8e8e8 75%, /* 浅灰色 */ transparent 100% ); background-size: 200% 100%; animation: translate_api_in_progress_horizontal-loader 3.5s linear infinite; z-index: 3; transform: translateY(-50%); } @keyframes translate_api_in_progress_horizontal-loader { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } `; translate.progress.api.startUITip(); ```` 你可以更改其中的 ````translate.progress.style```` 的css样式,来自定义当文本翻译中时,文本的css显示效果 ## 注意 1. 它要放在 ````translate.execute();```` 的前面 2. 需要 translate.js v3.18.89.20251031 及更高版本才支持 3. 使用大模型翻译的场景,此能力尤其明显。
  • 对JS对象及代码进行翻译

    [TOC] 可对JavaScript 对象、以及 JavaScript 代码进行翻译。 ## 在线体验 http://res.wang.market/translate/jsObjectTranslateDemo/demo.html ![](https://translate.zvo.cn/fileupload/2025/05/09/b9c893a19da347f09a06ef83c02d82f0.png) ## 使用示例 #### 对JavaScript代码进行翻译 ```` var str = ` { "hello":"你好", "word":"单词", "你是谁": [ "世界", "大海" ] } `; translate.js.transString( str, 'english', function(obj){ console.log(obj); }, function(failureInfo){ console.log(failureInfo); } ); ```` #### 对JavaScript对象进行翻译 ```` var obj = { "hello":"你好", "word":"单词", "世界":["世界","大海"] }; translate.js.transObject( obj, 'english', function(obj){ console.log(obj); }, function(failureInfo){ console.log(failureInfo); } ); ```` ## 注意事项 1. client.edge 模式不支持此能力,必须使用 translate.service 模式 2. translate.js 3.15.2 及更高版本才支持
  • 网络请求自定义附加参数

    ## 追加请求参数 ```` translate.request.appendParams = { key1:'key1', key2:'key2' } ```` 所有通过 translate.request.send 进行网络请求的(也就是 translate.js 所发起的所有网络请求),都会追加上这个参数。 效果: ![](https://translate.zvo.cn/fileupload/2025/05/27/61e0b93d75d44daabdf5076a2f5fd438.png) ## 追加 header 请求头参数 ```` translate.request.appendHeaders = { key1:'key1', Aauthorization:'Bearer xxxxxxxxxx' } ```` ## 注意 1. translate.js版本需要 v3.15.13 及更高版本 2. 需要放到 translate.execute(); 的前面
  • 网络请求数据拦截并翻译

    当用户触发ajax请求时,它可以针对ajax请求中的某个参数,进行获取,并进行翻译,将翻译后的文本赋予这个参数,然后再放开请求。 1. 它可以针对 xhr、 fetch 方式的网络请求生效。 1. 它可以针对 get、post 方式的请求生效。 ## 使用场景 搜索场景,原本是中文的页面,翻译为英文后,给美国人使用,美国人使用时,进行搜索,输入的是英文,然后点击搜索按钮,发起搜索。 然后此会拦截网络请求,将请求中用户输入的搜索文本的内容提取出来,识别它输入的是中文还是英文,如果不是本地的语种中文,那就将其翻译为中文,然后再赋予此请求的这个参数中,然后再放开这次请求。 这样请求真正到达服务端接口时,服务端接受到的搜索的文本内容实际就是翻译后的中文文本,而不是用户输入的英文文本。 ## 使用方式 ```` translate.network.rules = [ { url: /https://www.guanleiming.com/a/b/.html/, methods: ['GET', 'POST'], params: ['a','b1'] }, { url: /https://www.guanleiming.com/c/d/.html/, methods: ['GET'], params: ['a','b1'] }, ]; translate.network.use(); //启用 ```` translate.network.rules 设置的是一个规则数组,每个数组有三个参数: * **url** js的正则表达式形式,如果网络请求的url (不包含get参数部分)跟此匹配,那便会进行翻译。 注意,这个是正则形式,并不是字符串形式!比如你想匹配 ````http://www.guanleiming.com/a.jsp```` 那你可以在浏览器控制台用这个来测试是否匹配: ````/http://www.guanleiming.com/a.jsp/.test('http://www.guanleiming.com/a.jsp')```` 输出true,那便是证明匹配了。 ![](https://translate.zvo.cn/fileupload/2025/06/03/04af99855ad648d682747754f99f4652.png) * **methods** 限制网络请求的方式 * **params** 要翻译的参数名,如果这里面出现的参数名有值,那会判断这个值是否需要翻译(参考下面的 自动进行翻译的触发条件),便会自动进行翻译,并将翻译的值赋予当前网络请求,并放行当前网络请求。 因为 translate.network.rules 这是一个数组形态,凡事符合其中任意一个规则,都会触发拦截翻译。 此设置建议放在 ````translate.execute();````的上面。 ## 自动进行翻译的触发条件 1. 当前用户有进行切换语言,比如本地语种设置了简体中文,你当前切换为英文进行浏览时。 2. 请求中某个参数的值,其文本语言跟本地语种不一致,比如本地语种是简体中文,而参数的值的文本是英语。 3. 设置的 translate.network.rules 匹配上 这三种情况都满足时,才会进行拦截并翻译这个指定参数的值 ## 版本 需要使用 translate.js v3.15.12.20250603 及更高版本
  • 翻译排队执行

    当网页中执行 ````translate.execute();```` 时,会触发一次对当前页面的扫描并翻译。 但是为了避免有的开发者图省事以比较暴力的方式,比如弄个循环执行的定时器,每间隔1秒执行一次翻译; 又或者代码调用时有错误使用,导致非常频繁的去执行扫描及翻译的情况。 这种极其频繁的执行 ````translate.execute();```` 会造成以下影响: 1. 极大占用浏览器本身的计算资源,如果你页面非常大,可能会使页面出现稍微卡顿情况。 1. 频繁调用后端的翻译接口,如果使用我们开源的翻译接口,会容易触发流控策略被拦截(我们会以为你在非法使用),禁止你使用。 上面两个中,主要是第二个,一旦触发流控,那用户使用时,访问页面,直观的感受就是,页面的文字不翻译了。为了保护我们的开源后端翻译服务接口,也为了更好的兼容你的各种花样的使用方式,所以默认内置了翻译执行的排队能力。 当你同一时间多次触发 ````translate.execute();```` 时,第一次会立即执行扫描并翻译,第二次时会先看看上一次是否执行完毕,如果还未执行完毕,那么第二次并不会立即触发,而是进入一个队列等待阶段,包括第三次、第四次,都会进入排队阶段。 当第一次的执行完毕后,第二次的才会进行扫描并翻译,完事后,第三次、第四次 才会依次触发执行。 这样极大保护了后端翻译接口,同时也能保障你不会被翻译接口的流量控制策略命中被封禁使用,保障使用的稳定。 但是还有一种情况,你私有部署了 [translate.service](391129.html) 并且你也设置了 [访问控制策略](413975.html) 的并发数很大,比如 1秒 100次,完全不用考虑并发太快的情况,而且也只是你自己用,不用担心别人恶意使用,你完全可以将 translate.js 中这个排队等待的策略禁用,只要执行 ````translate.execute();```` 就立即进行翻译,会更好的提高用户体验。 ## 设置方式 ```` translate.waitingExecute.use = false; ```` 默认是true, 当你设置为false时,则是禁用排队等待的能力,触发````translate.execute();````时会立即进行翻译。即使你同一时间连续触发了三次,也会立即执行三次。 注意,此种能力仅仅只是你私有部署,或者你朋友私有部署后给你用时,你可以禁用排队翻译的能力。不然你很容易触发别人的翻译API的访问控制规则,把你给禁止使用。 ## 版本 仅限 v3.16 及以上版本
  • 获取翻译区域显示的原始文本

    获取翻译区域的原始文本,翻译前的文本。 这里会把空白符等过滤掉,只返回纯显示的文本 也就是获取 translate.setDocument(...) 定义的翻译区域中,翻译前,要参与翻译的文本。 其中像是 translate.ignore.tag 这种忽略翻译的标签,这里也不会获取的,这里只是获取实际要参与翻译的文本。 ```` var text = translate.language.getTranslateAreaText(); ```` ## 案例 要对 gitee 中的 readme 区域进行提取文本,以便用来判定readme中出现的中文、英文、各种语种的比例。 比如这个页面: ![](https://translate.zvo.cn/fileupload/2025/07/05/bdad2479b02748e48b07ed8a8c7680b6.png) 已经设置了只翻译 readme 的区域 : ```` const dom = document.getElementsByTagName('blob-markdown-renderer') translate.setDocuments(dom); ```` 那么执行此 ```` translate.language.getTranslateAreaText(); ```` 控制台可看到: ![](https://translate.zvo.cn/fileupload/2025/07/05/e8217ed1ac74471ea62ef466f8a68e12.png) ## 注意 1. 需要 translate.js v3.17.1.20250705 及更高版本 1. 这个是为二次开发考虑,进行扩展开发使用的。正常使用翻译这个是用不到的
  • 重写语种识别策略

    这个语种识别,它的影响范围: 1. 你没有设置本地语种,它自动识别你的本地语种是什么 2. 当启用了 [元素整体翻译能力](4078.html) 后,它自动识别你网页中每个元素的内容是什么语种 3. 当使用 [识别字符串语种及分析 translate.language.recognition('xxx')](4083.html) 比如,一个元素中的文本为: ```` 使用场景:Can be used to obtain application user access credentials ```` 按照我们的正常方式判定,它会被判定为英语。 但是你需要实现这个需求: 如果页面中出现 中英文共存的场景,统一都认为是中文,当切换翻译为英文时,这种中英文共存的元素都要被翻译为英文。 这时需要修改语种识别的策略,修改方式为: ```` /* 语种识别策略 str 要识别的字符串 data 对于str字符串识别的结果,格式如: { languageName: 'english', languageArray:[ english:[ list[ {beforeText: ' ', afterText: ' ', text: 'hello word'}, {beforeText: ' ', afterText: ' ', text: 'who?'}, ], number:12 ], japanese:[ ...... ] ] } 有关这里面具体参数的说明,参考 translate.language.recognition 的说明 languagesSize key:语言名, value:语言字符数 allSize 当前所有发现的语种,加起来的总字符数,也就是 languagesSize 遍历所有的value相加的数 最后,要 return data; */ translate.language.recognitionAlgorithm = function(str, data, languagesSize, allSize){ /* 如果简体中文跟英文一起出现,那么认为当前是简体中文 */ if(typeof(languagesSize['chinese_simplified']) != 'undefined' && typeof(languagesSize['english']) != 'undefined'){ //设置当前识别结果是简体中文 data.languageName = 'chinese_simplified'; } return data; } ```` ## 注意 1. 需要 translate.js v3.17.2.20250705 及更高版本 1. 这个是为二次开发考虑,进行扩展开发使用的。正常使用翻译这个是用不到的 1. 使用时,要放在 translate.execute() 前面
  • 默认网络请求的自定义控制

    这里针对 translate.js 自带的默认的一些网络请求进行相关控制 比如页面一打开后, translate.js 会自动进行初始化相关接口请求 /init.json ,获取当前支持的语种列表 language.json ,进行多节点测速的 connectTest.json 等,这些如果不想让他发起这些网络请求,将其设置为空字符串即可,如: ```` translate.request.api.language = ''; translate.request.api.ip = ''; translate.request.api.connectTest = ''; translate.request.api.init = ''; translate.request.api.translate = ''; ```` 如果哪个不想发起网络请求,便将其设置为空字符便可,这样就不会再发起网络请求了。 ## 每个请求的解释 #### translate.request.api.language 获取当前翻译服务所支持的语种,支持翻译哪些语种。 这是一个语种列表。 #### translate.request.api.ip 它是配合 [自动切换为用户所使用的语种](4065.html) 来使用的。 自动切换为用户所使用的语种,首先会根据用户本身浏览器默认语种来自动切换,如果某些很小的情况没有获取到,才会触发通过这个接口,来获取用户所在哪个国家,然后根据哪个国家使用哪个语种比较多,来切换为这个语种。 也就是这个接口它实际使用率是很低的,可能有千分之一的几率。 #### translate.request.api.connectTest translate.js 的自动测速能力,translate.js 支持介入多个独立的网络节点,当用户打开某个网页时,网页中会自动初始化去各个网络节点测速,采用速度最快的可用的网络节点来接入翻译能力。 #### translate.request.api.init translate.js 启动后的一些初始化,比如判定当前translate.js 的版本号、当前可用的 translate.service 服务等。 当然,多数时候这个请求是并不会对translate.js的使用产生实质性作用的。 #### translate.request.api.translate 如果你的离线翻译缓存没有命中的话,它还是会发起这个翻译的网络请求进行。但是如果你设置了 ```` translate.request.api.translate = ''; ```` 那么即使有需要进行通过后端翻译服务进行翻译的文本,因为设置不允许使用,所以文本也不会通过网络传输进行翻译。 如果你审查元素,查看网络请求一栏,会发现 /translate.json 请求是根本就没有这个请求的。 ## 其他场景示例:进行了网络转发,翻译的请求路径完全变了 比如经过API网关或者Nginx 进行网络转发,请求路径完全变了,比如正常翻译的网络请求是: ```` http://12.12.12.12/translate.json ```` 但是你经过网络转发后,它的实际请求URL变成了: ```` http://12.12.12.12/fanyi/trans.php ```` 这里,可以看到,路径、文件名完全变了,这样需要进行设置: ```` translate.request.api.host = ['http://12.12.12.12/fanyi/']; //设置请求路径,详细可参考 http://translate.zvo.cn/4068.html translate.request.api.translate = 'trans.php'; //设置请求的url的文件名 ```` ## 设置不请求language.json时,默认的切换语言下拉框没了 这种场景多数是在一体机的场景,小型一体机,不会再额外去在一体机本身去部署 translate.service 服务,避免产生大的性能消耗。 但是有网环境下,开发时能正常通过语言切换的select切换语言,但是一体机中设置了不发起 language.json 请求,也就不会再返回支持的语种列表, 界面的select切换语言的入口自然也没了, 但是还需要这个进行切换语言,这是可以通过手动指定当前指定的切换语言的形式,来进行设定,比如这个小型一体机设备需要支持中文、韩语两种语言的切换,那么可以这么设置: ```` translate.request.api.language = [{id: "chinese_simplified", name: "简体中文"},{id: "korean", name: "한국어"}]; ```` 这样它便可以继续出现有网络环境时所正常看到的 select切换语言 了,不过可切换的语言就只有所设置的简体中文、韩语 这两个。 ## 注意 1. 需要 translate.js v3.17.8.20250724 及更高版本 1. 使用时,要放在 translate.execute() 前面
  • 进行翻译的生命周期监控及触发

    [TOC] ## 当用户点击切换语言时触发 当用户点击切换语言时,立即触发,然后再进行切换语言。 点击切换语言后,实际触发的是 ````translate.changeLanguage('english');```` 这里便是在调用它后,立即触发,触发完成后再执行原本的语言切换。 设置方式: ```` translate.lifecycle.changeLanguage.push(function(to){ }); ```` * **to** 翻译为的语种,如 japanese 这里需要注意的是,如果当前是第一次切换语言,那么它会直接将当前原文翻译进行切换,这期间并不会刷新页面; 而切换了一次后,再进行一次切换其他语言时,他会触发刷新页面,这时也就是先触发 ````translate.lifecycle.changeLanguage```` 设置的,然后再刷新页面。 [有关为什么第二次切换语言会刷新页面的解释,可点此查看](4035.html) ## 当执行翻译时触发 当执行 ````translate.execute();```` 之后,它会进行一下操作: 1. 进行一些初始化及检测,如果不达标则直接终止不做任何处理,同时也不会触发任何下面的事件。 1. 进行图片翻译 1. 对要翻译的区域的所有节点进行扫描,识别出需要进行翻译的文本,进行收集分析,加入待翻译的文本队列 1. 对待翻译的文本队列中的翻译文本进行本地浏览器缓存命中处理,如果本地缓存全部命中了,那也就没有后面的网络请求什么事了 1. 对本地浏览器缓存命中之后,没有被缓存命中,未进行翻译的文本,进行通过请求网络接口的方式进行翻译处理,发起网络请求,将要翻译的文本发送到翻译服务进行翻译,等待拿到翻译结果后,进行翻译。(这个会产生 50ms ~ 10s 的时间差,也是造成视觉上翻译速度快慢的最根本原因) 1. 完毕 以下提供的几个针对其生命周期中的某个特定点,提供监控及主动触发你自定义的方法,来做一些事情。 #### 翻译触发 每当触发执行 translate.execute() 时,会立即触发此。 这个触发是指在所有判断之前,也就是只要 触发了 translate.execute() 会立即触发此,然后在进行执行其他的。 设置方式: ```` translate.lifecycle.execute.trigger.push(function(data){ console.log(data.uuid); }); ```` * **uuid** translate.nodeQueue[uuid] 这里的唯一标识,每次执行 translate.execute() 时都会创建一个针对此的uuid唯一标识 * **to** 翻译为的语种,如 japanese * **docs** 参与翻译的元素节点数组。 当前触发 translate.execute() 要进行翻译的元素。 比如单纯触发执行 translate.execute() 、translate.request.listener.start() 那么这里 docs 则是 通过 translate.setDocuments(...) 所设置的元素。 如果没有使用 translate.setDocuments(...) 设置过,那就是翻译整个html页面。 如果是 translate.listener.start(); 监控页面发生变化的元素进行翻译,则这里的docs 则是发生变化的元素 * **executeTriggerNumber** 整数型,当前触发 translate.execute() 执行,属于打开页面后第几次执行 translate.execute() , 它不会经过任何初始化判断,只要触发了 translate.execute() 就会立即+1,即使初始化判断当前不需要翻译、或者当前正在翻译需要排队等待,它依旧也会+1 * **返回值** 它有返回参数,boolean 类型: * true 则是继续执行 translate.execute() * false 则是不继续执行,直接终止本次的 translate.execute() 也就是后面的 translate.lifecycle.execute.start 都不会执行到,不会触发。 * 如果钩子没有任何返回值,则默认是 true * 如果本钩子有多个实现,其中某个实现返回 false,它不会阻止 translate.lifecycle.execute.trigger 的其他钩子执行,其他的 translate.lifecycle.execute.trigger 钩子实现也都会触发执行。 只不过里面只要其中有一个是返回 false,那么 translate.execute() 都会终止,并且终止后也会触发 translate.lifecycle.execute.finally 执行结束的钩子。 * 示例: 比如,如果发现目标语种是英语,则终止翻译: ```` translate.lifecycle.execute.trigger.push(function(data){ if(data.to === 'english'){ return false; } }); ```` **扩展用法 - 当用户打开页面后,第一次触发 translate.execute() 时,进行触发** ```` translate.lifecycle.execute.trigger.push(function(data){ if(translate.executeTriggerNumber === 1){ console.log('这是打开页面后,第一次触发 translate.execute() ,因为translate.executeTriggerNumber 记录的是translate.execute() 触发的次数。'); } }); ```` #### 翻译开始 每当触发执行 translate.execute() 时,会先进行当前是否可以正常进行翻译的判定,比如 当前语种是否就已经是翻译之后的语种了是否没必要翻译了等。(这些初始判定可以理解成它的耗时小于1毫秒,几乎没有耗时) 经过初始的判断后,发现允许被翻译,那么在向后执行之前,先触发此。 也就是在进行翻译之前,触发此。 设置方式: ```` translate.lifecycle.execute.start.push(function(data){ console.log(data.uuid); }); ```` * **uuid** translate.nodeQueue[uuid] 这里的唯一标识,每次执行 translate.execute() 时都会创建一个针对此的uuid唯一标识 * **to** 翻译为的语种,如 japanese #### 发起网络请求前 每当触发执行翻译动作 translate.execute() 时,当缓存中未发现,需要请求翻译API进行翻译时,在发送API请求前,触发此 ```` translate.lifecycle.execute.translateNetworkBefore.push(function(data){ console.log(data.uuid); }); ```` * **uuid** translate.nodeQueue[uuid] 这里的唯一标识,每次执行 translate.execute() 时都会创建一个针对此的uuid唯一标识 * **from** 来源语种,翻译前的语种,如 english * **to** 翻译为的语种,如 japanese * **texts** 要翻译的文本,它是一个数组形态,是要进行通过API翻译接口进行翻译的文本,格式如 ````['你好','世界']```` * **nodes** 要翻译的文本的node集合,也就是有哪些node中的文本参与了 通过API接口进行翻译文本,这里是这些node。 格式如 [node1, node2, ...] #### 发起网络请求后 每当触发执行翻译动作 translate.execute() 时,当缓存中未发现,需要请求翻译API进行翻译时,在发送API请求后,也就是拿到 API响应、或网络请求失败后,立即触发此 ```` translate.lifecycle.execute.translateNetworkAfter.push(function(data){ console.log(data.uuid); }); ```` * **uuid** translate.nodeQueue[uuid] 这里的唯一标识,每次执行 translate.execute() 时都会创建一个针对此的uuid唯一标识 * **from** 来源语种,翻译前的语种,如 english * **to** 翻译为的语种,如 japanese * **texts** 要翻译的文本,它是一个数组形态,是要进行通过API翻译接口进行翻译的文本,格式如 ````['你好','世界']```` * **nodes** 要翻译的文本的node集合,也就是有哪些node中的文本参与了 通过API接口进行翻译文本,这里是这些node。 格式如 [node1, node2, ...] * **result** 本次网络请求的结果, 1成功, 0失败。 网络不通,翻译结果失败(translate.json返回result非1)都是记入0 * **info** 如果result为0,这里是失败信息 **说明**: 1. 不管网络请求是否成功,它都会被触发 1. 不管翻译结果是否成功,它都会被触发 1. 在网络请求完毕后立即触发,不会再有其他时间损耗。也就是它是在网络请求完毕后,渲染UI页之前就会被触发。 #### 翻译完成 translate.execute() 的翻译渲染完毕触发。 这个完毕是指它当触发 translate.execute() 进行翻译后,无论是全部命中了本地缓存,还是有部分要通过翻译接口发起多个网络请求,当拿到结果(缓存中的翻译结果或多个不同的有xx语种翻译的网络请求全部完成,这个完成是包含所有成功跟失败的响应),并完成将翻译结果渲染到页面中进行显示后,触发此 它跟 translateNetworkFinish 的区别是, translateNetworkFinish 仅仅针对有网络请求的才会触发,而 renderFinish 是无论何种情况,只要 translate.execute() 执行完毕都会触发。比如全部命中了浏览器本地缓存,无需发起任何网络翻译请求这种情况时,也会触发。 ```` translate.lifecycle.execute.renderFinish.push(function(uuid, to){ }); ```` * **uuid** translate.nodeQueue[uuid] 这里的唯一标识,每次执行 translate.execute() 时都会创建一个针对此的uuid唯一标识 * **to** 翻译为的语种,如 japanese **实际使用场景示例:** 比如,我有一个中文网站,翻译为英文浏览时,要做到完全不显示中文的文字内容,不出现先显示中文然后瞬间在显示英文的情况。 **操作方式:** 首先,在原本中文网站加载后,先用CSS显示一个遮罩层,将原本显示中文的部分遮罩起来,在遮罩层上,用英文显示一个提示信息,比如 ````
    loading...
    ```` 然后在 ````translate.execute();```` 的前面,增加一个翻译完成的监控,以便在翻译完成后,来触发将 loading... 给隐藏掉 : ```` translate.lifecycle.execute.renderFinish.push(function(uuid, to){ document.getElementById('load').style.display='none'; }); ```` 这样就实现了打开网页后,先在页面的中文上面出现个英文提示 loading... 给用户一个友好的提示,当翻译执行完毕后(页面的中文已经改成了英文)将 ````
    ```` 这个id元素隐藏,将loading... 的提示隐藏,将英文的页面显示出来。 **其实这个示例就仅仅只是一个示例,你如果想要达到完全不显示源语言文字的效果,可以参考 [网页打开时自动隐藏文字,翻译完成后显示译文](549731.html) 这里有现成的功能可以直接拿来达到这个效果。** #### 执行结束 每当 translate.execute() 执行结束、中止、自检不通过跳出 ... 等,都会触发这个。 注意,不管在 translate.execute() 是否自检通过、不管是否进行了翻译、不管文本翻译API接口是否拿到翻译结果,只要 translate.execute 执行完毕或触发了什么自检不通过不再往下执行,都会触发这个。 这个仅仅只是用于 translate.execute() 从上而下执行完跳出时,进行触发的。 ```` translate.lifecycle.execute.finally.push(function(data){ console.log(data.uuid); }); ```` data 参数: * **uuid** translate.nodeQueue[uuid] 这里的唯一标识,每次执行 translate.execute() 时都会创建一个针对此的uuid唯一标识。如果当前没有进行正常翻译,比如自检失败不在执行跳出了,那这个将会返回空字符串 '' * **to** 翻译为的语种,如 japanese。 如果当前没有进行正常翻译,比如自检失败不在执行跳出了,那这个将会返回空字符串 '' * **state** 是何种状态执行结束的。整数型,取值有: * **2** 自定义的translate.lifecycle.execute.trigger钩子返回了false,终止继续执行时触发的 * **4** 当前翻译未完结,新翻译任务已加入等待翻译队列,待上个翻译任务结束后便会执行当前翻译任务 * **6** 没有指定翻译目标语言,不翻译 * **8** 本地语种跟要翻译的目标语种一样,且没有启用本地语种也强制翻译,那么当前不需要执行翻译,退出 * **16** 已经匹配完自定义术语跟离线翻译,但是用户设置了不掉翻译接口进行翻译,不在向后执行通过文本翻译接口进行翻译 * **18** 已经匹配完自定义术语跟离线翻译,此时所有要翻译的文本都已经匹配完了,没有在需要通过文本翻译接口进行翻译的了 * **21** 进行通过文本翻译API进行调用接口翻译时,某个语种的数据校验失败导致退出。 这个情况理论上应该不会出现,预留这个情况,后续将会剔除这个状态 * **25** 已通过文本翻译接口发起所有翻译请求,translate.execute 执行完毕。 (只是发起网络请求,不代表翻译完成,因为这里还没有等着拿到网络请求的响应结果,还处于网络请求的过程中) * **triggerNumber** translate.execute() 方法已经被触发过多少次了, 只要 translate.execute() 被触发,它就会在触发时立即 +1 (translate.execute() 默认是同一时刻只能执行一次,这个触发是在这个同一时刻执行一次的判定之前进行++ 的,如果这个同一时刻执行一次不通过,还有其他在执行,进入排队执行时,这里也会++ ,当从排队的中顺序排到进行执行时,又会执行++ ) 。 当页面打开第一次触发执行translate.execute(),这里便是 1 **注意** 它触发的可能会非常多,比如如果你启用了 [translate.listener.start();](4067.html) 、 [translate.request.listener.start();](4086.html) ... 等,都会自动触发此 translate.execute() #### 注意 1. 需要 translate.js v3.18.55.20250928 及更高版本 2. 需要设置在 ````translate.execute()```` 前面 3. 这里的监听仅仅针对网页正常翻译,也就是 ````translate.execute()```` 、 ````translate.changeLanguage(...)```` 、以及设置动态监控网页变化、动态监控网络请求后触发的翻译,会触发这里。 但是像是扩展使用如 [translate.request.translateText(...) 手动调用翻译接口执行翻译操作](4077.html) 这个是会对他生效的,它不会触发以上的监听。
  • 网页打开时自动隐藏文字,翻译完成后显示译文

    ## 场景 网页加载,且要进行翻译时,翻译之前,隐藏当前网页的文本。 当点击切换语言按钮后,会刷新当前页面,然后再进行翻译。 这时会出现这种现象:刷新当前页面后,会先显示原本的文本,然后再翻译为切换为的语种,体验效果有点欠缺。 而这个的作用,就是增强用户视觉的体验效果,在页面加载(刷新)时,如果判定需要翻译(之前的页面触发过翻译为某个语种了),那么就会自动隐藏所有网页中的文本,当翻译完成后,自动将网页中的文本显示出来 。 注意:这个需要在body标签之前执行,需要在head标签中执行此。也就是加载 translate.js 以及触发此都要放到head标签中 ## 使用 ```` translate.visual.webPageLoadTranslateBeforeHiddenText(); ```` **注意** 它要加在 head 标签里! 相应的,translate.js 的引入肯定要在它之前,也就是 translate.js 的引入也要放到head标签里。 另外,它是否隐藏当前网页的文本,是根据当前是否要切换语言来进行的,如果当前页面需要进行切换语言,那它触发后会自动隐藏网页中的所有文字; 如果当前页面并没有进行切换语言,它是不会自动隐藏网页的文字的,因为不需要切换语言了,也就没必要隐藏文字,直接显示就可以了。 同样,因为有这个判定,所以你要在它之前,就要设置本地语种: [translate.language.setLocal('chinese_simplified'); //设置本地语种(当前网页的语种)](4066.html) 也就是,你需要在head里的设置为: ```` ```` 这里给了一个demo示例,以供参考: ````
    你好
    世界
    ```` 可以看到, translate.js 的引入以及设置本地语种、webPageLoadTranslateBeforeHiddenText 都是放在了head 里,确保在 body 出现之前,就完成设置。 而 translate.js 的其他设置及翻译的触发 translate.execute(); 都是放在了网页的最末尾,确保网页都加载渲染完了后,在触发翻译的执行。 ## 注意 1. 放的位置一定是head标签里 2. 需要 translate.js v3.17.19.20250812 及更高版本才支持此能力
  • 将翻译后的页面进行还原回翻译前的

    ```` translate.reset(); ```` 它可以将你翻译之后的页面,还原回翻译之前的样子。 比如,你原本页面文字是中文的,你翻译为了英文,当你触发了这个后,他会瞬间还原回你原本翻译前,也就是中文的页面。 另外如果你还可以进行更多的自定义,传入更多控制参数: ```` translate.reset({ selectLanguageRefreshRender:true, //是否重新渲染select选择语言到原始未翻译前的状态,默认不设置则是true,进行重新渲染 notTranslateTip:true //如果当前未执行过翻译,然后触发的 translate.reset() ,是否在控制台打印友好提示,提示未执行翻译,还原指令忽略, true则是正常打印这个提示, false则是不打印这个提示 }); ```` ## 注意 1. 需要 translate.js v3.18.32.20250915 及更高版本 2. 它只能对 [启用整体翻译能力](4078.html) 的翻译进行还原。整体翻译能力2023年推出并推荐使用的。
  • 启用翻译性能监控

    ```` translate.time.execute.start(); ```` 他会在浏览器控制台里打印 translate.execute 执行的相关信息,打印其执行耗时情况。 打印效果比如: ```` [time][translate.execute()] 114ms (search&cache 7ms) , [chinese_simplified] : (2)[你,你好,世界] [time][translate.execute()] 3ms , [chinese_simplified] : (1)[工业品] [time][translate.execute()] 0ms [time][translate.execute()] 1ms ```` **关于打印的数据解释:** 第一行中: 1. ````114ms ```` 此次 translate.execute 执行,从触发到页面显示翻译后的文字,总共耗时 114ms 1. ````search&cache 7ms```` 其中页面元素的搜索 识别、整理、自定义术语处理、离线翻译命中、及浏览器缓存命中这些耗时 7ms 1. ````[chinese_simplified] : (2)[你,你好,世界]```` 扫描整理到要进行翻译的文本,这些文本要进行浏览器缓存命中、以及未命中的就要进行网络请求及请求响应后的翻译内容渲染,这里因为前面有了 ````(search&cache 7ms)```` 标识,所以本次是有浏览器未命中的文本,要进行通过文本翻译接口进行翻译的,文本翻译接口请求 耗时 114ms - 7ms = 107ms ,[chinese_simplified] 为当前进行了一次翻译请求,将简体中文的原文本进行的翻译,翻译的文本数有 2 个,分别是 [你,你好,世界])。这里的耗时基本都是被网络请求给消耗的,翻译内容的渲染耗时跟网络请求耗时相比,几乎可以忽略。 第二行: 它没有 ````(search&cache 7ms)```` 所以它的翻译文本 ````[chinese_simplified] : (1)[工业品]```` 是全部命中了浏览器缓存,此次翻译的执行没有触发文本翻译接口发起网络请求。所以它执行的速度非常快,从节点扫描、识别、整理、分析、最后到渲染显示等,只有 3ms 第三行、第四行: ````[time][translate.execute()] 0ms```` 它并没有后面跟随网络请求相关数据,也就是触发 translate.execute 执行后,单纯执行了 中页面元素的搜索 识别、整理、自定义术语处理这些,就已经将要进行翻译处理的文本全部处理完了,不再需要触发网络请求了。 这里的耗时也就是等于第一行的 ````search&cache 7ms```` 的耗时 ## 注意 1. 需要 translate.js v3.18.32.20250915 及更高版本 2. 它不限制是在 translate.execute() 前还是后触发,当他触发后才会在日志里打印执行耗时信息。为了避免代码过乱,建议统一放到 translate.execute 之前进行设置。