i18n-jsautotranslate 3.18.62 → 3.18.66

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/index.js CHANGED
@@ -14,7 +14,7 @@ var translate = {
14
14
  * 格式:major.minor.patch.date
15
15
  */
16
16
  // AUTO_VERSION_START
17
- version: '3.18.62.20250928',
17
+ version: '3.18.66.20250930',
18
18
  // AUTO_VERSION_END
19
19
  /*
20
20
  当前使用的版本,默认使用v2. 可使用 setUseVersion2();
@@ -24,7 +24,7 @@ var translate = {
24
24
  /*js translate.setUseVersion2 start*/
25
25
  setUseVersion2:function(){
26
26
  translate.useVersion = 'v2';
27
- console.log('提示:自 v2.10 之后的版本默认就是使用V2版本(当前版本为:'+translate.version+'), translate.setUseVersion2() 可以不用再加这一行了。当然加了也无所谓,只是加了跟不加是完全一样的。');
27
+ translate.log('提示:自 v2.10 之后的版本默认就是使用V2版本(当前版本为:'+translate.version+'), translate.setUseVersion2() 可以不用再加这一行了。当然加了也无所谓,只是加了跟不加是完全一样的。');
28
28
  },
29
29
  /*js translate.setUseVersion2 end*/
30
30
  /*
@@ -49,6 +49,12 @@ var translate = {
49
49
  resourcesUrl:'//res.zvo.cn/translate',
50
50
  /*js translate.resourcesUrl end*/
51
51
 
52
+ /*js translate.log start*/
53
+ log: function(obj){
54
+ console.log(obj);
55
+ },
56
+ /*js translate.log end*/
57
+
52
58
  /**
53
59
  * 默认出现的选择语言的 select 选择框,可以通过这个选择切换语言。
54
60
  */
@@ -161,7 +167,7 @@ var translate = {
161
167
  if(document.getElementById(translate.selectLanguageTag.documentId) == null){
162
168
  var findBody = document.getElementsByTagName('body');
163
169
  if(findBody.length == 0){
164
- console.log('body tag not find, translate.selectLanguageTag.render() is not show Select Language');
170
+ translate.log('body tag not find, translate.selectLanguageTag.render() is not show Select Language');
165
171
  return;
166
172
  }
167
173
  var body_trans = findBody[0];
@@ -181,7 +187,7 @@ var translate = {
181
187
  //从接口加载语种
182
188
  translate.request.post(translate.request.api.language, {}, function(data){
183
189
  if(data.result == 0){
184
- console.log('load language list error : '+data.info);
190
+ translate.log('load language list error : '+data.info);
185
191
  return;
186
192
  }
187
193
  //console.log(data.list);
@@ -263,8 +269,8 @@ var translate = {
263
269
  * 已废弃,v1使用的
264
270
  */
265
271
  execute_v1:function(){
266
- console.log('=====ERROR======');
267
- console.log('The v1 version has been discontinued since 2022. Please use the latest V3 version and refer to: http://translate.zvo.cn/41162.html');
272
+ translate.log('=====ERROR======');
273
+ translate.log('The v1 version has been discontinued since 2022. Please use the latest V3 version and refer to: http://translate.zvo.cn/41162.html');
268
274
  },
269
275
  /*js translate.execute_v1 end*/
270
276
 
@@ -328,7 +334,7 @@ var translate = {
328
334
  var v1 = ',en,de,hi,lt,hr,lv,ht,hu,zh-CN,hy,uk,mg,id,ur,mk,ml,mn,af,mr,uz,ms,el,mt,is,it,my,es,et,eu,ar,pt-PT,ja,ne,az,fa,ro,nl,en-GB,no,be,fi,ru,bg,fr,bs,sd,se,si,sk,sl,ga,sn,so,gd,ca,sq,sr,kk,st,km,kn,sv,ko,sw,gl,zh-TW,pt-BR,co,ta,gu,ky,cs,pa,te,tg,th,la,cy,pl,da,tr,';
329
335
  if(v1.indexOf(','+languageName+',') > -1){
330
336
  //用的是v1.x
331
- console.log('您使用的是v1版本的切换语种方式,v1已在2021年就以废弃,请更换为v2,参考文档: http://translate.zvo.cn/41549.html');
337
+ translate.log('您使用的是v1版本的切换语种方式,v1已在2021年就以废弃,请更换为v2,参考文档: http://translate.zvo.cn/41549.html');
332
338
  translate.check();
333
339
 
334
340
  var googtrans = '/'+translate.localLanguage+'/'+languageName;
@@ -380,7 +386,7 @@ var translate = {
380
386
  }
381
387
  }catch(e){
382
388
  //增加try,避免异常导致无法用
383
- console.log(e);
389
+ translate.log(e);
384
390
  }
385
391
 
386
392
  translate.time.log('iframe 完成');
@@ -436,7 +442,7 @@ var translate = {
436
442
  }
437
443
  }catch(e){
438
444
  //增加try,避免异常,比如跨域,中断导致无法用
439
- console.log(e);
445
+ translate.log(e);
440
446
  }
441
447
  }
442
448
  }
@@ -460,7 +466,7 @@ var translate = {
460
466
  /*js translate.check start*/
461
467
  check:function(){
462
468
  if(window.location.protocol == 'file:'){
463
- console.log('\r\n---WARNING----\r\ntranslate.js 主动翻译组件自检异常,当前协议是file协议,翻译组件要在正常的线上http、https协议下才能正常使用翻译功能\r\n------------');
469
+ translate.log('\r\n---WARNING----\r\ntranslate.js 主动翻译组件自检异常,当前协议是file协议,翻译组件要在正常的线上http、https协议下才能正常使用翻译功能\r\n------------');
464
470
  }
465
471
  },
466
472
  /*js translate.check end*/
@@ -512,6 +518,12 @@ var translate = {
512
518
  if(ele == null || typeof(ele) == 'undefined'){
513
519
  return false;
514
520
  }
521
+ if(ele.nodeType === 2){ //是属性,将其转为元素判断,因为当前忽略配置,是针对元素配置的
522
+ ele = ele.ownerElement;
523
+ }else if(ele.nodeType === 3){
524
+ //文本节点,转为元素
525
+ ele = ele.parentNode;
526
+ }
515
527
 
516
528
  var parentNode = ele;
517
529
  var maxnumber = 100; //最大循环次数,避免死循环
@@ -685,10 +697,10 @@ var translate = {
685
697
  //如果from未传入,则自动识别当前页面的语种为from
686
698
  //如果自动识别,也要确保是页面加载完后,免得放到了head里,那肯定啥也识别不出来
687
699
  if(document.body == null){
688
- console.log('使用错误!你使用自定义术语 translate.nomenclature.append 时,from 未传值,此时 translate.js 会自动识别当前翻译区域的内容是什么语种,但是你当前吧 translate.nomenclature.append 放在了body之前就加载了,body都还没加载出来,翻译区域当前无内容,所以无法识别当前页面的语种。请将 translate.nomenclature.append 放在翻译内容加载完后再执行 (注意,要将 translate.nomenclature.append 放在 translate.execute() 的前面),建议将 translate.nomenclature.append 放在 </body> 跟 </html> 之间。');
700
+ translate.log('使用错误!你使用自定义术语 translate.nomenclature.append 时,from 未传值,此时 translate.js 会自动识别当前翻译区域的内容是什么语种,但是你当前吧 translate.nomenclature.append 放在了body之前就加载了,body都还没加载出来,翻译区域当前无内容,所以无法识别当前页面的语种。请将 translate.nomenclature.append 放在翻译内容加载完后再执行 (注意,要将 translate.nomenclature.append 放在 translate.execute() 的前面),建议将 translate.nomenclature.append 放在 </body> 跟 </html> 之间。');
689
701
  }else{
690
702
  if (document.readyState === 'loading') {
691
- console.log('使用异常告警:你使用的自定义术语 translate.nomenclature.append 时,from 未传值,此时 translate.js 会自动识别当前翻译区域的内容是什么语种,但页面Dom还未加载完毕时就触发了它,如果翻译区域当前无内容或者内容不是完整的,会造成识别当前页面的语种会有异常不准确,你需要仔细确认这个问题。建议将 translate.nomenclature.append 放在 </body> 跟 </html> 之间。');
703
+ translate.log('使用异常告警:你使用的自定义术语 translate.nomenclature.append 时,from 未传值,此时 translate.js 会自动识别当前翻译区域的内容是什么语种,但页面Dom还未加载完毕时就触发了它,如果翻译区域当前无内容或者内容不是完整的,会造成识别当前页面的语种会有异常不准确,你需要仔细确认这个问题。建议将 translate.nomenclature.append 放在 </body> 跟 </html> 之间。');
692
704
  }
693
705
  }
694
706
 
@@ -759,8 +771,7 @@ var translate = {
759
771
  * 如果传入 null,则不进行任何替换操作
760
772
  * 如果传入具体的值,则是:
761
773
  * {
762
- * node: node节点
763
- * attribute: 要替换的node的attribute名称。如果传入 null,则是直接对 nodeValue 生效
774
+ * node: node节点 ,要改动的文字所在的node节点。 如果改动的文字比如是 div 的title中,那么这里传入的node应该是 title 的node,而不是 div 的node
764
775
  * }
765
776
  *
766
777
  * @returns {
@@ -893,8 +904,7 @@ var translate = {
893
904
  如果传入 null,则不进行任何替换操作
894
905
  如果传入具体的值,则是:
895
906
  {
896
- node: node节点
897
- attribute: 要替换的node的attribute名称。如果传入 null,则是直接对 nodeValue 生效
907
+ node: node节点 ,要改动的文字所在的node节点。 如果改动的文字比如是 div 的title中,那么这里传入的node应该是 title 的node,而不是 div 的node
898
908
  }
899
909
 
900
910
 
@@ -1084,7 +1094,7 @@ var translate = {
1084
1094
  */
1085
1095
  set: async function(hash, originalText, toLanguage, translateText){
1086
1096
  if(typeof(translate.storage.IndexedDB) == 'undefined'){
1087
- console.log('ERROR: translate.storage.IndexedDB not find');
1097
+ translate.log('ERROR: translate.storage.IndexedDB not find');
1088
1098
  return;
1089
1099
  }
1090
1100
  var obj = await translate.storage.IndexedDB.get('hash_'+hash);
@@ -1104,11 +1114,11 @@ var translate = {
1104
1114
  */
1105
1115
  export: async function(to){
1106
1116
  if(typeof(translate.storage.IndexedDB) == 'undefined'){
1107
- console.log('ERROR: translate.storage.IndexedDB not find');
1117
+ translate.log('ERROR: translate.storage.IndexedDB not find');
1108
1118
  return;
1109
1119
  }
1110
1120
  if(typeof(to) != 'string'){
1111
- console.log('error : to param not find, example: "english"');
1121
+ translate.log('error : to param not find, example: "english"');
1112
1122
  return;
1113
1123
  }
1114
1124
  var text = 'translate.office.append(\'';
@@ -1303,6 +1313,54 @@ var translate = {
1303
1313
  //console.log('refresh ignore finish: '+Object.keys(translate.listener.ignoreNode).length);
1304
1314
  },
1305
1315
 
1316
+ /*
1317
+ 用于监听发生改变的这个 node 是否有正常需要翻译的内容、以及是否是非translate.js触发的需要被翻译。
1318
+ 注意,传入进行判断的node中的文本必须是 node.nodeValue ,也就是这个必须是 node.nodeType == 2(某个元素的属性,比如 input 的 placeholder) 或 3(文本节点), 这样他们才会有正常的 node.nodeValue,而且文本也存在于 node.nodeValue 中
1319
+ 比如 div title="你好" ,要对 title 的 你好 这个值进行判定,传入的node必须是 title 的 node,而非 div 的 node
1320
+ 它主要是为了给 translate.listener.addListener 中的动态监听node改变所服务的
1321
+
1322
+ @param node 要判断的这个是否需要触发翻译的node
1323
+ @return boolean true:需要触发 translate.execute(node) 进行翻译
1324
+ */
1325
+ nodeValueChangeNeedTranslate: function(node){
1326
+ //是否是要加入翻译扫描触发执行,是则是true
1327
+ var addTranslateExecute = true;
1328
+
1329
+ /*
1330
+ 不会进入翻译的情况 -
1331
+ 1. 认为是有 translate.js 本身翻译导致的改变,不进行翻译
1332
+ 取 translate.node.data 中的数据,当改变的node节点在其中找到了对应的数据后,进行判定
1333
+ 1. 是整体翻译,且当前node改变后的内容,跟上次翻译后的结果一样,那说明当前node改变事件
1334
+ 2. 不是整体翻译,可能是触发自定义术语、或直接没启用整体翻译能力,那就要根据最后翻译时间这个来判定了。如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过500毫秒
1335
+ 2. 其他的情况如果后续发现有遗漏,再加入,当前没有这种考虑
1336
+ */
1337
+ if(translate.node.get(node) != null){
1338
+ if(typeof(translate.node.get(node).whole) !== 'undefined' && translate.node.get(node).whole == true){
1339
+ //整体翻译
1340
+ if(typeof(translate.node.get(node).resultText) !== 'undefined' && translate.node.get(node).resultText === node.nodeValue){
1341
+ //当前改变后的内容,跟上次翻译后的结果一样,那说明当前node改变事件,是有translate.js 本身翻译导致的,不进行翻译
1342
+ addTranslateExecute = false;
1343
+ }
1344
+ }else{
1345
+ //不是整体翻译,可能是触发自定义术语、或直接没启用整体翻译能力
1346
+ //这就要根据最后翻译时间这个来判定了
1347
+ if(typeof(translate.node.get(node).lastTranslateRenderTime) == 'number' && translate.node.get(node).lastTranslateRenderTime + 500 > Date.now()){
1348
+ //如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过500毫秒,那认为这个元素动态改变,是有translate.js 本身引起的,将不做任何动作
1349
+ addTranslateExecute = false;
1350
+ }
1351
+ }
1352
+ }
1353
+
1354
+ //如果新的里面没有非空白字符的值,那也不再触发翻译
1355
+ if(addTranslateExecute === true){
1356
+ if(node.nodeValue.trim().length === 0){
1357
+ addTranslateExecute = false;
1358
+ }
1359
+ }
1360
+
1361
+ return addTranslateExecute;
1362
+ },
1363
+
1306
1364
 
1307
1365
  //增加监听,开始监听。这个不要直接调用,需要使用上面的 start() 开启
1308
1366
  addListener:function(){
@@ -1339,61 +1397,47 @@ var translate = {
1339
1397
  }
1340
1398
  }
1341
1399
  }else if (mutation.type === 'attributes') {
1342
- //console.log(mutation);
1343
- if(mutation.attributeName === 'class'){
1344
- //如果是class,不做任何改变,直接跳出
1400
+ if(mutation.attributeName === 'class' || mutation.attributeName === 'style'){
1401
+ //如果是class/ style 这种常见的,不做任何改变,直接跳出
1345
1402
  continue;
1346
1403
  }
1347
- //console.log('listener attributes change --> ' + mutation.target.nodeName+'['+ mutation.attributeName + '] oldValue :'+mutation.oldValue);
1348
1404
 
1349
- if(translate.node.get(mutation.target) != null){
1350
-
1351
- if(typeof(translate.node.get(mutation.target).lastTranslateRenderTime) == 'number' && translate.node.get(mutation.target).lastTranslateRenderTime + 1000 > Date.now()){
1352
- //如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过1秒,那认为这个元素动态改变,是有translate.js 本身引起的,将不做任何动作
1405
+ /*
1406
+ 这里要判断一些允许翻译的属性
1407
+ input placeholder 属性 ,直接判断 placeholder 就行了,也就 input、textarea 有这个属性
1408
+ img 的 alt 属性
1409
+ 所有标签的 title 属性
1410
+ */
1411
+
1412
+ if(mutation.attributeName === 'placeholder' || mutation.attributeName === 'alt' || mutation.attributeName === 'title'){
1413
+ //允许翻译
1414
+ }else{
1415
+ //判断是否是 translate.element.tagAttribute 自定义翻译属性的
1416
+ var divTagAttribute = translate.element.tagAttribute[mutation.target.nodeName.toLowerCase()];
1417
+ if(typeof(divTagAttribute) !== 'undefined' && divTagAttribute.attribute.indexOf(mutation.attributeName) > -1 && divTagAttribute.condition(mutation.target)){
1418
+ //是自定义翻译这个属性的,以及判定是否达到翻译条件
1419
+ //条件满足,允许翻译
1353
1420
  }else{
1354
- //不是 translate.js 触发的改动
1355
- var nodeAttribute = translate.node.getAttribute(mutation.attributeName);
1356
- //console.log(translate.node.get(mutation.target)[nodeAttribute.key])
1357
- if(typeof(translate.node.get(mutation.target)[nodeAttribute.key]) != 'undefined'){
1358
- //从翻译历史中删掉,使这个属性还能继续被翻译
1359
- //console.log('delete translate.node.get(mutation.target)[nodeAttribute.key] -> '+mutation.attributeName);
1360
- delete translate.node.get(mutation.target)[nodeAttribute.key];
1361
- }
1421
+ //条件不满足,不在翻译的属性范围
1422
+ continue;
1362
1423
  }
1363
1424
  }
1364
1425
 
1365
- //最后,将这个属性加入待翻译
1366
- addNodes.push(mutation.target);
1426
+ //这里出现的 mutation.target 是定位到了元素上面,而不是变化的这个 attributes 属性上,需要用 mutation.attributeName 获取到这个属性的node
1427
+ var node = mutation.target.getAttributeNode(mutation.attributeName);
1428
+
1429
+ //是否是要加入翻译扫描触发执行,是则是true
1430
+ var addTranslateExecute = translate.listener.nodeValueChangeNeedTranslate(node);
1431
+ if(addTranslateExecute){ //不是 translate.js 翻译引起的改变,那么
1432
+ //console.log('listener attributes change ' + mutation.target.nodeName+'['+ mutation.attributeName + '] '+mutation.oldValue+' --> '+node.nodeValue);
1433
+ translate.node.delete(node);
1434
+ addNodes = [node]; //将这个属性转为的node加入待翻译
1435
+ }
1367
1436
  }else if(mutation.type === 'characterData'){
1368
1437
  //内容改变
1369
1438
 
1370
1439
  //是否是要加入翻译扫描触发执行,是则是true
1371
- var addTranslateExecute = true;
1372
-
1373
- /*
1374
- 不会进入翻译的情况 -
1375
- 1. 认为是有 translate.js 本身翻译导致的改变,不进行翻译
1376
- 取 translate.node.data 中的数据,当改变的node节点在其中找到了对应的数据后,进行判定
1377
- 1. 是整体翻译,且当前node改变后的内容,跟上次翻译后的结果一样,那说明当前node改变事件
1378
- 2. 不是整体翻译,可能是触发自定义术语、或直接没启用整体翻译能力,那就要根据最后翻译时间这个来判定了。如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过500毫秒
1379
- 2. 其他的情况如果后续发现有遗漏,再加入,当前没有这种考虑
1380
- */
1381
- if(translate.node.get(mutation.target) != null && typeof(translate.node.get(mutation.target).translate_default_value) != 'undefined'){
1382
- if(typeof(translate.node.get(mutation.target).translate_default_value.whole) != 'undefined' && translate.node.get(mutation.target).translate_default_value.whole == true){
1383
- //整体翻译
1384
- if(typeof(translate.node.get(mutation.target).translate_default_value.resultText) != 'undefined' && translate.node.get(mutation.target).translate_default_value.resultText === mutation.target.nodeValue){
1385
- //当前改变后的内容,跟上次翻译后的结果一样,那说明当前node改变事件,是有translate.js 本身翻译导致的,不进行翻译
1386
- addTranslateExecute = false;
1387
- }
1388
- }else{
1389
- //不是整体翻译,可能是触发自定义术语、或直接没启用整体翻译能力
1390
- //这就要根据最后翻译时间这个来判定了
1391
- if(typeof(translate.node.get(mutation.target).lastTranslateRenderTime) == 'number' && translate.node.get(mutation.target).lastTranslateRenderTime + 500 > Date.now()){
1392
- //如果这个node元素,已经被翻译过了,最后一次翻译渲染时间,距离当前时间不超过500毫秒,那认为这个元素动态改变,是有translate.js 本身引起的,将不做任何动作
1393
- addTranslateExecute = false;
1394
- }
1395
- }
1396
- }
1440
+ var addTranslateExecute = translate.listener.nodeValueChangeNeedTranslate(mutation.target);
1397
1441
 
1398
1442
  if(addTranslateExecute){ //不是 translate.js 翻译引起的改变,那么
1399
1443
  translate.node.delete(mutation.target);
@@ -1422,10 +1466,8 @@ var translate = {
1422
1466
  }
1423
1467
  }
1424
1468
 
1425
- //console.log(documents.length);
1426
1469
  if(documents.length > 0){
1427
1470
  //有变动,需要看看是否需要翻译,延迟10毫秒执行
1428
-
1429
1471
  translate.time.log('监听到元素发生变化,'+documents.length+'个元素');
1430
1472
 
1431
1473
  //判断是否属于在正在翻译的节点,重新组合出新的要翻译的node集合
@@ -1467,7 +1509,7 @@ var translate = {
1467
1509
  //console.log('translateNodeslength: '+translateNodes.length);
1468
1510
 
1469
1511
  translate.time.log('将监听到的发生变化的元素进行整理,得到'+translateNodes.length+'个元素,对其进行翻译');
1470
- //console.log(translateNodes[0]);
1512
+ //console.log(translateNodes);
1471
1513
 
1472
1514
  translate.execute(translateNodes);
1473
1515
  //setTimeout(function() {
@@ -1514,7 +1556,7 @@ var translate = {
1514
1556
  try{
1515
1557
  translate.listener.execute.renderStartByApi[i](uuid, from, to);
1516
1558
  }catch(e){
1517
- console.log(e);
1559
+ translate.log(e);
1518
1560
  }
1519
1561
  }
1520
1562
  },
@@ -1533,7 +1575,7 @@ var translate = {
1533
1575
  try{
1534
1576
  translate.listener.execute.renderFinishByApi[i](uuid, from, to);
1535
1577
  }catch(e){
1536
- console.log(e);
1578
+ translate.log(e);
1537
1579
  }
1538
1580
  }
1539
1581
  }
@@ -1688,13 +1730,26 @@ var translate = {
1688
1730
 
1689
1731
 
1690
1732
  // translate.node 记录
1691
- var nodeAttribute = translate.node.getAttribute(task['attribute']);
1692
- if(translate.node.data.get(this.nodes[hash][task_index]) != null){
1733
+
1734
+ var translateNode; //当前操作的,要记录入 translate.node 中的,进行翻译的node
1735
+ var translateNode_attribute = ''; //当前操作的是node中的哪个attribute,如果没有是node本身则是空字符串
1736
+ if(typeof(task['attribute']) === 'string' && task['attribute'].length > 0){
1737
+ //当前渲染任务是针对的元素的某个属性,这是要取出这个元素的具体属性,作为一个目的 node 来进行加入 translate.node
1738
+ //是操作的元素的某个属性
1739
+ translateNode = this.nodes[hash][node_index].getAttributeNode(task['attribute']);
1740
+ translateNode_attribute = task['attribute'];
1741
+ }else{
1742
+ //操作的就是node本身
1743
+ translateNode = this.nodes[hash][node_index];
1744
+ }
1745
+ //console.log(translateNode)
1746
+ //var nodeAttribute = translate.node.getAttribute(task['attribute']);
1747
+ if(translate.node.data.get(translateNode) != null){
1693
1748
  // 记录当前有 translate.js 所触发翻译之后渲染到dom界面显示的时间,13位时间戳
1694
- translate.node.get(this.nodes[hash][task_index]).lastTranslateRenderTime = Date.now();
1749
+ translate.node.get(translateNode).lastTranslateRenderTime = Date.now();
1695
1750
  }else{
1696
- console.log('执行异常,渲染时,node未在 nodeHistory 中找到, 这个理论上是不应该存在的,当前异常已被容错。 node:'+this.nodes[hash][task_index]);
1697
- console.log(this.nodes[hash][task_index]);
1751
+ translate.log('执行异常,渲染时,node 未在 translate.node 中找到, 这个理论上是不应该存在的,当前异常已被容错。 node:'+translateNode);
1752
+ translate.log(this.nodes[hash][task_index]);
1698
1753
  }
1699
1754
 
1700
1755
  //渲染页面进行翻译显示
@@ -1702,22 +1757,14 @@ var translate = {
1702
1757
  var analyseSet = translate.element.nodeAnalyse.set(this.nodes[hash][task_index], task.originalText, task.resultText, task['attribute']);
1703
1758
  //console.log(analyseSet);
1704
1759
 
1705
- if(translate.node.data.get(this.nodes[hash][task_index]) != null){
1706
- if(typeof(translate.node.get(this.nodes[hash][task_index])[nodeAttribute.key]) == 'undefined'){
1707
- //这里不应该的
1708
- console.log('执行异常,渲染时,node 的 '+(nodeAttribute.attribute.length == 0? 'nodeValue':'attribute : '+nodeAttribute.attribute)+' 未在 nodeHistory 中找到, 这个理论上是不应该存在的,当前异常已被容错。 node:'+this.nodes[hash][task_index]);
1709
- }else{
1710
- //将具体通过文本翻译接口进行翻译的文本记录到 translate.node.data
1711
- translate.node.get(this.nodes[hash][task_index])[nodeAttribute.key].translateTexts[task.originalText] = task.resultText;
1712
- //将翻译完成后要显示出的文本进行记录
1713
- translate.node.get(this.nodes[hash][task_index])[nodeAttribute.key].resultText = analyseSet.resultText;
1760
+ if(translate.node.data.get(translateNode) != null){
1761
+ //将具体通过文本翻译接口进行翻译的文本记录到 translate.node.data
1762
+ translate.node.get(translateNode).translateTexts[task.originalText] = task.resultText;
1763
+ //将翻译完成后要显示出的文本进行记录
1764
+ translate.node.get(translateNode).resultText = analyseSet.resultText;
1714
1765
 
1715
- //将其加入 translate.history.translateTexts
1716
- translate.history.translateText.add(translate.node.get(this.nodes[hash][task_index])[nodeAttribute.key].originalText ,analyseSet.resultText);
1717
- }
1718
- }else{
1719
- console.log('执行异常,渲染时,node未在 nodeHistory 中找到, 这个理论上是不应该存在的,当前异常已被容错。 node:'+this.nodes[hash][task_index]);
1720
- console.log(this.nodes[hash][task_index]);
1766
+ //将其加入 translate.history.translateTexts
1767
+ translate.history.translateText.add(translate.node.get(translateNode).originalText ,analyseSet.resultText);
1721
1768
  }
1722
1769
 
1723
1770
  //加入 translate.listener.ignoreNode
@@ -1824,7 +1871,7 @@ var translate = {
1824
1871
  if(translate.waitingExecute.queue.length > 0){
1825
1872
  return translate.waitingExecute.queue.shift();
1826
1873
  }else{
1827
- console.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
1874
+ translate.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
1828
1875
  return null;
1829
1876
  }
1830
1877
  },
@@ -1850,12 +1897,14 @@ var translate = {
1850
1897
  translate.listener.execute.renderFinishByApiRun(uuid, from, to);
1851
1898
 
1852
1899
  //通过 uuid、from 取得本次翻译相关的 texts、nodes , 触发 translateNetworkAfter_Trigger 钩子
1900
+ //获取请求日志
1901
+ var requestData = translate.request.data[uuid].list[from][to];
1853
1902
  translate.lifecycle.execute.translateNetworkAfter_Trigger({
1854
1903
  uuid: uuid,
1855
1904
  from: from,
1856
1905
  to: to,
1857
- texts: translate.request.data[uuid].list[from].texts,
1858
- nodes: translate.request.data[uuid].list[from].nodes,
1906
+ texts: requestData.texts,
1907
+ nodes: requestData.nodes,
1859
1908
  result: result,
1860
1909
  info: info
1861
1910
  });
@@ -1904,7 +1953,7 @@ var translate = {
1904
1953
  try{
1905
1954
  translate.lifecycle.changeLanguage[i](to);
1906
1955
  }catch(e){
1907
- console.log(e);
1956
+ translate.log(e);
1908
1957
  }
1909
1958
  }
1910
1959
  },
@@ -1942,7 +1991,7 @@ var translate = {
1942
1991
  isNextExecute = false;
1943
1992
  }
1944
1993
  }catch(e){
1945
- console.log(e);
1994
+ translate.log(e);
1946
1995
  }
1947
1996
  }
1948
1997
  return isNextExecute;
@@ -1968,13 +2017,13 @@ var translate = {
1968
2017
  try{
1969
2018
  translate.lifecycle.execute.start[i](data.uuid, data.to);
1970
2019
  }catch(e){
1971
- console.log(e);
2020
+ translate.log(e);
1972
2021
  }
1973
2022
  }else{
1974
2023
  try{
1975
2024
  translate.lifecycle.execute.start[i](data);
1976
2025
  }catch(e){
1977
- console.log(e);
2026
+ translate.log(e);
1978
2027
  }
1979
2028
  }
1980
2029
 
@@ -1990,7 +2039,7 @@ var translate = {
1990
2039
  try{
1991
2040
  translate.listener.execute.renderStartByApi[i](uuid, from, to);
1992
2041
  }catch(e){
1993
- console.log(e);
2042
+ translate.log(e);
1994
2043
  }
1995
2044
  }
1996
2045
  },
@@ -2041,14 +2090,14 @@ var translate = {
2041
2090
  try{
2042
2091
  translate.lifecycle.execute.translateNetworkBefore[i](data.uuid, data.from, data.to, data.texts);
2043
2092
  }catch(e){
2044
- console.log(e);
2093
+ translate.log(e);
2045
2094
  }
2046
2095
  }else{
2047
2096
  //2025.9.15 之后的新的
2048
2097
  try{
2049
2098
  translate.lifecycle.execute.translateNetworkBefore[i](data);
2050
2099
  }catch(e){
2051
- console.log(e);
2100
+ translate.log(e);
2052
2101
  }
2053
2102
  }
2054
2103
 
@@ -2073,7 +2122,7 @@ var translate = {
2073
2122
  try{
2074
2123
  translate.lifecycle.execute.translateNetworkAfter[i](data);
2075
2124
  }catch(e){
2076
- console.log(e);
2125
+ translate.log(e);
2077
2126
  }
2078
2127
  }
2079
2128
  },
@@ -2097,7 +2146,7 @@ var translate = {
2097
2146
  try{
2098
2147
  translate.lifecycle.execute.renderFinish[i](uuid, to);
2099
2148
  }catch(e){
2100
- console.log(e);
2149
+ translate.log(e);
2101
2150
  }
2102
2151
  }
2103
2152
  },
@@ -2128,7 +2177,7 @@ var translate = {
2128
2177
  try{
2129
2178
  translate.lifecycle.execute.finally[i](data);
2130
2179
  }catch(e){
2131
- console.log(e);
2180
+ translate.log(e);
2132
2181
  }
2133
2182
  }
2134
2183
  },
@@ -2223,8 +2272,8 @@ var translate = {
2223
2272
  if(sliceDoc[di].getAttribute('class') != null && typeof(sliceDoc[di].getAttribute('class')) == 'string' && sliceDoc[di].getAttribute('class').length > 0){
2224
2273
  sliceDocString = sliceDocString + " class="+sliceDoc[di].getAttribute('class');
2225
2274
  }
2226
- }else if(sliceDoc[di].nodeType === 3){
2227
- //node
2275
+ }else if(sliceDoc[di].nodeType === 2 || sliceDoc[di].nodeType === 3){
2276
+ //2属性 或 3文本节点
2228
2277
  sliceDocString = sliceDocString + sliceDoc[di].nodeValue.replaceAll(/\r?\n/g, '[换行符]');
2229
2278
  }
2230
2279
  }
@@ -2232,8 +2281,7 @@ var translate = {
2232
2281
  }
2233
2282
 
2234
2283
 
2235
- console.log('当前翻译未完结,新翻译任务已加入等待翻译队列,待上个翻译任务结束后便会执行当前翻译任务'+sliceDocString);
2236
- //console.log(docs);
2284
+ translate.log('当前翻译未完结,新翻译任务已加入等待翻译队列,待上个翻译任务结束后便会执行当前翻译任务'+sliceDocString);
2237
2285
  translate.waitingExecute.add(docs);
2238
2286
 
2239
2287
  //钩子
@@ -2267,7 +2315,7 @@ var translate = {
2267
2315
  //translate.execute_v1();
2268
2316
  //return;
2269
2317
  //v2.5.1增加
2270
- console.log('提示:https://github.com/xnx3/translate 在 v2.5 版本之后,由于谷歌翻译调整,免费翻译通道不再支持,所以v1版本的翻译接口不再被支持,v1全线下架。考虑到v1已不能使用,当前已自动切换到v2版本。如果您使用中发现什么异常,请针对v2版本进行适配。');
2318
+ translate.log('提示:https://github.com/xnx3/translate 在 v2.5 版本之后,由于谷歌翻译调整,免费翻译通道不再支持,所以v1版本的翻译接口不再被支持,v1全线下架。考虑到v1已不能使用,当前已自动切换到v2版本。如果您使用中发现什么异常,请针对v2版本进行适配。');
2271
2319
  translate.useVersion = 'v2';
2272
2320
  }
2273
2321
 
@@ -2296,7 +2344,7 @@ var translate = {
2296
2344
  try{
2297
2345
  translate.selectLanguageTag.render();
2298
2346
  }catch(e){
2299
- console.log(e);
2347
+ translate.log(e);
2300
2348
  }
2301
2349
 
2302
2350
  translate.time.log('渲染出选择语言的select窗口-已完成');
@@ -2364,8 +2412,8 @@ var translate = {
2364
2412
  //console.log(all)
2365
2413
 
2366
2414
  if(all.length > 500){
2367
- console.log('------tip------');
2368
- console.log('translate.execute( docs ) 传入的docs.length 过大,超过500,这很不正常,当前 docs.length : '+all.length+' ,如果你感觉真的没问题,请联系作者 http://translate.zvo.cn/43006.html 说明情况,根据你的情况进行分析。 当前只取前500个元素进行翻译');
2415
+ translate.log('------tip------');
2416
+ translate.log('translate.execute( docs ) 传入的docs.length 过大,超过500,这很不正常,当前 docs.length : '+all.length+' ,如果你感觉真的没问题,请联系作者 http://translate.zvo.cn/43006.html 说明情况,根据你的情况进行分析。 当前只取前500个元素进行翻译');
2369
2417
  }
2370
2418
 
2371
2419
  //初始化 translate.element.tagAttribute ,主要针对 v3.17.10 版本的适配调整,对 translate.element.tagAttribute 的设置做了改变,做旧版本的适配
@@ -2386,7 +2434,7 @@ var translate = {
2386
2434
  }
2387
2435
  }
2388
2436
  }catch(e){
2389
- console.log(e);
2437
+ translate.log(e);
2390
2438
  }
2391
2439
 
2392
2440
  translate.time.log('开始扫描要翻译区域的元素');
@@ -2417,8 +2465,8 @@ var translate = {
2417
2465
  if(typeof(translate.nodeQueue[uuid]) == 'undefined'){
2418
2466
  translate.nodeQueue[uuid] = new Array();
2419
2467
  translate.nodeQueue[uuid].list = [];
2420
- console.log('--- translate.js warn tip 警告!! ---');
2421
- console.log('您使用translate.js时可能放的位置不对,不要吧 translate.js 放在网页最顶部,这样当 translate.js 进行执行,也就是 translate.execute() 执行时,因为网页是从上往下加载,它放在网页最顶部,那么它执行时网页后面的内容都还没加载出来,这个是不会获取到网页任何内容的,也就是它是不起任何作用的');
2468
+ translate.log('--- translate.js warn tip 警告!! ---');
2469
+ translate.log('您使用translate.js时可能放的位置不对,不要吧 translate.js 放在网页最顶部,这样当 translate.js 进行执行,也就是 translate.execute() 执行时,因为网页是从上往下加载,它放在网页最顶部,那么它执行时网页后面的内容都还没加载出来,这个是不会获取到网页任何内容的,也就是它是不起任何作用的');
2422
2470
  }
2423
2471
  for(var lang in translate.nodeQueue[uuid].list){
2424
2472
  if (!translate.nodeQueue[uuid].list.hasOwnProperty(lang)) {
@@ -2881,7 +2929,7 @@ var translate = {
2881
2929
  //console.log(lang);
2882
2930
  //console.log(translate.nodeQueue[uuid]['list'][lang][thhash].nodes);
2883
2931
  if(typeof(translate.nodeQueue[uuid]['list'][lang][thhash].nodes) == 'undefined' || typeof(translate.nodeQueue[uuid]['list'][lang][thhash].nodes.length) == 'undefined'){
2884
- console.log('translate.nodeQueue[\''+uuid+'\'][\'list\'][\''+lang+'\'][\''+thhash+'\'].nodes.length is null ,理论上不应该存在,进行异常报出,但不影响使用,已容错。');
2932
+ translate.log('translate.nodeQueue[\''+uuid+'\'][\'list\'][\''+lang+'\'][\''+thhash+'\'].nodes.length is null ,理论上不应该存在,进行异常报出,但不影响使用,已容错。');
2885
2933
  continue;
2886
2934
  }
2887
2935
 
@@ -2922,6 +2970,11 @@ var translate = {
2922
2970
  将翻译请求的信息记录到 translate.js 本身中
2923
2971
  uuid 每次 translate.execute() 触发生成的uuid
2924
2972
  time: 触发后加入到 data 中的时间,13位时间戳
2973
+ list: 记录当前uuid下发起的网络请求
2974
+ from: 从什么语种进行的翻译,如: chinese_simplified
2975
+ to: 翻译为什么语种,如 : english
2976
+ nodes: 当前网络请求有哪些node节点,值为 [node1, node2, ...]
2977
+ texts: 当前网络请求有哪些文本进行翻译,值为 [text1, text2, ...]
2925
2978
 
2926
2979
  */
2927
2980
  translate.request.data[uuid] = {
@@ -2941,9 +2994,9 @@ var translate = {
2941
2994
  }
2942
2995
 
2943
2996
  if(typeof(translateTextArray[lang]) == 'undefined' || translateTextArray[lang].length < 1){
2944
- console.log('异常,理论上不应该存在, lang:'+lang+', translateTextArray:');
2945
- console.log(translateTextArray);
2946
- console.log('你无需担心,这个只是个提示,它并不影响你翻译的正常进行,只是个异常提示而已,它会自动容错处理的,不会影响翻译的使用。');
2997
+ translate.log('异常,理论上不应该存在, lang:'+lang+', translateTextArray:');
2998
+ translate.log(translateTextArray);
2999
+ translate.log('你无需担心,这个只是个提示,它并不影响你翻译的正常进行,只是个异常提示而已,它会自动容错处理的,不会影响翻译的使用。');
2947
3000
 
2948
3001
  translate.state = 0;
2949
3002
  translate.executeNumber++;
@@ -2992,8 +3045,10 @@ var translate = {
2992
3045
  });
2993
3046
 
2994
3047
  //记入请求日志
2995
- translate.request.data[uuid].list[lang] = {
2996
- to: translate.to,
3048
+ if(typeof(translate.request.data[uuid].list[lang]) === 'undefined'){
3049
+ translate.request.data[uuid].list[lang] = {};
3050
+ }
3051
+ translate.request.data[uuid].list[lang][translate.to] = {
2997
3052
  texts: translateTextArray[lang],
2998
3053
  nodes: translateTextNodes,
2999
3054
  };
@@ -3019,7 +3074,7 @@ var translate = {
3019
3074
  translate.translateRequest[uuid][data.from].executeFinish = 1; //1是执行完毕
3020
3075
  translate.translateRequest[uuid][data.from].stoptime = Math.floor(Date.now() / 1000);
3021
3076
  }else{
3022
- console.log('WARINNG!!! translate.translateRequest[uuid][data.from] is not object');
3077
+ translate.log('WARINNG!!! translate.translateRequest[uuid][data.from] is not object');
3023
3078
  }
3024
3079
 
3025
3080
  //为了兼容 v3.14以前的translate.service 版本,做了判断
@@ -3036,17 +3091,17 @@ var translate = {
3036
3091
  translate.waitingExecute.isAllExecuteFinish(uuid, from, to, 0, data.info);
3037
3092
 
3038
3093
 
3039
- console.log('=======ERROR START=======');
3040
- console.log(translateTextArray[data.from]);
3094
+ translate.log('=======ERROR START=======');
3095
+ translate.log(translateTextArray[data.from]);
3041
3096
  //console.log(encodeURIComponent(JSON.stringify(translateTextArray[data.from])));
3042
- console.log('response : '+data.info);
3043
- console.log('=======ERROR END =======');
3097
+ translate.log('response : '+data.info);
3098
+ translate.log('=======ERROR END =======');
3044
3099
  //translate.temp_executeFinishNumber++; //记录执行完的次数
3045
3100
  return;
3046
3101
  }
3047
3102
 
3048
3103
  if(typeof(translate.nodeQueue[uuid]) == 'undefined'){
3049
- console.log('提示:你很可能多次引入了 translate.js 所以造成了翻译本身的数据错乱,这只是个提示,它还是会给你正常翻译的,但是你最好不要重复引入太多次 translate.js ,正常情况下只需要引入一次 translate.js 就可以了。太多的话很可能会导致你页面卡顿');
3104
+ translate.log('提示:你很可能多次引入了 translate.js 所以造成了翻译本身的数据错乱,这只是个提示,它还是会给你正常翻译的,但是你最好不要重复引入太多次 translate.js ,正常情况下只需要引入一次 translate.js 就可以了。太多的话很可能会导致你页面卡顿');
3050
3105
  return;
3051
3106
  }
3052
3107
 
@@ -3086,8 +3141,8 @@ var translate = {
3086
3141
  originalWord = translate.nodeQueue[uuid]['list'][lang][hash]['original'];
3087
3142
  //console.log('bef:'+translate.nodeQueue[uuid]['list'][lang][hash]['beforeText']);
3088
3143
  }catch(e){
3089
- console.log('uuid:'+uuid+', originalWord:'+originalWord+', lang:'+lang+', hash:'+hash+', text:'+text+', queue:'+translate.nodeQueue[uuid]);
3090
- console.log(e);
3144
+ translate.log('uuid:'+uuid+', originalWord:'+originalWord+', lang:'+lang+', hash:'+hash+', text:'+text+', queue:'+translate.nodeQueue[uuid]);
3145
+ translate.log(e);
3091
3146
  continue;
3092
3147
  }
3093
3148
 
@@ -3187,7 +3242,7 @@ var translate = {
3187
3242
  将已扫描的节点进行记录,这里是只要进行扫描到了,也就是在加入 translate.nodeQueue 时就也要加入到这里。
3188
3243
  这是一个map,为了兼容es5,这里设置为null,在 translate.execute 中在进行初始化
3189
3244
 
3190
- key: node
3245
+ key: node ,进行翻译的文本的node, 如果是 div 的 title属性进行的翻译,那这个node是定位在 title 上的node,而不是 div 这个依附的元素
3191
3246
  value: 这是一个对像
3192
3247
  其中,key的取值有这几种:
3193
3248
  translate_default_value: 如果当前翻译的是元素本身的值或node节点本身的值(nodeValue),那么这里的key就是固定的 translate_default_value
@@ -3240,7 +3295,7 @@ var translate = {
3240
3295
  key: translate.node 中 translate.node.get(node)[attribute] 所使用的 attribute 的字符串,如 attribute_title 、translate_default_value
3241
3296
  attribute: 这里是attribute具体的内容,比如 key 是 attribute_title 那么这里就是 title , key 是 translate_default_value 这里就是 '' 空字符串
3242
3297
  }
3243
- */
3298
+
3244
3299
  getAttribute:function(attribute){
3245
3300
  var history_attribute;
3246
3301
  if(typeof(attribute) != 'undefined' && attribute.length > 0){
@@ -3256,6 +3311,7 @@ var translate = {
3256
3311
  attribute:attribute
3257
3312
  }
3258
3313
  },
3314
+ */
3259
3315
  /*
3260
3316
  刷新 translate.node.data 中的数据,剔除过时的(node已经不存在于dom的)
3261
3317
  */
@@ -3354,6 +3410,147 @@ var translate = {
3354
3410
  get:function(node, attribute){
3355
3411
  return translate.element.nodeAnalyse.analyse(node,'','', attribute);
3356
3412
  },
3413
+ /*
3414
+ 同上,只不过这个是扫描 element/node 下的所有可翻译的子节点(下层节点),返回数组形态。
3415
+ 这里面的数组,已经经过判断, text 必然是有不为空的值的。
3416
+ 所以它的返回值,有可能是一个空的数组
3417
+
3418
+ [
3419
+ {
3420
+ node: 当前扫描出的node (传入的node、或下层node)
3421
+ attribute: 是否是下层属性,比如 alt、placeholder , 如果是传入的node本身,不是任何下层属性,则这里是空白字符串 ''
3422
+ text: 可进行翻译的文本,也就是当前数组中 node 的值的文本
3423
+ },
3424
+ ...
3425
+ ]
3426
+ */
3427
+ gets:function(node){
3428
+ var resultArray = [];
3429
+
3430
+ var nodename = translate.element.getNodeName(node).toUpperCase();
3431
+ switch (nodename) {
3432
+ case 'META': //meta标签,如是关键词、描述等
3433
+ var nodeAttributeName = node.name.toLowerCase(); //取meta 标签的name 属性
3434
+ var nodeAttributePropertyOri = node.getAttribute('property'); //取 property的值
3435
+ var nodeAttributeProperty = '';
3436
+ if(typeof(nodeAttributePropertyOri) === 'string' && nodeAttributePropertyOri.length > 0){
3437
+ nodeAttributeProperty = nodeAttributePropertyOri.toLowerCase();
3438
+ }
3439
+
3440
+ if(nodeAttributeName == 'keywords' || nodeAttributeName == 'description' || nodeAttributeName == 'sharetitle' || nodeAttributeProperty == 'og:title' || nodeAttributeProperty == 'og:description' || nodeAttributeProperty == 'og:site_name' || nodeAttributeProperty == 'og:novel:latest_chapter_name'){
3441
+ if(typeof(node.content) === 'string' && node.content.trim().length > 0){
3442
+ resultArray.push({
3443
+ text: node.content,
3444
+ attribute: 'content',
3445
+ node: node.getAttributeNode('content')
3446
+ });
3447
+ }
3448
+ }
3449
+ break;
3450
+ case 'IMG':
3451
+ if(typeof(node.alt) === 'string' && node.alt.trim().length > 0){
3452
+ resultArray.push({
3453
+ text: node.alt,
3454
+ attribute: 'alt',
3455
+ node: node.getAttributeNode('alt')
3456
+ });
3457
+ }
3458
+ break;
3459
+ case 'INPUT':
3460
+ /*
3461
+ input,要对以下情况进行翻译
3462
+ placeholder
3463
+ type=button、submit 的情况下的 value
3464
+ */
3465
+
3466
+ //针对 type=button、submit 的情况下的 value
3467
+ if(typeof(node.attributes.type) !== 'undefined' && node.attributes.type !== null && typeof(node.attributes.type.nodeValue) === 'string' && (node.attributes.type.nodeValue.toLowerCase() == 'button' || node.attributes.type.nodeValue.toLowerCase() == 'submit')){
3468
+ //取它的value
3469
+ var input_value_node = node.attributes.value;
3470
+ if(typeof(input_value_node) !== 'undefined' && input_value_node !== null && typeof(input_value_node.nodeValue) === 'string' && input_value_node.nodeValue.trim().length > 0){
3471
+ resultArray.push({
3472
+ text: input_value_node.nodeValue,
3473
+ attribute: 'value',
3474
+ node: input_value_node
3475
+ });
3476
+ }
3477
+ }
3478
+
3479
+ //针对 placeholder
3480
+ if(typeof(node.attributes['placeholder']) !== 'undefined' && typeof(node.attributes['placeholder'].nodeValue) === 'string' && node.attributes['placeholder'].nodeValue.trim().length > 0){
3481
+ resultArray.push({
3482
+ text: node.attributes['placeholder'].nodeValue,
3483
+ attribute: 'placeholder',
3484
+ node: node.attributes['placeholder']
3485
+ });
3486
+ }
3487
+ break;
3488
+ case 'TEXTAREA':
3489
+ //针对 placeholder
3490
+ if(typeof(node.attributes['placeholder']) !== 'undefined' && typeof(node.attributes['placeholder'].nodeValue) === 'string' && node.attributes['placeholder'].nodeValue.trim().length > 0){
3491
+ resultArray.push({
3492
+ text: node.attributes['placeholder'].nodeValue,
3493
+ attribute: 'placeholder',
3494
+ node: node.attributes['placeholder']
3495
+ });
3496
+ }
3497
+ break;
3498
+ }
3499
+
3500
+ //判断是否是 translate.element.tagAttribute 自定义翻译属性的
3501
+ var divTagAttribute = translate.element.tagAttribute[nodename.toLowerCase()];
3502
+ if(typeof(divTagAttribute) !== 'undefined'){
3503
+ //有这个标签的自定义翻译某个属性
3504
+ for(var ai = 0; ai<node.attributes.length; ai++){
3505
+ var arrtibuteNodeName = translate.element.getNodeName(node.attributes[ai]).toLowerCase();
3506
+ if(divTagAttribute.attribute.indexOf(arrtibuteNodeName) > -1 && divTagAttribute.condition(node)){
3507
+ //包含这个属性,且自定义判断条件满足,允许翻译
3508
+ //判定一下是否已经加入过了,如果没有加入过,才会加入。这里主要是针对input 标签进行判断,比如 input type="submit" 的,value值如果也被用户自定义翻译,那上面的value就已经加上了,不需要在加了
3509
+ var isAlreadyAdd = false; //true已经加入过了
3510
+ for(var ri = 0; ri < resultArray.length; ri++){
3511
+ if(resultArray[ri].node === node.attributes[ai]){
3512
+ //相同,则不在加入了
3513
+ isAlreadyAdd = true;
3514
+ }
3515
+ }
3516
+ if(!isAlreadyAdd){
3517
+ resultArray.push({
3518
+ text: node.attributes[ai].nodeValue,
3519
+ attribute: arrtibuteNodeName,
3520
+ node: node.attributes[ai]
3521
+ });
3522
+ }
3523
+ }
3524
+ }
3525
+ }else{
3526
+ //条件不满足,不在翻译的属性范围
3527
+ }
3528
+
3529
+
3530
+ //所有元素都要判定的属性 - title 属性
3531
+ if(typeof(node['title']) === 'string' && node['title'].trim().length > 0){
3532
+ var titleNode = node.getAttributeNode('title');
3533
+ resultArray.push({
3534
+ text: titleNode.nodeValue,
3535
+ attribute: 'title',
3536
+ node: titleNode
3537
+ });
3538
+ }
3539
+
3540
+
3541
+ //最后判定 node 本身
3542
+ if(typeof(node.nodeValue) === 'string' && node.nodeValue.trim().length > 0){
3543
+ //返回传入的node本身
3544
+ resultArray.push({
3545
+ text: node.nodeValue,
3546
+ attribute: '',
3547
+ node: node
3548
+ });
3549
+ }
3550
+
3551
+
3552
+ return resultArray;
3553
+ },
3357
3554
  /*
3358
3555
  进行翻译之后的渲染显示
3359
3556
  注意,它会对node本身进行扫描的,需要进行通过文本翻译接口进行翻译的文本进行识别,比如 这个 node 其内容为:
@@ -3461,6 +3658,7 @@ var translate = {
3461
3658
 
3462
3659
  //正常的node ,typeof 都是 object
3463
3660
 
3661
+ /* 这里是通用方法,不应该有限制
3464
3662
  //console.log(typeof(node)+node);
3465
3663
  if(nodename == '#text'){
3466
3664
  //如果是普通文本,判断一下上层是否是包含在textarea标签中
@@ -3474,7 +3672,7 @@ var translate = {
3474
3672
  }
3475
3673
  }
3476
3674
  }
3477
-
3675
+ */
3478
3676
 
3479
3677
 
3480
3678
  //console.log(nodename)
@@ -3633,11 +3831,23 @@ var translate = {
3633
3831
  resultShowText: translate.element.nodeAnalyse.analyse 进行设置翻译后的文本渲染时,提前计算好这个node显示的所有文本,然后在赋予 dom,这里是计算好的node要整体显示的文本
3634
3832
  */
3635
3833
  analyseReplaceBefore_DateToTranslateNode:function(node, attribute, resultShowText){
3636
- if(translate.node.find(node)){
3637
- if(typeof(translate.node.get(node).translateResults) == 'undefined'){
3638
- translate.node.get(node).translateResults = {};
3834
+ var translateNode; //当前操作的,要记录入 translate.node 中的,进行翻译的node
3835
+ var translateNode_attribute = ''; //当前操作的是node中的哪个attribute,如果没有是node本身则是空字符串
3836
+
3837
+ if(typeof(attribute) === 'string' && attribute.length > 0){
3838
+ //是操作的元素的某个属性
3839
+ translateNode = node.getAttributeNode(attribute);
3840
+ translateNode_attribute = attribute;
3841
+ }else{
3842
+ //操作的就是node本身
3843
+ translateNode = node;
3844
+ }
3845
+
3846
+ if(translate.node.find(translateNode)){
3847
+ if(typeof(translate.node.get(translateNode).translateResults) == 'undefined'){
3848
+ translate.node.get(translateNode).translateResults = {};
3639
3849
  }
3640
- translate.node.get(node).translateResults[resultShowText] = 1;
3850
+ translate.node.get(translateNode).translateResults[resultShowText] = 1;
3641
3851
  }else{
3642
3852
  //翻译过程中,会有时间差,比如通过文本翻译api请求,这时node元素本身被其他js改变了,导致翻译完成后,原本的node不存在了
3643
3853
  //console.log('[debug] 数据异常,analyse - set 中发现 translate.node 中的 node 不存在,理论上应该只要被扫描了,被翻译了,到这里就一定会存在的,不存在怎么会扫描到交给去翻译呢');
@@ -3661,8 +3871,8 @@ var translate = {
3661
3871
  if(typeof(node.tagName) == 'string' && node.tagName.length > 0){
3662
3872
  return node.tagName;
3663
3873
  }else{
3664
- console.log('warn : get nodeName is null, this node ignore translate. node : ');
3665
- console.log(node);
3874
+ translate.log('warn : get nodeName is null, this node ignore translate. node : ');
3875
+ translate.log(node);
3666
3876
  return '';
3667
3877
  }
3668
3878
  }
@@ -3684,7 +3894,7 @@ var translate = {
3684
3894
 
3685
3895
  //console.log('---'+typeof(node)+', ');
3686
3896
  //判断是否是有title属性,title属性也要翻译
3687
- if(typeof(node) == 'object' && typeof(node['title']) == 'string' && node['title'].length > 0){
3897
+ if(typeof(node) == 'object' && typeof(node['title']) == 'string' && node['title'].trim().length > 0){
3688
3898
  //将title加入翻译队列
3689
3899
  //console.log('---'+node.title+'\t'+node.tagName);
3690
3900
  //console.log(node)
@@ -3693,7 +3903,8 @@ var translate = {
3693
3903
  //判断当前元素是否在ignore忽略的tag、id、class name中
3694
3904
  if(!translate.ignore.isIgnore(node)){
3695
3905
  //不在忽略的里面,才会加入翻译
3696
- translate.addNodeToQueue(uuid, node, node['title'], 'title');
3906
+ //translate.addNodeToQueue(uuid, node, node['title'], 'title');
3907
+ translate.addNodeToQueue(uuid, node.getAttributeNode('title'), node['title'], '');
3697
3908
  }
3698
3909
  }
3699
3910
 
@@ -3747,7 +3958,7 @@ var translate = {
3747
3958
  //判断当前元素是否在ignore忽略的tag、id、class name中 v3.15.7 增加
3748
3959
  if(!translate.ignore.isIgnore(node)){
3749
3960
  //加入翻译
3750
- translate.addNodeToQueue(uuid, node, attributeValue, attributeName);
3961
+ translate.addNodeToQueue(uuid, node.getAttributeNode(attributeName), attributeValue, '');
3751
3962
  }
3752
3963
  }
3753
3964
  }
@@ -3770,22 +3981,16 @@ var translate = {
3770
3981
  if(node == null || typeof(node) == 'undefined'){
3771
3982
  return;
3772
3983
  }
3773
- if(node.parentNode == null){
3774
- return;
3775
- }
3776
-
3777
- //console.log('-----parent')
3778
- var parentNodeName = translate.element.getNodeName(node.parentNode);
3779
- //node.parentNode.nodeName;
3780
- if(parentNodeName == ''){
3781
- return;
3782
- }
3783
- if(translate.ignore.tag.indexOf(parentNodeName.toLowerCase()) > -1){
3784
- //忽略tag
3785
- //console.log('忽略tag:'+parentNodeName);
3786
- return;
3984
+ if(node.nodeType === 2){ //是属性node,比如 div 的 title 属性的 node
3985
+ if(node.ownerElement == null){
3986
+ return;
3987
+ }
3988
+ }else{ //是元素了
3989
+ if(node.parentNode == null){
3990
+ return;
3991
+ }
3787
3992
  }
3788
-
3993
+
3789
3994
  /****** 判断忽略的class ******/
3790
3995
  /*
3791
3996
  这段理论上不需要了,因为在 translate.ignore.isIgnore 判断了
@@ -3819,13 +4024,21 @@ var translate = {
3819
4024
  return;
3820
4025
  }
3821
4026
 
3822
- //node分析
4027
+ //node分析,分析这个node的所有可翻译属性(包含自定义翻译属性 translate.element.tagAttribute )
4028
+ var nodeAnalyChild = translate.element.nodeAnalyse.gets(node);
4029
+ //console.log(nodeAnalyChild);
4030
+ for(var nci = 0; nci < nodeAnalyChild.length; nci++){
4031
+ translate.addNodeToQueue(uuid, nodeAnalyChild[nci].node, nodeAnalyChild[nci].text, '');
4032
+ }
4033
+ /*
3823
4034
  var nodeAnaly = translate.element.nodeAnalyse.get(node);
3824
4035
  if(nodeAnaly['text'].length > 0){
3825
4036
  //有要翻译的目标内容,加入翻译队列
3826
- //console.log('addNodeToQueue -- '+nodeAnaly['node']+', text:' + nodeAnaly['text']);
3827
- translate.addNodeToQueue(uuid, nodeAnaly['node'], nodeAnaly['text']);
4037
+ console.log(nodeAnaly)
4038
+ console.log('addNodeToQueue -- '+nodeAnaly['node']+', text:' + nodeAnaly['text']);
4039
+ translate.addNodeToQueue(uuid, nodeAnaly['node'], nodeAnaly['text'], '');
3828
4040
  }
4041
+ */
3829
4042
 
3830
4043
  //console.log(nodeAnaly);
3831
4044
  /*
@@ -3886,6 +4099,56 @@ var translate = {
3886
4099
  */
3887
4100
 
3888
4101
  },
4102
+ /*
4103
+ 将node转为element输出。
4104
+ 如果node是文本元素,则转化为这个文本元素所在的element元素
4105
+ 如果node是属性,则转化为这个属性所在的element元素
4106
+ 如果node本身就是元素标签,那就还是这样返回。
4107
+
4108
+
4109
+ nodes: node数组,传入如 [node1,node2, ...] 它里面可能包含 node.nodeType 1\2\3 等值
4110
+
4111
+ 返回这些node转化为所在元素后的数组,返回如 [element1, element2, ...]
4112
+ 注意的是
4113
+ 1. 输出的一定是 element 元素,也就是 node.nodeType 一定等于1
4114
+ 2. 输出的元素数组不一定等于传入的nodes数组,也就是他们的数量跟下标并不是对应相等的
4115
+
4116
+ */
4117
+ nodeToElement: function(nodes){
4118
+ var elements = new Array(); //要改动的元素
4119
+
4120
+ //遍历所有node组合到 nodes. 这个不单纯只是遍历组合,它会判断如果是文本节点,则取它的父级元素。它组合的结果是元素的集合
4121
+ for(var r = 0; r<nodes.length; r++){
4122
+ var node = nodes[r];
4123
+ if(typeof(node) == 'undefined' || typeof(node.parentNode) == 'undefined'){
4124
+ continue;
4125
+ }
4126
+ if(node.nodeType === 2){
4127
+ //是属性节点,可能是input、textarea 的 placeholder ,获取它的父元素
4128
+ var nodeParentElement = node.ownerElement;
4129
+ if(nodeParentElement == null){
4130
+ continue;
4131
+ }
4132
+ elements.push(nodeParentElement);
4133
+ }else if(node.nodeType === 3){
4134
+ //是文本节点
4135
+ var nodeParentElement = node.parentNode;
4136
+ if(nodeParentElement == null){
4137
+ continue;
4138
+ }
4139
+ elements.push(nodeParentElement);
4140
+ }else if(node.nodeType === 1){
4141
+ //元素节点了,直接加入
4142
+ elements.push(node);
4143
+ }else{
4144
+ //1\2\3 都不是,这不应该是 translate.js 中应该出现的
4145
+ translate.log('translate.element.nodeToElement 中,发现传入的node.nodeType 类型有异常,理论上不应该存在, node.nodeType:'+node.nodeType);
4146
+ translate.log(node);
4147
+ }
4148
+ }
4149
+
4150
+ return elements;
4151
+ }
3889
4152
  },
3890
4153
 
3891
4154
 
@@ -3951,27 +4214,34 @@ var translate = {
3951
4214
 
3952
4215
 
3953
4216
  /***** 记录这个node 到 translate.node.data,这也是node进入 translate.node.data 记录的第一入口 *****/
3954
- if(translate.node.get(node) == null){
3955
- translate.node.set(node, {});
4217
+ var translateNode; //当前操作的,要记录入 translate.node 中的,进行翻译的node
4218
+ var translateNode_attribute = ''; //当前操作的是node中的哪个attribute,如果没有是node本身则是空字符串
4219
+ if(typeof(attribute) === 'string' && attribute.length > 0){
4220
+ //是操作的元素的某个属性
4221
+ translateNode = node.getAttributeNode(attribute);
4222
+ translateNode_attribute = attribute;
4223
+ }else{
4224
+ //操作的就是node本身
4225
+ translateNode = node;
3956
4226
  }
3957
-
3958
-
3959
- var nodeAttribute = translate.node.getAttribute(attribute);
4227
+ if(translate.node.get(translateNode) == null){
4228
+ translate.node.set(translateNode, {});
4229
+ }
4230
+
4231
+ //var nodeAttribute = translate.node.getAttribute(attribute);
3960
4232
  //console.log(text+'-----:');
3961
4233
  //console.log(nodeAttribute);
3962
- if(typeof(translate.node.get(node)[nodeAttribute.key]) == 'undefined'){
3963
- translate.node.get(node)[nodeAttribute.key] = {};
3964
- //console.log(typeof(translate.node.get(node)[nodeAttribute.key]));
3965
- }
3966
- translate.node.get(node)[nodeAttribute.key].attribute = nodeAttribute.attribute;
3967
- if(typeof(translate.node.get(node)[nodeAttribute.key].originalText) == 'string'){
4234
+ //if(typeof(translate.node.get(translateNode)[nodeAttribute.key]) == 'undefined'){
4235
+ // translate.node.get(node)[nodeAttribute.key] = {};
4236
+ //}
4237
+ translate.node.get(translateNode).attribute = translateNode_attribute;
4238
+ if(typeof(translate.node.get(translateNode).originalText) === 'string'){
3968
4239
  //这个节点有过记录原始显示的文本了,那么不再对其进行后续的扫描,除非它有被触发过动态监听元素改变, --- 至于它有被触发过动态监听元素改变--后续想怎么判定
3969
4240
  //console.log(translate.node.get(node)[nodeAttribute.key].originalText+'\t又过了,不在翻译');
3970
4241
  return;
3971
4242
  }else{
3972
4243
  //没有过,是第一次,那么赋予值
3973
- translate.node.get(node)[nodeAttribute.key].originalText = text;
3974
- //console.log(translate.node.get(node));
4244
+ translate.node.get(translateNode).originalText = text;
3975
4245
  }
3976
4246
  //console.log(translate.node.get(node)[nodeAttribute.key]);
3977
4247
  /*
@@ -4001,13 +4271,12 @@ var translate = {
4001
4271
  return;
4002
4272
  }
4003
4273
  */
4004
- if(typeof(translate.node.get(node)[nodeAttribute.key].translateTexts) == 'undefined'){
4005
- translate.node.get(node)[nodeAttribute.key].translateTexts = {};
4274
+ if(typeof(translate.node.get(translateNode).translateTexts) === 'undefined'){
4275
+ translate.node.get(translateNode).translateTexts = {};
4006
4276
  }
4007
4277
  /***** 自检完毕,准备进行翻译了 *****/
4008
4278
 
4009
4279
 
4010
-
4011
4280
  //原本传入的text会被切割为多个小块
4012
4281
  var textArray = new Array();
4013
4282
  textArray.push(text); //先将主 text 赋予 ,后面如果对主text进行加工分割,分割后会将主text给删除掉
@@ -4047,8 +4316,8 @@ var translate = {
4047
4316
 
4048
4317
  //console.log(textArray);
4049
4318
  textArray = translate.nomenclature.dispose(textArray, temporaryIgnoreTexts[ti], temporaryIgnoreTexts[ti], {
4050
- node:node,
4051
- attribute:attribute
4319
+ node:translateNode,
4320
+ attribute:''
4052
4321
  }).texts;
4053
4322
  //console.log(textArray);
4054
4323
  }
@@ -4076,8 +4345,8 @@ var translate = {
4076
4345
  //console.log('----translate.nomenclature.dispose---');
4077
4346
  //console.log(textArray);
4078
4347
  var nomenclatureDispose = translate.nomenclature.dispose(textArray, nomenclatureKey, nomenclatureValue, {
4079
- node:node,
4080
- attribute:attribute
4348
+ node:translateNode,
4349
+ attribute:''
4081
4350
  });
4082
4351
 
4083
4352
  textArray = nomenclatureDispose.texts;
@@ -4101,10 +4370,10 @@ var translate = {
4101
4370
 
4102
4371
  //记录 nodeHistory - 判断text是否已经被拆分了
4103
4372
  if(textArray.length > 0 && textArray[0] != text){ //主要是后面的是否相等,前面的>0只是避免代码报错
4104
- translate.node.get(node)[nodeAttribute.key].whole = false; //已经被拆分了,不是整体翻译了
4373
+ translate.node.get(translateNode).whole = false; //已经被拆分了,不是整体翻译了
4105
4374
  //这时,也默认给其赋值操作,将自定义术语匹配后的结果进行赋予
4106
4375
  }else{
4107
- translate.node.get(node)[nodeAttribute.key].whole = true; //未拆分,是整体翻译
4376
+ translate.node.get(translateNode).whole = true; //未拆分,是整体翻译
4108
4377
  }
4109
4378
  //成功加入到 nodeQueue 的对象。 如果长度为0,那就是还没有加入到 translate.nodeQueue 中,可能全被自定义术语命中了
4110
4379
  var addQueueObjectArray = [];
@@ -4145,14 +4414,14 @@ var translate = {
4145
4414
  // translate.node 记录
4146
4415
 
4147
4416
  // 记录当前有 translate.js 所触发翻译之后渲染到dom界面显示的时间,13位时间戳
4148
- translate.node.get(node).lastTranslateRenderTime = Date.now();
4417
+ translate.node.get(translateNode).lastTranslateRenderTime = Date.now();
4149
4418
  //将具体通过文本翻译接口进行翻译的文本记录到 translate.node.data
4150
- translate.node.get(node)[nodeAttribute.key].translateTexts = {}; //这里全部命中了,所以根本没有走翻译接口的文本
4419
+ translate.node.get(translateNode).translateTexts = {}; //这里全部命中了,所以根本没有走翻译接口的文本
4151
4420
  //将翻译完成后要显示出的文本进行记录
4152
- translate.node.get(node)[nodeAttribute.key].resultText = translate.element.nodeAnalyse.get(node).text; //直接获取当前node显示出来的文本作为最后的结果的文本
4421
+ translate.node.get(translateNode).resultText = translate.element.nodeAnalyse.get(node, attribute).text; //直接获取当前node显示出来的文本作为最后的结果的文本
4153
4422
 
4154
4423
  //将其加入 translate.history.translateTexts 中
4155
- translate.history.translateText.add(translate.node.get(node)[nodeAttribute.key].originalText, translate.node.get(node)[nodeAttribute.key].resultText);
4424
+ translate.history.translateText.add(translate.node.get(translateNode).originalText, translate.node.get(translateNode).resultText);
4156
4425
  }
4157
4426
 
4158
4427
  },
@@ -4422,11 +4691,11 @@ var translate = {
4422
4691
  if(translate.whole.class.length == 0 && translate.whole.tag.length == 0 && translate.whole.id.length == 0){
4423
4692
 
4424
4693
  }else{
4425
- console.log('您开启了 translate.whole 此次行为避开了浏览器端的文本语种自动识别,而是暴力的直接对某个元素的整个文本进行翻译,很可能会产生非常大的翻译量,请谨慎!有关每日翻译字符的说明,可参考: http://translate.zvo.cn/42557.html ');
4694
+ translate.log('您开启了 translate.whole 此次行为避开了浏览器端的文本语种自动识别,而是暴力的直接对某个元素的整个文本进行翻译,很可能会产生非常大的翻译量,请谨慎!有关每日翻译字符的说明,可参考: http://translate.zvo.cn/42557.html ');
4426
4695
  }
4427
4696
 
4428
4697
  if(translate.whole.tag.indexOf('html') > -1){
4429
- console.log('自检发现您设置了 translate.whole.tag 其中有 html ,这个是不生效的,最大只允许设置到 body ');
4698
+ translate.log('自检发现您设置了 translate.whole.tag 其中有 html ,这个是不生效的,最大只允许设置到 body ');
4430
4699
  }
4431
4700
  },
4432
4701
 
@@ -4690,10 +4959,10 @@ var translate = {
4690
4959
  clearCacheLanguage:function(){
4691
4960
  if(typeof(translate.language.setUrlParamControl_use) != 'undefined'){
4692
4961
  if(translate.language.setUrlParamControl_use){
4693
- console.log('使用提示:')
4694
- console.log('translate.language.setUrlParamControl(...) 的作用是 可以通过URL传一个语种,来指定当前页面以什么语种显示。 参考文档: http://translate.zvo.cn/4075.html');
4695
- console.log('translate.language.clearCacheLanguage() 是清除历史翻译语种缓存,也就是清除之前指定翻译为什么语种。 参考文档:http://translate.zvo.cn/4080.html')
4696
- console.log('如果你执行了 translate.language.setUrlParamControl(...) 那么是要根据url传参来切换语种的,但是后面又出现了 translate.language.clearCacheLanguage() 它会阻止 translate.language.setUrlParamControl(...) 它的设置,即使有url传递翻译为什么语言,也会因为 translate.language.clearCacheLanguage() 给清除掉,使URL传参的语种不起任何作用。')
4962
+ translate.log('使用提示:')
4963
+ translate.log('translate.language.setUrlParamControl(...) 的作用是 可以通过URL传一个语种,来指定当前页面以什么语种显示。 参考文档: http://translate.zvo.cn/4075.html');
4964
+ translate.log('translate.language.clearCacheLanguage() 是清除历史翻译语种缓存,也就是清除之前指定翻译为什么语种。 参考文档:http://translate.zvo.cn/4080.html')
4965
+ translate.log('如果你执行了 translate.language.setUrlParamControl(...) 那么是要根据url传参来切换语种的,但是后面又出现了 translate.language.clearCacheLanguage() 它会阻止 translate.language.setUrlParamControl(...) 它的设置,即使有url传递翻译为什么语言,也会因为 translate.language.clearCacheLanguage() 给清除掉,使URL传参的语种不起任何作用。')
4697
4966
  }
4698
4967
  }
4699
4968
  translate.to = '';
@@ -4995,7 +5264,7 @@ var translate = {
4995
5264
 
4996
5265
  var romanceSentenceLanguage = translate.language.romanceSentenceAnaly(str);
4997
5266
  if(romanceSentenceLanguage.length == 0){
4998
- console.log('语种识别异常,应该是 法语、西班牙语、葡萄牙语、意大利语 中的一种才是,除非是除了这四种语种之外的别的 罗曼语族 中的语种,当前已将 '+ str +'识别为英语。 你可以联系我们求助 https://translate.zvo.cn/4030.html');
5267
+ translate.log('语种识别异常,应该是 法语、西班牙语、葡萄牙语、意大利语 中的一种才是,除非是除了这四种语种之外的别的 罗曼语族 中的语种,当前已将 '+ str +'识别为英语。 你可以联系我们求助 https://translate.zvo.cn/4030.html');
4999
5268
  }else{
5000
5269
  data.languageName = romanceSentenceLanguage;
5001
5270
  }
@@ -5858,9 +6127,9 @@ var translate = {
5858
6127
  translate.request.post(translate.request.api.ip, {}, function(data){
5859
6128
  //console.log(data);
5860
6129
  if(data.result == 0){
5861
- console.log('==== ERROR 获取当前用户所在区域异常 ====');
5862
- console.log(data.info);
5863
- console.log('==== ERROR END ====');
6130
+ translate.log('==== ERROR 获取当前用户所在区域异常 ====');
6131
+ translate.log(data.info);
6132
+ translate.log('==== ERROR END ====');
5864
6133
  }else{
5865
6134
  translate.storage.set('to',data.language); //设置目标翻译语言
5866
6135
  translate.to = data.language; //设置目标语言
@@ -6095,7 +6364,7 @@ var translate = {
6095
6364
  let replaceResult = translate.util.replaceFromIndex(text, replaceIndex, replaceOriginalText, replaceResultText);
6096
6365
 
6097
6366
  if(replaceResult.replaceEndIndex < 1){
6098
- console.log('translate.util.findParticiple 中已经发现了,但是实际没有替换,出现异常了!理论上这是不应该出现的。 text:'+text+' , index:'+indexArray[i]+', translateOriginal:'+translateOriginal);
6367
+ translate.log('translate.util.findParticiple 中已经发现了,但是实际没有替换,出现异常了!理论上这是不应该出现的。 text:'+text+' , index:'+indexArray[i]+', translateOriginal:'+translateOriginal);
6099
6368
  }else{
6100
6369
  text = replaceResult.text;
6101
6370
  }
@@ -6772,7 +7041,7 @@ var translate = {
6772
7041
  var tLang = translate.util.browserLanguage[language];
6773
7042
  if(typeof(tLang) == 'undefined'){
6774
7043
  //没有在里面
6775
- console.log('browser default language : '+language +', translate.js current translate channel not support this language ');
7044
+ translate.log('browser default language : '+language +', translate.js current translate channel not support this language ');
6776
7045
  }else{
6777
7046
  return tLang;
6778
7047
  }
@@ -6931,7 +7200,7 @@ var translate = {
6931
7200
  */
6932
7201
  use: function(serviceName){
6933
7202
  if(typeof(translate.enterprise) != 'undefined' && translate.enterprise.isUse == true){
6934
- console.log('您已启用了企业级翻译通道 translate.enterprise.use(); (文档:https://translate.zvo.cn/4087.html) , 所以您设置的 translate.service.use(\''+serviceName+'\'); (文档:https://translate.zvo.cn/4081.html) 将失效不起作用,有企业级翻译通道全部接管。');
7203
+ translate.log('您已启用了企业级翻译通道 translate.enterprise.use(); (文档:https://translate.zvo.cn/4087.html) , 所以您设置的 translate.service.use(\''+serviceName+'\'); (文档:https://translate.zvo.cn/4081.html) 将失效不起作用,有企业级翻译通道全部接管。');
6935
7204
  return;
6936
7205
  }
6937
7206
  //console.log('--'+serviceName);
@@ -7055,8 +7324,8 @@ var translate = {
7055
7324
 
7056
7325
  //进行对前后进行补齐数组
7057
7326
  if(currentIndex < 0){
7058
- console.log('------ERROR--------');
7059
- console.log('翻译内容过多,进行拆分,但拆分判断出现异常,currentIndex:-1 请联系 http://translate.zvo.cn/43006.html 说明');
7327
+ translate.log('------ERROR--------');
7328
+ translate.log('翻译内容过多,进行拆分,但拆分判断出现异常,currentIndex:-1 请联系 http://translate.zvo.cn/43006.html 说明');
7060
7329
  }
7061
7330
  //前插入空数组填充
7062
7331
  for(var addbeforei = 0; addbeforei<currentIndex; addbeforei++){
@@ -7086,8 +7355,8 @@ var translate = {
7086
7355
 
7087
7356
 
7088
7357
  }, 'get', true, {'content-type':'application/x-www-form-urlencoded'}, function(xhr){
7089
- console.log('---------error--------');
7090
- console.log('edge translate service error, http code : '+xhr.status + ', response text : '+xhr.responseText);
7358
+ translate.log('---------error--------');
7359
+ translate.log('edge translate service error, http code : '+xhr.status + ', response text : '+xhr.responseText);
7091
7360
  }, true);
7092
7361
 
7093
7362
 
@@ -7196,7 +7465,7 @@ var translate = {
7196
7465
  {},
7197
7466
  function(data){
7198
7467
  if (data.result == 0){
7199
- console.log('translate.js init 初始化异常:'+data.info);
7468
+ translate.log('translate.js init 初始化异常:'+data.info);
7200
7469
  return;
7201
7470
  }else if(data.result == 1){
7202
7471
  //服务端返回的最新版本
@@ -7205,7 +7474,7 @@ var translate = {
7205
7474
  var currentVersion = translate.util.versionStringToInt(translate.version.replace('v',''));
7206
7475
 
7207
7476
  if(newVersion > currentVersion){
7208
- console.log('Tip : translate.js find new version : '+data.version);
7477
+ translate.log('Tip : translate.js find new version : '+data.version);
7209
7478
  }
7210
7479
  }
7211
7480
  },
@@ -7481,7 +7750,7 @@ var translate = {
7481
7750
  );
7482
7751
  }catch(e){
7483
7752
  //console.log('e0000');
7484
- console.log(e);
7753
+ translate.log(e);
7485
7754
  //time = 300000; //无法连接的,那么赋予 300 秒吧
7486
7755
  }
7487
7756
 
@@ -7516,7 +7785,7 @@ var translate = {
7516
7785
 
7517
7786
  }else{
7518
7787
  //异常,下标越界了!,固定返回最后一个
7519
- console.log('异常,下标越界了!index:'+queueIndex);
7788
+ translate.log('异常,下标越界了!index:'+queueIndex);
7520
7789
  queueIndex = queue.length-1;
7521
7790
  }
7522
7791
  //console.log(queueIndex);
@@ -7690,7 +7959,7 @@ var translate = {
7690
7959
  try{
7691
7960
  json = JSON.parse(xhr.responseText);
7692
7961
  }catch(e){
7693
- console.log(e);
7962
+ translate.log(e);
7694
7963
  }
7695
7964
  }
7696
7965
  }
@@ -7709,17 +7978,17 @@ var translate = {
7709
7978
  //判断是否是v2版本的翻译,如果是 translate.service 模式并且没有使用企业级翻译,参会提示
7710
7979
  //2024.3月底开始,翻译使用量增加的太快,开源的翻译服务器有点扛不住经常出故障,所以直接把这个提示加到这里
7711
7980
  if(translate.service.name == 'translate.service'){
7712
- console.log('----- translate.js 提示 -----\n翻译服务响应异常,解决这种情况可以有两种方案:\n【方案一】:使用采用最新版本 3.16.0及更高版本,js引用文件为 https://cdn.staticfile.net/translate.js/3.16.0/translate.js 并且使用 client.edge 模式 (增加一行设置代码就好,可参考 https://translate.zvo.cn/4081.html ),这样就不会再出现这种情况了,而且这个方案也是完全免费的。 \n【方案二】:采用企业级稳定翻译通道 ,但是这个相比于 方案一 来说,是有一定的收费的,大概一年600,这个就是专门为了高速及高稳定准备的,而相比于这个方案二,方案一则是全免费的。 因为方案二我们是部署了两个集群,而每个集群又下分了数个网络节点,包含中国大陆、香港、美国、欧洲、 等多个州,充分保障稳定、高效,同样也产生了不少成本,所以才需要付费。更多信息说明可以参考: http://translate.zvo.cn/4087.html \n【方案三】:私有部署你自己的翻译通道,并且启用内存级翻译缓存,毫秒级响应,但是需要依赖一台1核2G服务器,是最推荐的方式。具体参考:https://translate.zvo.cn/391129.html\n-------------');
7981
+ translate.log('----- translate.js 提示 -----\n翻译服务响应异常,解决这种情况可以有两种方案:\n【方案一】:使用采用最新版本 3.16.0及更高版本,js引用文件为 https://cdn.staticfile.net/translate.js/3.16.0/translate.js 并且使用 client.edge 模式 (增加一行设置代码就好,可参考 https://translate.zvo.cn/4081.html ),这样就不会再出现这种情况了,而且这个方案也是完全免费的。 \n【方案二】:采用企业级稳定翻译通道 ,但是这个相比于 方案一 来说,是有一定的收费的,大概一年600,这个就是专门为了高速及高稳定准备的,而相比于这个方案二,方案一则是全免费的。 因为方案二我们是部署了两个集群,而每个集群又下分了数个网络节点,包含中国大陆、香港、美国、欧洲、 等多个州,充分保障稳定、高效,同样也产生了不少成本,所以才需要付费。更多信息说明可以参考: http://translate.zvo.cn/4087.html \n【方案三】:私有部署你自己的翻译通道,并且启用内存级翻译缓存,毫秒级响应,但是需要依赖一台1核2G服务器,是最推荐的方式。具体参考:https://translate.zvo.cn/391129.html\n-------------');
7713
7982
  }
7714
7983
 
7715
7984
  //console.log(xhr);
7716
- console.log('------- translate.js service api response error --------');
7717
- console.log(' http code : '+xhr.status);
7718
- console.log(' response : '+xhr.response);
7719
- console.log(' request url : '+url);
7720
- console.log(' request data : '+JSON.stringify(data));
7721
- console.log(' request method : '+method);
7722
- console.log('---------------------- end ----------------------');
7985
+ translate.log('------- translate.js service api response error --------');
7986
+ translate.log(' http code : '+xhr.status);
7987
+ translate.log(' response : '+xhr.response);
7988
+ translate.log(' request url : '+url);
7989
+ translate.log(' request data : '+JSON.stringify(data));
7990
+ translate.log(' request method : '+method);
7991
+ translate.log('---------------------- end ----------------------');
7723
7992
  }
7724
7993
 
7725
7994
  }
@@ -7782,7 +8051,7 @@ var translate = {
7782
8051
  }else if(type == '[object Object]'){
7783
8052
  //案例三
7784
8053
  if(typeof(obj.texts) == 'undefined'){
7785
- console.log('translate.request.translateText 传入的值类型异常,因为你没有传入 obj.texts 要翻译的具体文本! 请查阅文档: https://translate.zvo.cn/4077.html');
8054
+ translate.log('translate.request.translateText 传入的值类型异常,因为你没有传入 obj.texts 要翻译的具体文本! 请查阅文档: https://translate.zvo.cn/4077.html');
7786
8055
  }
7787
8056
  if(typeof(obj.texts) == 'string'){
7788
8057
  //单个字符串
@@ -7798,7 +8067,7 @@ var translate = {
7798
8067
  to = obj.to;
7799
8068
  }
7800
8069
  }else{
7801
- console.log('translate.request.translateText 传入的值类型错误,请查阅文档: https://translate.zvo.cn/4077.html');
8070
+ translate.log('translate.request.translateText 传入的值类型错误,请查阅文档: https://translate.zvo.cn/4077.html');
7802
8071
  return;
7803
8072
  }
7804
8073
  }
@@ -7855,12 +8124,12 @@ var translate = {
7855
8124
  //console.log(resultData);
7856
8125
  //console.log(data);
7857
8126
  if(resultData.result == 0){
7858
- console.log('=======ERROR START=======');
7859
- console.log('from : '+resultData.from);
7860
- console.log('to : '+resultData.to);
7861
- console.log('translate text array : '+texts);
7862
- console.log('response : '+resultData.info);
7863
- console.log('=======ERROR END =======');
8127
+ translate.log('=======ERROR START=======');
8128
+ translate.log('from : '+resultData.from);
8129
+ translate.log('to : '+resultData.to);
8130
+ translate.log('translate text array : '+texts);
8131
+ translate.log('response : '+resultData.info);
8132
+ translate.log('=======ERROR END =======');
7864
8133
  //return;
7865
8134
  }
7866
8135
 
@@ -7978,14 +8247,14 @@ var translate = {
7978
8247
  //console.log('translate.request.listener.start ... 执行翻译 --'+currentTime);
7979
8248
  translate.execute();
7980
8249
  }catch(e){
7981
- console.log(e);
8250
+ translate.log(e);
7982
8251
  }
7983
8252
  }
7984
8253
  }
7985
8254
  }, 100);
7986
8255
 
7987
8256
  if(typeof(PerformanceObserver) == 'undefined'){
7988
- console.log('因浏览器版本较低, translate.request.listener.start() 中 PerformanceObserver 对象不存在,浏览器不支持,所以 translate.request.listener.start() 未生效。');
8257
+ translate.log('因浏览器版本较低, translate.request.listener.start() 中 PerformanceObserver 对象不存在,浏览器不支持,所以 translate.request.listener.start() 未生效。');
7989
8258
  return;
7990
8259
  }
7991
8260
 
@@ -8058,7 +8327,7 @@ var translate = {
8058
8327
  observer.observe({ entryTypes: ["resource"] });
8059
8328
  return;
8060
8329
  } catch (e) {
8061
- console.log("PerformanceObserver entryTypes 失败,尝试 type 参数");
8330
+ translate.log("PerformanceObserver entryTypes 失败,尝试 type 参数");
8062
8331
  }
8063
8332
  }
8064
8333
  }
@@ -8067,9 +8336,9 @@ var translate = {
8067
8336
  // 回退到 type 参数
8068
8337
  try {
8069
8338
  observer.observe({ type: "resource", buffered: true });
8070
- console.log("使用 PerformanceObserver type");
8339
+ translate.log("使用 PerformanceObserver type");
8071
8340
  } catch (e) {
8072
- console.log("当前浏览器不支持 PerformanceObserver 的任何参数, translate.request.listener.start() 未启动");
8341
+ translate.log("当前浏览器不支持 PerformanceObserver 的任何参数, translate.request.listener.start() 未启动");
8073
8342
  }
8074
8343
 
8075
8344
  }
@@ -8335,24 +8604,7 @@ var translate = {
8335
8604
  config.notTranslateTip = true;
8336
8605
  }
8337
8606
 
8338
- var currentLanguage = translate.language.getCurrent(); //获取当前翻译至的语种
8339
-
8340
- var lastUuid = ''; //最后一次的uuid
8341
- for(var queue in translate.nodeQueue){
8342
- if (!translate.nodeQueue.hasOwnProperty(queue)) {
8343
- continue;
8344
- }
8345
- lastUuid = queue;
8346
- }
8347
- //console.log(queue);
8348
-
8349
- if(lastUuid == ''){
8350
- if(config.selectLanguageRefreshRender){
8351
- console.log('提示,当前还未执行过翻译,所以 translate.reset(); 还原至翻译前的执行指令忽略');
8352
- }
8353
- return;
8354
- }
8355
-
8607
+
8356
8608
  /*
8357
8609
  for(var lang in translate.nodeQueue[lastUuid].list){
8358
8610
  if (!translate.nodeQueue[lastUuid].list.hasOwnProperty(lang)) {
@@ -8413,16 +8665,20 @@ var translate = {
8413
8665
  if (!translate.node.get(key) == null) {
8414
8666
  continue;
8415
8667
  }
8416
- for(var attr in translate.node.get(key)){
8417
- if (!translate.node.get(key).hasOwnProperty(attr)) {
8418
- continue;
8419
- }
8420
- var analyse = translate.element.nodeAnalyse.get(key,translate.node.get(key)[attr].attribute);
8421
- if(typeof(translate.node.get(key)[attr].originalText) != 'string'){
8668
+ //for(var attr in translate.node.get(key)){
8669
+ //if (!translate.node.get(key).hasOwnProperty(attr)) {
8670
+ // continue;
8671
+ //}
8672
+
8673
+ //var analyse = translate.element.nodeAnalyse.get(key,translate.node.get(key).attribute);
8674
+ if(typeof(translate.node.get(key).originalText) !== 'string'){
8422
8675
  continue;
8423
8676
  }
8424
- translate.element.nodeAnalyse.analyse(key, analyse.text, translate.node.get(key)[attr].originalText, translate.node.get(key)[attr].attribute);
8425
- }
8677
+ //translate.element.nodeAnalyse.analyse(key, analyse.text, translate.node.get(key).originalText, translate.node.get(key).attribute);
8678
+
8679
+ //标注此次改动是有 translate.js 导致的 -- 这里就不用标记了,因为先已经移除了 translate.listener.observer 监听,所以不会再监听到还原的操作了
8680
+ key.nodeValue = translate.node.get(key).originalText;
8681
+ //}
8426
8682
  }
8427
8683
 
8428
8684
 
@@ -8443,6 +8699,15 @@ var translate = {
8443
8699
  translate.storage.set('to', '');
8444
8700
  translate.to = null;
8445
8701
 
8702
+ //清除文本翻译记录
8703
+ if(translate.history.translateText.originalMap !== null){
8704
+ translate.history.translateText.originalMap.clear();
8705
+ }
8706
+ if(translate.history.translateText.resultMap !== null){
8707
+ translate.history.translateText.resultMap.clear();
8708
+ }
8709
+
8710
+
8446
8711
  //重新绘制 select 选择语言
8447
8712
  if(config.selectLanguageRefreshRender){
8448
8713
  translate.selectLanguageTag.refreshRender();
@@ -8473,7 +8738,7 @@ var translate = {
8473
8738
  //还有需要进行通过API接口进行翻译的文本,需要调用翻译接口
8474
8739
  if(typeof(translate.request.api.translate) != 'string' || translate.request.api.translate == null || translate.request.api.translate.length < 1){
8475
8740
  //用户已经设置了不掉翻译接口进行翻译
8476
- console.log('已设置了不使用 translate 翻译接口,翻译请求被阻止');
8741
+ translate.log('已设置了不使用 translate 翻译接口,翻译请求被阻止');
8477
8742
  return;
8478
8743
  }
8479
8744
 
@@ -8529,7 +8794,7 @@ var translate = {
8529
8794
 
8530
8795
  if(translate.service.name == 'client.edge'){
8531
8796
  translate.service.name = 'translate.service';
8532
- console.log('您已启用了企业级翻译通道 translate.enterprise.use(); (文档:https://translate.zvo.cn/4087.html) , 所以您设置的 translate.service.use(\'client.edge\'); (文档:https://translate.zvo.cn/4081.html) 将失效不起作用,有企业级翻译通道全部接管。');
8797
+ translate.log('您已启用了企业级翻译通道 translate.enterprise.use(); (文档:https://translate.zvo.cn/4087.html) , 所以您设置的 translate.service.use(\'client.edge\'); (文档:https://translate.zvo.cn/4081.html) 将失效不起作用,有企业级翻译通道全部接管。');
8533
8798
  return;
8534
8799
  }
8535
8800
  },
@@ -8671,7 +8936,7 @@ var translate = {
8671
8936
  if(typeof(translatejsTextElementHidden) == 'undefined' || translatejsTextElementHidden == null){
8672
8937
  const style = document.createElement('style');
8673
8938
  // 设置 style 元素的文本内容为要添加的 CSS 规则
8674
- style.textContent = ' .translatejs-text-element-hidden{color: transparent !important; text-shadow: none !important;}';
8939
+ style.textContent = ' .translatejs-text-element-hidden, .translatejs-text-element-hidden[type="text"]::placeholder{color: transparent !important; -webkit-text-fill-color: transparent !important; text-shadow: none !important;} ';
8675
8940
  style.id = 'translatejs-text-element-hidden';
8676
8941
  // 将 style 元素插入到 head 元素中
8677
8942
  document.head.appendChild(style);
@@ -8692,38 +8957,16 @@ var translate = {
8692
8957
  if(translate.progress.api.isTip){
8693
8958
  //translate.listener.execute.renderStartByApi.push(function(uuid, from, to){
8694
8959
  translate.lifecycle.execute.translateNetworkBefore.push(function(data){
8695
- var nodes = new Array(); //要改动的元素节点
8696
-
8697
- //遍历所有node组合到 nodes
8698
- for(var r = 0; r<data.nodes.length; r++){
8699
- var node = data.nodes[r];
8700
- if(typeof(node) == 'undefined' || typeof(node.parentNode) == 'undefined'){
8701
- continue;
8702
- }
8703
- nodes.push(node);
8704
- }
8960
+ //取出当前变动的node,对应的元素
8961
+ var elements = translate.element.nodeToElement(data.nodes);
8962
+ //console.log(elements)
8705
8963
 
8706
8964
  //隐藏所有node的文本
8707
- for(var r = 0; r<nodes.length; r++){
8708
- if(nodes[r].nodeType === 1){
8709
- nodes[r].className = nodes[r].className+' translatejs-text-element-hidden';
8710
- }else{
8711
- //不是元素,那么就取父级了 -- 这里即使翻译的属性,也要进行,比如 value 的 placeholder
8712
- var nodeParent = nodes[r].parentNode;
8713
- if(nodeParent == null){
8714
- continue;
8715
- }
8716
- if(typeof(nodeParent.className) != 'undefined' && nodeParent.className != null && nodeParent.className.indexOf('translatejs-text-element-hidden') > -1){
8717
- //父有了,那么子就不需要再加了
8718
- continue;
8719
- }else{
8720
- //没有,添加
8721
- nodeParent.className = nodeParent.className+' translatejs-text-element-hidden';
8722
- }
8723
- }
8965
+ for(var r = 0; r<elements.length; r++){
8966
+ elements[r].className = elements[r].className+' translatejs-text-element-hidden';
8724
8967
  }
8725
8968
 
8726
- var rects = translate.visual.getRects(nodes);
8969
+ var rects = translate.visual.getRects(elements);
8727
8970
  //console.log(rects)
8728
8971
  var rectsOneArray = translate.visual.rectsToOneArray(rects);
8729
8972
 
@@ -8737,70 +8980,29 @@ var translate = {
8737
8980
 
8738
8981
  var rectLineSplit = translate.visual.filterRectsByLineInterval(rectsOneArray, 2);
8739
8982
  for(var r = 0; r<rectLineSplit.length; r++){
8740
- if(rectLineSplit[r].node.nodeType === 1){
8741
- rectLineSplit[r].node.className = rectLineSplit[r].node.className+' translate_api_in_progress';
8742
- }else{
8743
- //不是元素,那么就取父级了
8744
- var nodeParent = rectLineSplit[r].node.parentNode;
8745
- if(nodeParent == null){
8746
- continue;
8747
- }
8748
- if(typeof(nodeParent.className) != 'undefined' && nodeParent.className != null && nodeParent.className.indexOf('translate_api_in_progress') > -1){
8749
- //父有了,那么子就不需要再加了
8750
- continue;
8751
- }else{
8752
- //没有,添加
8753
- nodeParent.className = nodeParent.className+' translate_api_in_progress';
8754
- }
8755
- }
8983
+ if(typeof(rectLineSplit[r].node.className) === 'string' && rectLineSplit[r].node.className.indexOf('translate_api_in_progress') > -1){
8984
+ //已经存在了,就不继续加了
8985
+ }else{
8986
+ rectLineSplit[r].node.className = rectLineSplit[r].node.className+' translate_api_in_progress';
8987
+ }
8756
8988
  }
8757
-
8758
8989
  });
8759
8990
 
8760
- translate.listener.execute.renderFinishByApi.push(function(uuid, from, to){
8761
- //translate.lifecycle.execute.renderFinish.push(function(uuid, to){ 这个是所有的全完成,得用单一的from完成就要立即对完成的from的显示,不然全完成就太慢了
8762
- for(var hash in translate.nodeQueue[uuid].list[from]){
8763
- if (!translate.nodeQueue[uuid].list[from].hasOwnProperty(hash)) {
8764
- continue;
8765
- }
8766
-
8767
- for(var nodeindex in translate.nodeQueue[uuid].list[from][hash].nodes){
8768
- if (!translate.nodeQueue[uuid].list[from][hash].nodes.hasOwnProperty(nodeindex)) {
8769
- continue;
8770
- }
8771
-
8772
- var node = translate.nodeQueue[uuid].list[from][hash].nodes[nodeindex].node;
8773
-
8774
- var operationNode;
8775
- if(node.nodeType === 1){
8776
- //是元素
8777
- operationNode = node;
8778
- }else{
8779
- //节点,如 #text
8780
- operationNode = node.parentNode;
8781
- if(operationNode == null){
8782
- continue;
8783
- }
8784
- }
8785
-
8786
-
8787
-
8788
-
8789
- if(typeof(operationNode.className) != 'undefined' && operationNode.className != null){
8790
-
8791
- if(operationNode.className.indexOf('translatejs-text-element-hidden') > -1){
8792
- operationNode.className = operationNode.className.replace(/translatejs-text-element-hidden/g, '');
8793
- }
8794
- if(operationNode.className.indexOf('translate_api_in_progress') > -1){
8795
- operationNode.className = operationNode.className.replace(/translate_api_in_progress/g, '');
8796
- }
8991
+ translate.lifecycle.execute.translateNetworkAfter.push(function(data){
8992
+ //取出当前变动的node,对应的元素
8993
+ var elements = translate.element.nodeToElement(data.nodes);
8994
+
8995
+ for(var r = 0; r<elements.length; r++){
8996
+ if(typeof(elements[r].className) === 'string'){
8997
+ if(elements[r].className.indexOf('translatejs-text-element-hidden') > -1){
8998
+ elements[r].className = elements[r].className.replace(/translatejs-text-element-hidden/g, '');
8999
+ }
9000
+ if(elements[r].className.indexOf('translate_api_in_progress') > -1){
9001
+ elements[r].className = elements[r].className.replace(/translate_api_in_progress/g, '');
8797
9002
  }
8798
-
8799
-
8800
- //nodeParent.className = parentClassName.replace(/translate_api_in_progress/g, '');
8801
-
8802
- }
8803
- }
9003
+ }
9004
+ }
9005
+
8804
9006
 
8805
9007
  });
8806
9008
 
@@ -8845,7 +9047,7 @@ var translate = {
8845
9047
  try{
8846
9048
  jsObject = eval('(' + jsString + ')');
8847
9049
  }catch(e){
8848
- console.log(e)
9050
+ translate.log(e)
8849
9051
  failureFunction(e);
8850
9052
  return;
8851
9053
  }
@@ -9171,8 +9373,8 @@ var translate = {
9171
9373
 
9172
9374
  // 检查 URL 是否匹配
9173
9375
  if(typeof(rule.url) == 'undefined' && rule.url == ''){
9174
- console.log('WARINNG : translate.network.rule find url is null:');
9175
- console.log(rule);
9376
+ translate.log('WARINNG : translate.network.rule find url is null:');
9377
+ translate.log(rule);
9176
9378
  continue;
9177
9379
  }
9178
9380
  //console.log(rule);
@@ -9264,8 +9466,8 @@ var translate = {
9264
9466
  //console.log(url);
9265
9467
  //console.log(rule);
9266
9468
  if(typeof(rule.params) == 'undefined' && typeof(rule.params.length) == 'undefined' && rule.params.length < 1){
9267
- console.log('WARINNG: rule not find params , rule : ');
9268
- console.log(rule);
9469
+ translate.log('WARINNG: rule not find params , rule : ');
9470
+ translate.log(rule);
9269
9471
  rule.params = [];
9270
9472
  }
9271
9473
 
@@ -9284,11 +9486,11 @@ var translate = {
9284
9486
  const translateResultData = await translate.network._translateText(original);
9285
9487
 
9286
9488
  if(typeof(translateResultData) == 'undefined'){
9287
- console.log('WARINNG: translateResultData is undefined');
9489
+ translate.log('WARINNG: translateResultData is undefined');
9288
9490
  }else if(typeof(translateResultData.result) == 'undefined'){
9289
- console.log('WARINNG: translateResultData.result is undefined');
9491
+ translate.log('WARINNG: translateResultData.result is undefined');
9290
9492
  }else if(translateResultData.result != 1){
9291
- console.log('WARINNG: translateResultData.result failure : '+translateResultData.info);
9493
+ translate.log('WARINNG: translateResultData.result failure : '+translateResultData.info);
9292
9494
  }else{
9293
9495
  params.set(paramName, decodeURIComponent(translateResultData.text[0]));
9294
9496
  }
@@ -10080,11 +10282,11 @@ var translate = {
10080
10282
  //正常,body还没加载
10081
10283
  }else{
10082
10284
  if(config.inHeadTip){
10083
- console.log('警告: translate.visual.webPageLoadTranslateBeforeHiddenText() 要在 head 标签中触发才能达到最好的效果!');
10285
+ translate.log('警告: translate.visual.webPageLoadTranslateBeforeHiddenText() 要在 head 标签中触发才能达到最好的效果!');
10084
10286
  }
10085
10287
  }
10086
10288
  if(translate.language.local == ''){
10087
- console.log('提醒:在使用 translate.visual.webPageLoadTranslateBeforeHiddenText() 之前,请先手动设置你的本地语种,参考: http://translate.zvo.cn/4066.html 如果你不设置本地语种,则不管你是否有切换语言,网页打开后都会先短暂的不显示文字');
10289
+ translate.log('提醒:在使用 translate.visual.webPageLoadTranslateBeforeHiddenText() 之前,请先手动设置你的本地语种,参考: http://translate.zvo.cn/4066.html 如果你不设置本地语种,则不管你是否有切换语言,网页打开后都会先短暂的不显示文字');
10088
10290
  }
10089
10291
 
10090
10292
  if(translate.language.local == '' || translate.language.translateLocal == true || translate.language.local != translate.language.getCurrent()){
@@ -10223,7 +10425,7 @@ var translate = {
10223
10425
  start:function(){
10224
10426
  if(translate.time.execute.isUse){
10225
10427
  //已经启动过了,不需要再启动了
10226
- console.log('translate.time.execute.start() 已经启动过了,不需要再启动了');
10428
+ translate.log('translate.time.execute.start() 已经启动过了,不需要再启动了');
10227
10429
  }
10228
10430
 
10229
10431
  translate.time.execute.data.isUse = true;
@@ -10287,7 +10489,7 @@ var translate = {
10287
10489
  translate.time.execute.data[uuid].translateTexts = translateTexts;
10288
10490
 
10289
10491
 
10290
- console.log('[time][translate.execute()] '+translate.time.execute.data[uuid].allTime+'ms '+(typeof(translate.time.execute.data[uuid].translateNetworkBeforeTime) != 'undefined'? '(search&cache '+(translate.time.execute.data[uuid].translateNetworkBeforeTime - translate.time.execute.data[uuid].startTime)+'ms)':'')+ (translateTexts.length > 0 ? (' , ['+translateLanguages+'] : ('+translateTexts.length+')['+translateTexts.slice(0, 3)+(translateTexts.length > 3 ? ', ...':'')+']'):''));
10492
+ translate.log('[time][translate.execute()] '+translate.time.execute.data[uuid].allTime+'ms '+(typeof(translate.time.execute.data[uuid].translateNetworkBeforeTime) != 'undefined'? '(search&cache '+(translate.time.execute.data[uuid].translateNetworkBeforeTime - translate.time.execute.data[uuid].startTime)+'ms)':'')+ (translateTexts.length > 0 ? (' , ['+translateLanguages+'] : ('+translateTexts.length+')['+translateTexts.slice(0, 3)+(translateTexts.length > 3 ? ', ...':'')+']'):''));
10291
10493
  });
10292
10494
  },
10293
10495
 
@@ -10339,11 +10541,11 @@ var translate = {
10339
10541
  }
10340
10542
  } catch (e) {
10341
10543
  // 如果获取调用栈失败,使用原始log方法
10342
- console.log(e);
10544
+ translate.log(e);
10343
10545
  }
10344
10546
 
10345
10547
  functionName = functionName.replace('Object.','translate.');
10346
- console.log(functionName+'() '+usetime+' -> '+remark);
10548
+ translate.log(functionName+'() '+usetime+' -> '+remark);
10347
10549
  }
10348
10550
 
10349
10551
  },
@@ -10449,13 +10651,11 @@ var translate = {
10449
10651
  });
10450
10652
  //将其记录到 translate.node.data
10451
10653
  translate.node.set(textNode,{
10452
- translate_default_value:{
10453
- attribute:"",
10454
- originalText: originalText,
10455
- resultText: text,
10456
- translateTexts: {}, //这里因为直接从缓存中取的,没有走网络接口,所以这里直接空
10457
- whole: true
10458
- },
10654
+ attribute:"",
10655
+ originalText: originalText,
10656
+ resultText: text,
10657
+ translateTexts: {}, //这里因为直接从缓存中取的,没有走网络接口,所以这里直接空
10658
+ whole: true,
10459
10659
  translateResults: {
10460
10660
  [originalText]:1
10461
10661
  },
@@ -10650,8 +10850,8 @@ var translate = {
10650
10850
 
10651
10851
  //进行判断,DOM是否加载完成了,如果未加载完成就触发了 translate.execute 执行,那么弹出警告提示
10652
10852
  if(document.readyState == 'loading'){
10653
- console.log('WARNING : The dom triggered translate.exece() before it was fully loaded, which does not comply with usage standards. The execution of translate.exece() should be done after the DOM is loaded');
10654
- console.log('警告:DOM 在完全加载之前触发了 translate.execute() ,这不符合使用规范,容易出现异常。你应该检查一下你的代码,translate.execute() 的执行应该在DOM加载完成后');
10853
+ translate.log('WARNING : The dom triggered translate.exece() before it was fully loaded, which does not comply with usage standards. The execution of translate.exece() should be done after the DOM is loaded');
10854
+ translate.log('警告:DOM 在完全加载之前触发了 translate.execute() ,这不符合使用规范,容易出现异常。你应该检查一下你的代码,translate.execute() 的执行应该在DOM加载完成后');
10655
10855
  }
10656
10856
 
10657
10857
 
@@ -10734,8 +10934,10 @@ var nodeuuid = {
10734
10934
 
10735
10935
 
10736
10936
  /*js copyright-notice start*/
10737
- 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');
10738
- console.log('=======\n\n\n\n 注意,只有你当前用的这个版本,才能看到这个提示,那如果使用中遇到任何异常,可加我微信 xnx3com 帮你做完美适配\n\n\n\n=======');
10937
+ //延迟触发,方便拦截自定义
10938
+ setTimeout(function(){
10939
+ translate.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');
10940
+ }, 1000);
10739
10941
  /*js copyright-notice end*/
10740
10942
 
10741
10943
  //初始化