i18n-jsautotranslate 3.12.5 → 3.12.9

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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/index.js +107 -20
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -145,7 +145,7 @@ translate.execute();//进行翻译
145
145
  const translate = require("i18n-jsautotranslate")
146
146
  ```
147
147
 
148
- [Vue2 中使用 translate.js 在线 Demo](https://lruihao.github.io/vue-el-demo/#/translate-js)
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
151
  截止 2023.7 月份时,本项目的后端免费翻译服务的请求量就已经达到了 1.5亿次/月 的规模,并且还在非常快速的持续增大,包括一些城投集团像是长沙城投、以及一些政府单位像是环境保障局、企业国际化经营服务平台、海外矿业产业联合、国际潮青联谊年会、人力资源和社会保障局、政务服务网、海外的一些平台如futrom智能住宅、bitheime全球区块链等等都在广泛使用。
package/index.js CHANGED
@@ -12,8 +12,8 @@ var translate = {
12
12
  * 格式:major.minor.patch.date
13
13
  */
14
14
  // AUTO_VERSION_START
15
- version: '3.12.5.20250111',
16
- // AUTO_VERSION_END
15
+ version: '3.12.9.20250116',
16
+ // AUTO_VERSION_END
17
17
  /*
18
18
  当前使用的版本,默认使用v2. 可使用 setUseVersion2();
19
19
  来设置使用v2 ,已废弃,主要是区分是否是v1版本来着,v2跟v3版本是同样的使用方式
@@ -852,6 +852,7 @@ var translate = {
852
852
  return doms;
853
853
  }
854
854
  },
855
+
855
856
  listener:{
856
857
  //当前页面打开后,是否已经执行完execute() 方法进行翻译了,只要执行完一次,这里便是true。 (多种语言的API请求完毕并已渲染html)
857
858
  //isExecuteFinish:false,
@@ -1116,16 +1117,22 @@ var translate = {
1116
1117
  translate.inProgressNodes[ini].number = translate.inProgressNodes[ini].number - 1;
1117
1118
  //console.log("inProgressNodes -- number: "+translate.inProgressNodes[ini].number+', text:'+ipnode.nodeValue);
1118
1119
  if(translate.inProgressNodes[ini].number < 1){
1119
-
1120
-
1121
- //console.log('ini-'+ini)
1122
- translate.inProgressNodes.splice(ini,1);
1123
- //console.log("inProgressNodes -- 减去node length: "+translate.inProgressNodes.length+', text:'+ipnode.nodeValue);
1124
- //
1120
+ translate.inProgressNodes.splice(ini,1);
1121
+ //console.log("inProgressNodes -- 减去node length: "+translate.inProgressNodes.length+', text:'+ipnode.nodeValue);
1122
+ }
1123
+
1124
+ //当前已经全部翻译并渲染完毕,则将其恢复到闲置状态,闲置状态则可以进行下一轮翻译。
1125
+ if(translate.inProgressNodes.length == 0){
1126
+ setTimeout(function(){
1127
+ translate.state = 0;
1128
+ }, 50);
1129
+ //console.log('set translate.state = 0');
1125
1130
  }
1131
+
1126
1132
  break;
1127
1133
  }
1128
1134
  }
1135
+
1129
1136
  }, 50, ipnode);
1130
1137
 
1131
1138
  translate.element.nodeAnalyse.set(this.nodes[hash][task_index], task.originalText, task.resultText, task['attribute']);
@@ -1221,10 +1228,76 @@ var translate = {
1221
1228
  }
1222
1229
  }
1223
1230
  },
1231
+
1232
+
1233
+ /*
1234
+ 当前状态,执行状态
1235
+ 0 空闲(或者执行翻译完毕)
1236
+ 10 扫描要翻译的node
1237
+ 20 ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求
1238
+ 至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程
1239
+ */
1240
+ state:0,
1241
+
1242
+ /*
1243
+ 等待翻译队列 v3.12.6 增加
1244
+ 当前是否有需要等待翻译的任务,这个目的是为了保证同一时间 translate.execute() 只有一次在执行,免得被新手前端给造成死循环,导致edge翻译给你屏蔽,用户网页还卡死
1245
+ 当执行 translate.execute() 时,会先判断状态 translate.state 是否是0空闲的状态,如果空闲,才会执行,如果不是空闲,则不会执行,而是进入到这里进行等待,等待执行完毕后 translate.state 变成0空闲之后,再来执行这里的
1246
+
1247
+ */
1248
+ waitingExecute:{
1249
+
1250
+ /*
1251
+ 一维数组形态,存放执行的翻译任务
1252
+ 二维对象形态,存放执行传入的 docs
1253
+ */
1254
+ queue:[],
1255
+ /*
1256
+ 增加一个翻译任务到翻译队列中
1257
+ docs 同 translate.execute(docs) 的传入参数
1258
+ */
1259
+ add:function(docs){
1260
+ //向数组末尾追加
1261
+ translate.waitingExecute.queue.push(docs);
1262
+ //开启一个定时器进行触发
1263
+ let intervalId = setInterval(function() {
1264
+ if(translate.state == 0){
1265
+ //清除定时器,结束循环
1266
+ clearInterval(intervalId);
1267
+ var docs = translate.waitingExecute.get();
1268
+ translate.execute(docs);
1269
+ //console.log('stop waitingExecute setInterval');
1270
+ }
1271
+ }, 500);
1272
+ },
1273
+ /*
1274
+ 从 quque 中取第一个元素,同时将其从queue中删除掉它。
1275
+ 如果取的时候 quque已经没有任何元素了,会返回 null, 但是理论上不会出现null
1276
+ */
1277
+ get:function(){
1278
+ //使用 shift 方法删除数组的第一个元素,并将第一个元素的值返回
1279
+ if(translate.waitingExecute.queue.length > 0){
1280
+ return translate.waitingExecute.queue.shift();
1281
+ }else{
1282
+ console.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
1283
+ return null;
1284
+ }
1285
+ }
1286
+ },
1224
1287
 
1225
- //执行翻译操作。翻译的是 nodeQueue 中的
1226
- //docs 如果传入,那么翻译的只是传入的这个docs的。传入如 [document.getElementById('xxx'),document.getElementById('xxx'),...]
1288
+ /*
1289
+ 执行翻译操作。翻译的是 nodeQueue 中的
1290
+ docs 如果传入,那么翻译的只是传入的这个docs的。传入如 [document.getElementById('xxx'),document.getElementById('xxx'),...]
1291
+ 如果不传入或者传入null,则是翻译整个网页所有能翻译的元素
1292
+ */
1227
1293
  execute:function(docs){
1294
+ if(translate.state != 0){
1295
+ console.log('当前翻译还未完结,新的翻译任务已加入等待翻译队列中,待翻译结束后便会执行当前翻译任务。');
1296
+ translate.waitingExecute.add(docs);
1297
+ return;
1298
+ }
1299
+ translate.state = 1;
1300
+ //console.log('translate.state = 1');
1228
1301
  if(typeof(docs) != 'undefined'){
1229
1302
  //execute传入参数,只有v2版本才支持
1230
1303
  translate.useVersion = 'v2';
@@ -1285,6 +1358,7 @@ var translate = {
1285
1358
  }
1286
1359
 
1287
1360
  //没有指定翻译目标语言、又没自动获取用户本国语种,则不翻译
1361
+ translate.state = 0;
1288
1362
  return;
1289
1363
  }
1290
1364
 
@@ -1294,6 +1368,7 @@ var translate = {
1294
1368
  //这是自定义设置的允许翻译本地语种中,跟本地语种不一致的语言进行翻译
1295
1369
 
1296
1370
  }else{
1371
+ translate.state = 0;
1297
1372
  return;
1298
1373
  }
1299
1374
  }
@@ -1312,14 +1387,17 @@ var translate = {
1312
1387
  其实2、3都是通过 getDocuments() 取,在getDocuments() 就对2、3进行了判断
1313
1388
  */
1314
1389
  var all;
1315
- if(typeof(docs) != 'undefined'){
1390
+ if(typeof(docs) != 'undefined' && docs != null){
1316
1391
  //1. 这个方法已经指定的翻译 nodes
1317
1392
 
1393
+ /* v3.12.6 注释,转到判断非null
1318
1394
  if(docs == null){
1319
1395
  //要翻译的目标区域不存在
1320
1396
  console.log('translate.execute(...) 中传入的要翻译的目标区域不存在。');
1397
+ translate.state = 0;
1321
1398
  return;
1322
1399
  }
1400
+ */
1323
1401
 
1324
1402
  if(typeof(docs.length) == 'undefined'){
1325
1403
  //不是数组,是单个元素
@@ -1722,6 +1800,7 @@ var translate = {
1722
1800
  //console.log(translate.nodeQueue[uuid]['list'])
1723
1801
  if(fanyiLangs.length == 0){
1724
1802
  //没有需要翻译的,直接退出
1803
+ translate.state = 0;
1725
1804
  return;
1726
1805
  }
1727
1806
 
@@ -1767,8 +1846,9 @@ var translate = {
1767
1846
  }
1768
1847
  }
1769
1848
  //加入 translate.inProgressNodes -- end
1770
-
1771
-
1849
+
1850
+ //状态
1851
+ translate.state = 20;
1772
1852
 
1773
1853
  //进行掉接口翻译
1774
1854
  for(var lang_index in fanyiLangs){ //一维数组,取语言
@@ -1776,6 +1856,8 @@ var translate = {
1776
1856
  //console.log(typeof(translateTextArray[lang]))
1777
1857
 
1778
1858
  if(typeof(translateTextArray[lang]) == 'undefined' || translateTextArray[lang].length < 1){
1859
+ console.log('异常,理论上不应该存在: typeof(translateTextArray[lang]) == \'undefined\' || translateTextArray[lang].length < 1');
1860
+ translate.state = 0;
1779
1861
  return;
1780
1862
  }
1781
1863
 
@@ -4363,7 +4445,7 @@ var translate = {
4363
4445
  },
4364
4446
 
4365
4447
  language:{
4366
- json:[{"id":"ukrainian","name":"УкраїнськаName","serviceId":"uk"},{"id":"norwegian","name":"Norge","serviceId":"no"},{"id":"welsh","name":"color name","serviceId":"cy"},{"id":"dutch","name":"nederlands","serviceId":"nl"},{"id":"japanese","name":"日本語","serviceId":"ja"},{"id":"filipino","name":"Pilipino","serviceId":"fil"},{"id":"english","name":"English","serviceId":"en"},{"id":"lao","name":"ກະຣຸນາ","serviceId":"lo"},{"id":"telugu","name":"తెలుగుQFontDatabase","serviceId":"te"},{"id":"romanian","name":"Română","serviceId":"ro"},{"id":"nepali","name":"नेपालीName","serviceId":"ne"},{"id":"french","name":"Français","serviceId":"fr"},{"id":"haitian_creole","name":"Kreyòl ayisyen","serviceId":"ht"},{"id":"czech","name":"český","serviceId":"cs"},{"id":"swedish","name":"Svenska","serviceId":"sv"},{"id":"russian","name":"Русский язык","serviceId":"ru"},{"id":"malagasy","name":"Malagasy","serviceId":"mg"},{"id":"burmese","name":"ဗာရမ်","serviceId":"my"},{"id":"pashto","name":"پښتوName","serviceId":"ps"},{"id":"thai","name":"คนไทย","serviceId":"th"},{"id":"armenian","name":"Արմենյան","serviceId":"hy"},{"id":"chinese_simplified","name":"简体中文","serviceId":"zh-CHS"},{"id":"persian","name":"Persian","serviceId":"fa"},{"id":"chinese_traditional","name":"繁體中文","serviceId":"zh-CHT"},{"id":"kurdish","name":"Kurdî","serviceId":"ku"},{"id":"turkish","name":"Türkçe","serviceId":"tr"},{"id":"hindi","name":"हिन्दी","serviceId":"hi"},{"id":"bulgarian","name":"български","serviceId":"bg"},{"id":"malay","name":"Malay","serviceId":"ms"},{"id":"swahili","name":"Kiswahili","serviceId":"sw"},{"id":"oriya","name":"ଓଡିଆ","serviceId":"or"},{"id":"icelandic","name":"ÍslandName","serviceId":"is"},{"id":"irish","name":"Íris","serviceId":"ga"},{"id":"khmer","name":"ខ្មែរKCharselect unicode block name","serviceId":"km"},{"id":"gujarati","name":"ગુજરાતી","serviceId":"gu"},{"id":"slovak","name":"Slovenská","serviceId":"sk"},{"id":"kannada","name":"ಕನ್ನಡ್Name","serviceId":"kn"},{"id":"hebrew","name":"היברית","serviceId":"he"},{"id":"hungarian","name":"magyar","serviceId":"hu"},{"id":"marathi","name":"मराठीName","serviceId":"mr"},{"id":"tamil","name":"தாமில்","serviceId":"ta"},{"id":"estonian","name":"eesti keel","serviceId":"et"},{"id":"malayalam","name":"മലമാലം","serviceId":"ml"},{"id":"inuktitut","name":"ᐃᓄᒃᑎᑐᑦ","serviceId":"iu"},{"id":"arabic","name":"بالعربية","serviceId":"ar"},{"id":"deutsch","name":"Deutsch","serviceId":"de"},{"id":"slovene","name":"slovenščina","serviceId":"sl"},{"id":"bengali","name":"বেঙ্গালী","serviceId":"bn"},{"id":"urdu","name":"اوردو","serviceId":"ur"},{"id":"azerbaijani","name":"azerbaijani","serviceId":"az"},{"id":"portuguese","name":"português","serviceId":"pt"},{"id":"samoan","name":"lifiava","serviceId":"sm"},{"id":"afrikaans","name":"afrikaans","serviceId":"af"},{"id":"tongan","name":"汤加语","serviceId":"to"},{"id":"greek","name":"ελληνικά","serviceId":"el"},{"id":"indonesian","name":"IndonesiaName","serviceId":"id"},{"id":"spanish","name":"Español","serviceId":"es"},{"id":"danish","name":"dansk","serviceId":"da"},{"id":"amharic","name":"amharic","serviceId":"am"},{"id":"punjabi","name":"ਪੰਜਾਬੀName","serviceId":"pa"},{"id":"albanian","name":"albanian","serviceId":"sq"},{"id":"lithuanian","name":"Lietuva","serviceId":"lt"},{"id":"italian","name":"italiano","serviceId":"it"},{"id":"vietnamese","name":"Tiếng Việt","serviceId":"vi"},{"id":"korean","name":"한국어","serviceId":"ko"},{"id":"maltese","name":"Malti","serviceId":"mt"},{"id":"finnish","name":"suomi","serviceId":"fi"},{"id":"catalan","name":"català","serviceId":"ca"},{"id":"croatian","name":"hrvatski","serviceId":"hr"},{"id":"bosnian","name":"bosnian","serviceId":"bs-Latn"},{"id":"polish","name":"Polski","serviceId":"pl"},{"id":"latvian","name":"latviešu","serviceId":"lv"},{"id":"maori","name":"Maori","serviceId":"mi"}],
4448
+ json:[{"id":"ukrainian","name":"Україна","serviceId":"uk"},{"id":"norwegian","name":"Norge","serviceId":"no"},{"id":"welsh","name":"Iaith Weleg","serviceId":"cy"},{"id":"dutch","name":"nederlands","serviceId":"nl"},{"id":"japanese","name":"日本語","serviceId":"ja"},{"id":"filipino","name":"Pilipino","serviceId":"fil"},{"id":"english","name":"English","serviceId":"en"},{"id":"lao","name":"ກະຣຸນາ","serviceId":"lo"},{"id":"telugu","name":"తెలుగుName","serviceId":"te"},{"id":"romanian","name":"Română","serviceId":"ro"},{"id":"nepali","name":"नेपालीName","serviceId":"ne"},{"id":"french","name":"Français","serviceId":"fr"},{"id":"haitian_creole","name":"Kreyòl ayisyen","serviceId":"ht"},{"id":"czech","name":"český","serviceId":"cs"},{"id":"swedish","name":"Svenska","serviceId":"sv"},{"id":"russian","name":"Русский язык","serviceId":"ru"},{"id":"malagasy","name":"Malagasy","serviceId":"mg"},{"id":"burmese","name":"ဗာရမ်","serviceId":"my"},{"id":"pashto","name":"پښتوName","serviceId":"ps"},{"id":"thai","name":"คนไทย","serviceId":"th"},{"id":"armenian","name":"Արմենյան","serviceId":"hy"},{"id":"chinese_simplified","name":"简体中文","serviceId":"zh-CHS"},{"id":"persian","name":"Persian","serviceId":"fa"},{"id":"chinese_traditional","name":"繁體中文","serviceId":"zh-CHT"},{"id":"kurdish","name":"Kurdî","serviceId":"ku"},{"id":"turkish","name":"Türkçe","serviceId":"tr"},{"id":"hindi","name":"हिन्दी","serviceId":"hi"},{"id":"bulgarian","name":"български","serviceId":"bg"},{"id":"malay","name":"Malay","serviceId":"ms"},{"id":"swahili","name":"Kiswahili","serviceId":"sw"},{"id":"oriya","name":"ଓଡିଆ","serviceId":"or"},{"id":"icelandic","name":"ÍslandName","serviceId":"is"},{"id":"irish","name":"Íris","serviceId":"ga"},{"id":"khmer","name":"ភាសា​ខ្មែរName","serviceId":"km"},{"id":"gujarati","name":"ગુજરાતી","serviceId":"gu"},{"id":"slovak","name":"Slovenská","serviceId":"sk"},{"id":"kannada","name":"ಕನ್ನಡ್Name","serviceId":"kn"},{"id":"hebrew","name":"היברית","serviceId":"he"},{"id":"hungarian","name":"magyar","serviceId":"hu"},{"id":"marathi","name":"मराठीName","serviceId":"mr"},{"id":"tamil","name":"தாமில்","serviceId":"ta"},{"id":"estonian","name":"eesti keel","serviceId":"et"},{"id":"malayalam","name":"മലമാലം","serviceId":"ml"},{"id":"inuktitut","name":"ᐃᓄᒃᑎᑐᑦ","serviceId":"iu"},{"id":"arabic","name":"بالعربية","serviceId":"ar"},{"id":"deutsch","name":"Deutsch","serviceId":"de"},{"id":"slovene","name":"slovenščina","serviceId":"sl"},{"id":"bengali","name":"বেঙ্গালী","serviceId":"bn"},{"id":"urdu","name":"اوردو","serviceId":"ur"},{"id":"azerbaijani","name":"azerbaijani","serviceId":"az"},{"id":"portuguese","name":"português","serviceId":"pt"},{"id":"samoan","name":"lifiava","serviceId":"sm"},{"id":"afrikaans","name":"afrikaans","serviceId":"af"},{"id":"tongan","name":"汤加语","serviceId":"to"},{"id":"greek","name":"ελληνικά","serviceId":"el"},{"id":"indonesian","name":"IndonesiaName","serviceId":"id"},{"id":"spanish","name":"Español","serviceId":"es"},{"id":"danish","name":"dansk","serviceId":"da"},{"id":"amharic","name":"amharic","serviceId":"am"},{"id":"punjabi","name":"ਪੰਜਾਬੀName","serviceId":"pa"},{"id":"albanian","name":"albanian","serviceId":"sq"},{"id":"lithuanian","name":"Lietuva","serviceId":"lt"},{"id":"italian","name":"italiano","serviceId":"it"},{"id":"vietnamese","name":"Tiếng Việt","serviceId":"vi"},{"id":"korean","name":"한국어","serviceId":"ko"},{"id":"maltese","name":"Malti","serviceId":"mt"},{"id":"finnish","name":"suomi","serviceId":"fi"},{"id":"catalan","name":"català","serviceId":"ca"},{"id":"croatian","name":"hrvatski","serviceId":"hr"},{"id":"bosnian","name":"bosnian","serviceId":"bs-Latn"},{"id":"polish","name":"Polski","serviceId":"pl"},{"id":"latvian","name":"latviešu","serviceId":"lv"},{"id":"maori","name":"Maori","serviceId":"mi"}],
4367
4449
  /*
4368
4450
  获取map形式的语言列表
4369
4451
  key为 translate.service 的 name
@@ -4815,16 +4897,21 @@ var translate = {
4815
4897
  if(data == null || typeof(data) == 'undefined'){
4816
4898
  data = {};
4817
4899
  }
4818
- //加入浏览器默认语种 v3.6.1 增加,以便更好的进行自动切换语种
4819
- data.browserDefaultLanguage = translate.util.browserDefaultLanguage();
4820
- if(typeof(translate.enterprise.key) != 'undefined' && typeof(translate.enterprise.key) == 'string' && translate.enterprise.key.length > 0){
4821
- data.key = translate.enterprise.key;
4822
- }
4823
-
4900
+
4824
4901
  if(typeof(data) == 'string'){
4825
4902
  params = data; //payload 方式
4826
4903
  }else{
4827
4904
  //表单提交方式
4905
+
4906
+ //加入浏览器默认语种 v3.6.1 增加,以便更好的进行自动切换语种
4907
+ data.browserDefaultLanguage = translate.util.browserDefaultLanguage();
4908
+
4909
+ //加入key
4910
+ if(typeof(translate.enterprise.key) != 'undefined' && typeof(translate.enterprise.key) == 'string' && translate.enterprise.key.length > 0){
4911
+ data.key = translate.enterprise.key;
4912
+ }
4913
+
4914
+ //组合参数
4828
4915
  for(var index in data){
4829
4916
  if(params.length > 0){
4830
4917
  params = params + '&';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18n-jsautotranslate",
3
- "version": "3.12.5",
3
+ "version": "3.12.9",
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": {