创建本次

翻译通道

每次执行 translate.execute() 就会创建一个独立的翻译通道

因为一个页面可能会执行多次 translate.execute();

u4_start u4_end u4_line

初始化-取翻

译至的语种

先判断缓存中有没有上次使用的语种,从缓存中取出

缓存指的是 localStorage

u9_start u9_end u9_line

页面出现 select

的选择切换语言

u12_start u12_end u12_line

自动根据所在国

家切换相应语种

如果设置了启用此能力,并且上面第二步,并未获取到指定要翻译为什么语种,那么这里就会生效,自动进行识别本国所使用的语种,并将其赋予要切换为的目标语种,等待后面步骤进行取这里的值进行切换语种

u17_start u17_end u17_line

初始化-本地语种

如果未手动设置进行指定本地语种的语言,那么会自动识别。自动识别的依据是根据当前页面所有元素的文本字符,进行语种归类,取出现次数最多的语种,为当前的本地语种

u22_start u22_end u22_line

判断是否需要翻译

如果不一致,那么就需要进行翻译。

u27_start u27_end u27_line

翻译中止

本地语种跟要翻译为的目标语种一样

将本地语种跟要翻译为的目标语种进行比对。

u34_start u34_end u34_line

翻译图片

u37_start u37_end u37_line

初始化-要翻

译的目标元素

对图片进行翻译

如果未设置要翻译的目标元素有哪些,那么就会翻译整个网页中所有的元素。当然也包含了title等。

如果设置了翻译的元素,那么会只对设置的元素进行翻译,其他未设置的不进行翻译。

u44_start u44_end u44_line

扫描翻译的目

标元素及节点

针对翻译目标元素进行扫描,取相关文本及属性内的文本,比如 img 标签的alt属性、以及标签的 title 属性、input标签的placeholder属性等等都是包含的。

如果想忽略其中某些元素或标签,可以根据id、class、tag等进行设置忽略项

u49_start u49_end u49_line

生成本次

翻译队列

将本次所扫描的元素节点等自动识别其语种、特殊符号标识、分词分句,将其存入 translate.nodeQueue 中,以七维数组形式存在,等待翻译。

u54_start u54_end u54_line

浏览器缓存

进行快速翻译渲染

如果网页所在域名,已经有过翻译,那么翻译记录(翻译的词跟句子)会存入localStorage中进行缓存。我们称之为浏览器端的一级缓存。

针对一级缓存中有的词或者句子,在网页打开后会迅速进行翻译,几乎无延迟。在用户感知上,基本感觉不出翻译的动作,因为页面加载完,js也就执行完,不需要网络请求,页面文本就已经被翻译了!

如果你的页面是动态页面,会有一些动态内容显示,那么这部分缓存中没有的单词或句子会单独进行后续的请求服务端接口进行翻译,翻译成功后在进行渲染显示。它只是增量翻译,而之前已经翻译过的,则不会在经过服务端翻译接口。对用户达到极致体验的同时,降低了极大的服务端压力。

u59_start u59_end u59_line

组合要经过服务

端请求的翻译数据

经过浏览器缓存层筛掉大量不需要翻译的词跟句子后,将需要进行翻译的词跟句子进行整理,按语种进行组合。

比如英文、简体中文,不同语种的文本会存在于不同的组中,按语种进行分组。

如果要翻译的词或句子浏览器缓存全部命中,全部包含,则不会再发起服务端翻译接口。

u64_start u64_end u64_line

发起接口请求

使用服务端翻译

u67_start u67_end u67_line

翻译完成,中止

将翻译结果加入浏览器的一级缓存

将根据语种进行分组的翻译的词跟句子,按照分组(一个语种一组),进行分别请求服务端翻译接口,有服务端进行翻译。

网络层/日志

 

网络分发

日志记录

流量统计

请求次数

翻译字符数

 

服务端获

取请求处理

u78_start u78_end u78_line
u79_start u79_end u79_line

请求服务端接口,有服务端根据用户当前ip,来识别用户ip所在哪个国家,取出其使用的语种

将识别的语种返回(这个不是百分百能识别的,也不是百分百准确的,可以理解为 99% 的准确度)

u84_start u84_end u84_line
u85_start u85_end u85_line

将要翻译的数据传输给服务端

返回翻译结果

二级缓存寻找

服务端会有磁盘进行翻译数据的缓存(我们称之为二级缓存。不用内存级,是为了极大降低服务器成本)

如果发现在缓存中存在,则直接将结果返回。

u94_start u94_end u94_line

初始化-网站

的翻译通道

不同的网站,翻译通道不同。网站所有者可以自行注册进行设置翻译通道。默认如果不设置,那就是使用的google的免费通道。

翻译通道包含google、华为云机器翻译、小牛翻译等。

u99_start u99_end u99_line

进行翻译

有第三方翻译通道进行翻译。比如使用google对文本进行翻译。

u104_start u104_end u104_line
u105_start u105_end u105_line

先找缓存

翻译结果返回

u110_start u110_end u110_line

如果翻译失败,则将原因返回

u113_seg0 u113_seg1 u113_seg2

翻译成功,将翻译结果先进行缓存,然后在返回给用户

u117_start u117_end u117_line
u118_start u118_end u118_line
u119_start u119_end u119_line

进行翻译

结果缓存

翻译接口成功

翻译接口失败

u126_start u126_end u126_line

控制台中打印

出失败的原因

翻译接口返回翻译失败,则有浏览器控制台打印出失败原因。也就是使用 console.log(...) 来输出失败的原因,以便追踪

u131_start u131_end u131_line
u132_start u132_end u132_line
u133_start u133_end u133_line

进行渲染数据

创建渲染任务 new translate.renderTask()

将翻译结果进行渲染,完事翻译。

每种语种的翻译都会创建一个单独的渲染任务。这个是跟请求服务端翻译接口时,每种语种会单独进行请求是对应的

u138_start u138_end u138_line

触发翻译

完成的监听

当翻译完成后会自动触发执行某个方法,以便来做自定义扩展

u143_start u143_end u143_line

翻译完成

当执行 translate.execute()

它是怎么工作的

作者:管雷鸣      翻译官网  http://translate.zvo.cn      开源仓库:https://gitee.com/mail_osc/translate

结构图源文件:https://gitee.com/mail_osc/translate/blob/master/doc/%E7%BB%93%E6%9E%84%E5%9B%BE-axure7.0.rp