i18n-jsautotranslate 3.12.9 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -10
- package/index.js +111 -25
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -148,16 +148,8 @@ translate.execute();//进行翻译
|
|
|
148
148
|
[详细使用说明](https://translate.zvo.cn/4041.html) | [Vue2 中使用 translate.js 在线 Demo](https://lruihao.github.io/vue-el-demo/#/translate-js)
|
|
149
149
|
|
|
150
150
|
# 谁在使用
|
|
151
|
-
截止 2023.7 月份时,本项目的后端免费翻译服务的请求量就已经达到了 1.5亿次/月 的规模,并且还在非常快速的持续增大,包括一些城投集团像是长沙城投、以及一些政府单位像是环境保障局、企业国际化经营服务平台、海外矿业产业联合、国际潮青联谊年会、人力资源和社会保障局、政务服务网、海外的一些平台如futrom智能住宅、bitheime全球区块链等等都在广泛使用。
|
|
152
|
-
这里给出两个使用比较好的网站作为实际示例参考:
|
|
153
|
-
|
|
154
|
-
* [**RICE中国大米展**](https://www.cnrice.com.cn)
|
|
155
|
-
* [**第十一届国际潮青联谊年会组委会**](http://ityc.org.cn)
|
|
156
|
-
|
|
157
|
-
另外,很多开源框架及产品也都已将此翻译能力接入了自身系统,赋予自身系统多语言切换能力。
|
|
158
|
-
|
|
159
151
|
|
|
160
|
-
|
|
152
|
+
开源项目:
|
|
161
153
|
* [管伊佳ERP](https://gitee.com/jishenghua/JSH_ERP) 国产开源ERP系统关注度第一,专注进销存、生产、总账
|
|
162
154
|
* [FixIt](https://github.com/hugo-fixit/cmpt-translate) 一款简洁、优雅且先进的Hugo 博客主题
|
|
163
155
|
* [Z-Blog](https://app.zblogcn.com/?id=49226) 易用的博客程序,功能丰富,模板多样,助轻松搭建个性博客。
|
|
@@ -172,8 +164,22 @@ translate.execute();//进行翻译
|
|
|
172
164
|
* [phpok cms](https://gitee.com/phpok/phpok) 极其自由的企业站程序,支持各种自定义配置。
|
|
173
165
|
* [RPCMS](https://app.rpcms.cn/app/149.html) 轻量型php内容管理系统,小型、轻量,但功能丰富,可扩展性强。
|
|
174
166
|
* [Masuit.MyBlogs](https://gitee.com/masuit/Masuit.MyBlogs) 高性能高安全性低占用的个人博客系统
|
|
167
|
+
|
|
175
168
|
...
|
|
176
|
-
|
|
169
|
+
|
|
170
|
+
| | | | | |
|
|
171
|
+
| ------------ | ------------ |------------ |------------ |------------ |
|
|
172
|
+
| 高校 | 清华大学 | 北京理工大学 | 西苏格兰大学 | 中国美术学院 | 亚利桑那州立大学|
|
|
173
|
+
| 集团 | 中国一汽 | 京东 | 中兴 | 中国铁建 | 长城汽车 |
|
|
174
|
+
| 政务 | 湖北省人民检察院 | 云南省药品监督管理局 | 云南省机关事务管理局 | 香港一带一路研究院 | 曲靖市生态环境局 |
|
|
175
|
+
| 科研 | 国家生物信息中心 | 德国科工创新院 | 中科能研电力技术研究院 | 国家新能源汽车技术创新中心 | 北方华创 |
|
|
176
|
+
| 云厂商 | 指点云 | 每刻云 | 雨云 | DOGSSL | 多彩云 |
|
|
177
|
+
| 协会 | 中国国际环保展览会 | 国际研发方法协会 | 中国内燃机学会 | 深圳市智慧城市产业协会 | 山东省社会组织总会 |
|
|
178
|
+
| 平台 | 东盟 | ESG国际服务平台 | 安徽省外贸综合服务平台 | 湖南企业国际化经营服务平台 | 中亚采招网 |
|
|
179
|
+
|
|
180
|
+
...
|
|
181
|
+
|
|
182
|
+
如果您有开源项目,比如文档、cms、UI 框架、后台管理框架、等等,需要采用此进行多语言切换,欢迎喊我,无偿提供全程接入讨论及遇到的问题跟随优化,希望我们的开源项目能互相产生作用一起越来越好。如果你的项目在这个列表中没有,欢迎联系我说明,我给加入进去。如果您不想出现在这里,也联系我,我给隐去。
|
|
177
183
|
|
|
178
184
|
|
|
179
185
|
# 哪些能力
|
package/index.js
CHANGED
|
@@ -12,7 +12,7 @@ var translate = {
|
|
|
12
12
|
* 格式:major.minor.patch.date
|
|
13
13
|
*/
|
|
14
14
|
// AUTO_VERSION_START
|
|
15
|
-
version: '3.
|
|
15
|
+
version: '3.13.0.20250124',
|
|
16
16
|
// AUTO_VERSION_END
|
|
17
17
|
/*
|
|
18
18
|
当前使用的版本,默认使用v2. 可使用 setUseVersion2();
|
|
@@ -179,7 +179,7 @@ var translate = {
|
|
|
179
179
|
document.getElementById('translateSelectLanguage').style.width = '94px';
|
|
180
180
|
}catch(e){ console.log(e);}
|
|
181
181
|
*/
|
|
182
|
-
});
|
|
182
|
+
}, null);
|
|
183
183
|
|
|
184
184
|
|
|
185
185
|
}
|
|
@@ -1121,14 +1121,6 @@ var translate = {
|
|
|
1121
1121
|
//console.log("inProgressNodes -- 减去node length: "+translate.inProgressNodes.length+', text:'+ipnode.nodeValue);
|
|
1122
1122
|
}
|
|
1123
1123
|
|
|
1124
|
-
//当前已经全部翻译并渲染完毕,则将其恢复到闲置状态,闲置状态则可以进行下一轮翻译。
|
|
1125
|
-
if(translate.inProgressNodes.length == 0){
|
|
1126
|
-
setTimeout(function(){
|
|
1127
|
-
translate.state = 0;
|
|
1128
|
-
}, 50);
|
|
1129
|
-
//console.log('set translate.state = 0');
|
|
1130
|
-
}
|
|
1131
|
-
|
|
1132
1124
|
break;
|
|
1133
1125
|
}
|
|
1134
1126
|
}
|
|
@@ -1233,8 +1225,8 @@ var translate = {
|
|
|
1233
1225
|
/*
|
|
1234
1226
|
当前状态,执行状态
|
|
1235
1227
|
0 空闲(或者执行翻译完毕)
|
|
1236
|
-
10 扫描要翻译的node
|
|
1237
|
-
20 ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求
|
|
1228
|
+
10 扫描要翻译的node,并读取浏览器缓存的翻译内容进行渲染显示
|
|
1229
|
+
20 浏览器缓存渲染完毕,ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求
|
|
1238
1230
|
至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程
|
|
1239
1231
|
*/
|
|
1240
1232
|
state:0,
|
|
@@ -1282,9 +1274,33 @@ var translate = {
|
|
|
1282
1274
|
console.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
|
|
1283
1275
|
return null;
|
|
1284
1276
|
}
|
|
1277
|
+
},
|
|
1278
|
+
//当前 translate.translateRequest[uuid] 的是否已经全部执行完毕,这里单纯只是对 translate.translateRequest[uuid] 的进行判断,这里要在 translate.json 接口触发完并渲染完毕后触发,当然接口失败时也要触发
|
|
1279
|
+
isAllExecuteFinish:function(uuid){
|
|
1280
|
+
|
|
1281
|
+
for(var lang in translate.translateRequest[uuid]){
|
|
1282
|
+
for(var i = 0; i<translate.translateRequest[uuid][lang].length; i++){
|
|
1283
|
+
if(translate.translateRequest[uuid][lang][i].executeFinish == 0){
|
|
1284
|
+
//这个还没执行完,那么直接退出,不在向后执行了
|
|
1285
|
+
//console.log('uuid:'+uuid+' lang:'+lang+' executeFinish:0 time:'+translate.translateRequest[uuid][lang][i][addtime]);
|
|
1286
|
+
|
|
1287
|
+
//这里要考虑进行时间判断
|
|
1288
|
+
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
//都执行完了,那么设置完毕
|
|
1295
|
+
translate.state = 0;
|
|
1296
|
+
translate.executeNumber++;
|
|
1285
1297
|
}
|
|
1298
|
+
|
|
1286
1299
|
},
|
|
1287
1300
|
|
|
1301
|
+
//execute() 方法已经被执行过多少次了, 只有execute() 完全执行完,也就是界面渲染完毕后,它才会+1
|
|
1302
|
+
executeNumber:0,
|
|
1303
|
+
|
|
1288
1304
|
/*
|
|
1289
1305
|
执行翻译操作。翻译的是 nodeQueue 中的
|
|
1290
1306
|
docs 如果传入,那么翻译的只是传入的这个docs的。传入如 [document.getElementById('xxx'),document.getElementById('xxx'),...]
|
|
@@ -1801,6 +1817,7 @@ var translate = {
|
|
|
1801
1817
|
if(fanyiLangs.length == 0){
|
|
1802
1818
|
//没有需要翻译的,直接退出
|
|
1803
1819
|
translate.state = 0;
|
|
1820
|
+
translate.executeNumber++;
|
|
1804
1821
|
return;
|
|
1805
1822
|
}
|
|
1806
1823
|
|
|
@@ -1850,6 +1867,8 @@ var translate = {
|
|
|
1850
1867
|
//状态
|
|
1851
1868
|
translate.state = 20;
|
|
1852
1869
|
|
|
1870
|
+
|
|
1871
|
+
|
|
1853
1872
|
//进行掉接口翻译
|
|
1854
1873
|
for(var lang_index in fanyiLangs){ //一维数组,取语言
|
|
1855
1874
|
var lang = fanyiLangs[lang_index];
|
|
@@ -1858,6 +1877,7 @@ var translate = {
|
|
|
1858
1877
|
if(typeof(translateTextArray[lang]) == 'undefined' || translateTextArray[lang].length < 1){
|
|
1859
1878
|
console.log('异常,理论上不应该存在: typeof(translateTextArray[lang]) == \'undefined\' || translateTextArray[lang].length < 1');
|
|
1860
1879
|
translate.state = 0;
|
|
1880
|
+
translate.executeNumber++;
|
|
1861
1881
|
return;
|
|
1862
1882
|
}
|
|
1863
1883
|
|
|
@@ -1867,11 +1887,21 @@ var translate = {
|
|
|
1867
1887
|
console.log(translateTextArray[lang][ttr_index])
|
|
1868
1888
|
}*/
|
|
1869
1889
|
|
|
1890
|
+
//将需要请求翻译接口的加入到 translate.translateRequest 中
|
|
1891
|
+
if(typeof(translate.translateRequest[uuid]) == 'undefined' || translate.translateRequest[uuid] == null){
|
|
1892
|
+
translate.translateRequest[uuid] = {};
|
|
1893
|
+
}
|
|
1894
|
+
translate.translateRequest[uuid][lang] = {};
|
|
1895
|
+
translate.translateRequest[uuid][lang].executeFinish = 0; //是否执行完毕,0是执行中, 1是执行完毕(不管是失败还是成功) 而且执行完毕是指ajax请求获得响应,并且dom渲染完成之后才算完毕。当然如果ajax接口失败那也是直接算完毕
|
|
1896
|
+
translate.translateRequest[uuid][lang].addtime = Math.floor(Date.now() / 1000);
|
|
1897
|
+
|
|
1898
|
+
|
|
1870
1899
|
/*** 翻译开始 ***/
|
|
1871
1900
|
var url = translate.request.api.translate;
|
|
1872
1901
|
var data = {
|
|
1873
1902
|
from:lang,
|
|
1874
1903
|
to:translate.to,
|
|
1904
|
+
lowercase:translate.whole.isEnableAll? '0':'1', //首字母大写
|
|
1875
1905
|
//text:JSON.stringify(translateTextArray[lang])
|
|
1876
1906
|
text:encodeURIComponent(JSON.stringify(translateTextArray[lang]))
|
|
1877
1907
|
};
|
|
@@ -1880,6 +1910,10 @@ var translate = {
|
|
|
1880
1910
|
//console.log(data);
|
|
1881
1911
|
//console.log(translateTextArray[data.from]);
|
|
1882
1912
|
if(data.result == 0){
|
|
1913
|
+
translate.translateRequest[uuid][lang].result = 2;
|
|
1914
|
+
translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
|
|
1915
|
+
translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
|
|
1916
|
+
translate.waitingExecute.isAllExecuteFinish();
|
|
1883
1917
|
console.log('=======ERROR START=======');
|
|
1884
1918
|
console.log(translateTextArray[data.from]);
|
|
1885
1919
|
//console.log(encodeURIComponent(JSON.stringify(translateTextArray[data.from])));
|
|
@@ -1887,6 +1921,7 @@ var translate = {
|
|
|
1887
1921
|
console.log('response : '+data.info);
|
|
1888
1922
|
console.log('=======ERROR END =======');
|
|
1889
1923
|
//translate.temp_executeFinishNumber++; //记录执行完的次数
|
|
1924
|
+
|
|
1890
1925
|
return;
|
|
1891
1926
|
}
|
|
1892
1927
|
|
|
@@ -1950,12 +1985,49 @@ var translate = {
|
|
|
1950
1985
|
task.execute(); //执行渲染任务
|
|
1951
1986
|
//translate.temp_executeFinishNumber++; //记录执行完的次数
|
|
1952
1987
|
|
|
1988
|
+
translate.translateRequest[uuid][lang].result = 1;
|
|
1989
|
+
translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
|
|
1990
|
+
translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
|
|
1991
|
+
translate.waitingExecute.isAllExecuteFinish();
|
|
1992
|
+
}, function(xhr){
|
|
1993
|
+
translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
|
|
1994
|
+
translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
|
|
1995
|
+
translate.translateRequest[uuid][lang].result = 3;
|
|
1996
|
+
translate.waitingExecute.isAllExecuteFinish();
|
|
1953
1997
|
});
|
|
1954
1998
|
/*** 翻译end ***/
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
1999
|
}
|
|
1958
2000
|
},
|
|
2001
|
+
|
|
2002
|
+
/**
|
|
2003
|
+
* 翻译请求记录
|
|
2004
|
+
* 一维:key:uuid,也就是execute每次执行都会创建一个翻译队列,这个是翻译队列的唯一标识。 这个uuid跟 nodeQueue 的uuid是一样的
|
|
2005
|
+
* value:对象
|
|
2006
|
+
* 二维: 对象,包含:
|
|
2007
|
+
* from 存放的是要翻译的源语种,比如要讲简体中文翻译为英文,这里存放的就是 chinese_simplified
|
|
2008
|
+
* state 是否执行完毕,0是执行中, 1是执行完毕(不管是失败还是成功) 而且执行完毕是指ajax请求获得响应,并且dom渲染完成之后才算完毕。当然如果ajax接口失败那也是直接算完毕
|
|
2009
|
+
* addtime 这条数据加入到本数组的时间,也就是进行ajax请求开始那一刻的时间,10位时间戳
|
|
2010
|
+
* stoptime 执行完毕的时间,也就是state转为2那一刻的时间
|
|
2011
|
+
* result 执行结果, 0 是还没执行完,等待执行完, > 0 是执行完了有结果了,
|
|
2012
|
+
* 1 是执行成功
|
|
2013
|
+
* 2 是接口有响应,也是200响应,但是接口响应的结果返回了错误,也就是返回了 {result:0, info:'...'}
|
|
2014
|
+
* 3 是接口不是200响应码
|
|
2015
|
+
*
|
|
2016
|
+
*/
|
|
2017
|
+
translateRequest:{
|
|
2018
|
+
/*
|
|
2019
|
+
uuid:[
|
|
2020
|
+
'chinese_simplified':{
|
|
2021
|
+
executeFinish:0,
|
|
2022
|
+
addtime:150001111,
|
|
2023
|
+
stoptime:150001111,
|
|
2024
|
+
result:0
|
|
2025
|
+
},
|
|
2026
|
+
...
|
|
2027
|
+
]
|
|
2028
|
+
*/
|
|
2029
|
+
},
|
|
2030
|
+
|
|
1959
2031
|
/*
|
|
1960
2032
|
将已成功翻译并渲染的node节点进行缓存记录
|
|
1961
2033
|
key: node节点的唯一标识符,通过 nodeuuid.uuid() 生成
|
|
@@ -3955,7 +4027,7 @@ var translate = {
|
|
|
3955
4027
|
translate.selectLanguageTag
|
|
3956
4028
|
translate.execute(); //执行翻译
|
|
3957
4029
|
}
|
|
3958
|
-
});
|
|
4030
|
+
}, null);
|
|
3959
4031
|
},
|
|
3960
4032
|
|
|
3961
4033
|
util:{
|
|
@@ -4469,7 +4541,7 @@ var translate = {
|
|
|
4469
4541
|
* @param data 请求的参数数据
|
|
4470
4542
|
* @param func 请求完成的回调,传入如 function(data){ console.log(data); }
|
|
4471
4543
|
*/
|
|
4472
|
-
translate:function(path, data, func){
|
|
4544
|
+
translate:function(path, data, func, abnormalFunc){
|
|
4473
4545
|
var textArray = JSON.parse(decodeURIComponent(data.text));
|
|
4474
4546
|
let translateTextArray = translate.util.split(textArray, 48000);
|
|
4475
4547
|
//console.log(translateTextArray);
|
|
@@ -4544,10 +4616,7 @@ var translate = {
|
|
|
4544
4616
|
}
|
|
4545
4617
|
|
|
4546
4618
|
func(d);
|
|
4547
|
-
}, 'post', true, {'Authorization':'Bearer '+auth, 'Content-Type':'application/json'},
|
|
4548
|
-
console.log('---------error--------');
|
|
4549
|
-
console.log('edge translate service error, http code : '+xhr.status + ', response text : '+xhr.responseText);
|
|
4550
|
-
}, true);
|
|
4619
|
+
}, 'post', true, {'Authorization':'Bearer '+auth, 'Content-Type':'application/json'}, abnormalFunc, true);
|
|
4551
4620
|
|
|
4552
4621
|
|
|
4553
4622
|
}
|
|
@@ -4844,8 +4913,9 @@ var translate = {
|
|
|
4844
4913
|
* }
|
|
4845
4914
|
*
|
|
4846
4915
|
* @param func 请求完成的回调,传入如 function(data){ console.log(data); }
|
|
4916
|
+
* @param abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url
|
|
4847
4917
|
*/
|
|
4848
|
-
post:function(path, data, func){
|
|
4918
|
+
post:function(path, data, func, abnormalFunc){
|
|
4849
4919
|
var headers = {
|
|
4850
4920
|
'content-type':'application/x-www-form-urlencoded',
|
|
4851
4921
|
};
|
|
@@ -4861,7 +4931,7 @@ var translate = {
|
|
|
4861
4931
|
//if(url.indexOf('edge') > -1 && path == translate.request.api.translate){
|
|
4862
4932
|
if(translate.service.name == 'client.edge'){
|
|
4863
4933
|
if(path == translate.request.api.translate){
|
|
4864
|
-
translate.service.edge.translate(path, data, func);
|
|
4934
|
+
translate.service.edge.translate(path, data, func, abnormalFunc);
|
|
4865
4935
|
return;
|
|
4866
4936
|
}
|
|
4867
4937
|
if(path == translate.request.api.language){
|
|
@@ -4877,7 +4947,7 @@ var translate = {
|
|
|
4877
4947
|
}
|
|
4878
4948
|
// ------- edge end --------
|
|
4879
4949
|
|
|
4880
|
-
this.send(path, data, func, 'post', true, headers,
|
|
4950
|
+
this.send(path, data, func, 'post', true, headers, abnormalFunc, true);
|
|
4881
4951
|
},
|
|
4882
4952
|
/**
|
|
4883
4953
|
* 发送请求
|
|
@@ -5096,7 +5166,7 @@ var translate = {
|
|
|
5096
5166
|
}
|
|
5097
5167
|
|
|
5098
5168
|
func(data);
|
|
5099
|
-
});
|
|
5169
|
+
}, null);
|
|
5100
5170
|
},
|
|
5101
5171
|
listener:{
|
|
5102
5172
|
minIntervalTime:800, // 两次触发的最小间隔时间,单位是毫秒,这里默认是800毫秒。最小填写时间为 200毫秒
|
|
@@ -5447,7 +5517,7 @@ var translate = {
|
|
|
5447
5517
|
curTooltipEle.style.top =selectionY+20+"px";
|
|
5448
5518
|
curTooltipEle.style.left = selectionX+50+"px" ;
|
|
5449
5519
|
curTooltipEle.style.display = "";
|
|
5450
|
-
});
|
|
5520
|
+
}, null);
|
|
5451
5521
|
},
|
|
5452
5522
|
start:function () {
|
|
5453
5523
|
//新建一个tooltip元素节点用于显示翻译
|
|
@@ -5618,6 +5688,22 @@ var nodeuuid = {
|
|
|
5618
5688
|
}
|
|
5619
5689
|
return uuid;
|
|
5620
5690
|
},
|
|
5691
|
+
/*
|
|
5692
|
+
开启远程调试能力,当你使用中遇到问题,需要向开源作者求助时,可以在你项目中主动调用这个方法,也就是 translate.enableRemoteDebug(); 即可启动远程调试能力
|
|
5693
|
+
开源项目作者就可以对你当前出错的页面进行远程调试排查问题所在。当然前提是你的页面要保持别关闭。
|
|
5694
|
+
|
|
5695
|
+
这个能力是通过开源项目 https://github.com/HuolalaTech/page-spy-web 来实现的
|
|
5696
|
+
|
|
5697
|
+
*/
|
|
5698
|
+
enableRemoteDebug:function(){
|
|
5699
|
+
|
|
5700
|
+
/*
|
|
5701
|
+
|
|
5702
|
+
待同事实现
|
|
5703
|
+
*/
|
|
5704
|
+
|
|
5705
|
+
}
|
|
5706
|
+
|
|
5621
5707
|
|
|
5622
5708
|
}
|
|
5623
5709
|
console.log('------ translate.js ------\nTwo lines of js html automatic translation, page without change, no language configuration file, no API Key, SEO friendly! Open warehouse : https://github.com/xnx3/translate \n两行js实现html全自动翻译。 无需改动页面、无语言配置文件、无API Key、对SEO友好!完全开源,代码仓库:https://gitee.com/mail_osc/translate');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "i18n-jsautotranslate",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.13.0",
|
|
4
4
|
"description": "Two lines of js realize automatic html translation. No need to change the page, no language configuration file, no API key, SEO friendly!",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|