i18n-jsautotranslate 3.12.7 → 3.12.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/index.js +193 -25
- 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,7 +12,7 @@ var translate = { | |
| 12 12 | 
             
            	 * 格式:major.minor.patch.date
         | 
| 13 13 | 
             
            	 */
         | 
| 14 14 | 
             
            	// AUTO_VERSION_START
         | 
| 15 | 
            -
            	version: '3.12. | 
| 15 | 
            +
            	version: '3.12.11.20250122',
         | 
| 16 16 | 
             
            	// AUTO_VERSION_END
         | 
| 17 17 | 
             
            	/*
         | 
| 18 18 | 
             
            		当前使用的版本,默认使用v2. 可使用 setUseVersion2(); 
         | 
| @@ -179,7 +179,7 @@ var translate = { | |
| 179 179 | 
             
            					document.getElementById('translateSelectLanguage').style.width = '94px';
         | 
| 180 180 | 
             
            				}catch(e){ console.log(e);} 
         | 
| 181 181 | 
             
            				*/
         | 
| 182 | 
            -
            			});
         | 
| 182 | 
            +
            			}, null);
         | 
| 183 183 |  | 
| 184 184 |  | 
| 185 185 | 
             
            		}
         | 
| @@ -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,14 @@ 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);
         | 
| 1125 1122 | 
             
            									}
         | 
| 1123 | 
            +
             | 
| 1126 1124 | 
             
            									break;
         | 
| 1127 1125 | 
             
            								}
         | 
| 1128 1126 | 
             
            							}
         | 
| 1127 | 
            +
            							
         | 
| 1129 1128 | 
             
            						}, 50, ipnode);
         | 
| 1130 1129 |  | 
| 1131 1130 | 
             
            						translate.element.nodeAnalyse.set(this.nodes[hash][task_index], task.originalText, task.resultText, task['attribute']);
         | 
| @@ -1221,10 +1220,100 @@ var translate = { | |
| 1221 1220 | 
             
            			}
         | 
| 1222 1221 | 
             
            		}
         | 
| 1223 1222 | 
             
            	},
         | 
| 1223 | 
            +
             | 
| 1224 | 
            +
             | 
| 1225 | 
            +
            	/*
         | 
| 1226 | 
            +
            		当前状态,执行状态
         | 
| 1227 | 
            +
            		0 空闲(或者执行翻译完毕)
         | 
| 1228 | 
            +
            		10 扫描要翻译的node,并读取浏览器缓存的翻译内容进行渲染显示
         | 
| 1229 | 
            +
            		20 浏览器缓存渲染完毕,ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求
         | 
| 1230 | 
            +
            		至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程
         | 
| 1231 | 
            +
            	*/
         | 
| 1232 | 
            +
            	state:0,
         | 
| 1233 | 
            +
             | 
| 1234 | 
            +
            	/*
         | 
| 1235 | 
            +
            		等待翻译队列  v3.12.6 增加
         | 
| 1236 | 
            +
            		当前是否有需要等待翻译的任务,这个目的是为了保证同一时间 translate.execute() 只有一次在执行,免得被新手前端给造成死循环,导致edge翻译给你屏蔽,用户网页还卡死
         | 
| 1237 | 
            +
            		当执行 translate.execute() 时,会先判断状态 translate.state 是否是0空闲的状态,如果空闲,才会执行,如果不是空闲,则不会执行,而是进入到这里进行等待,等待执行完毕后 translate.state 变成0空闲之后,再来执行这里的
         | 
| 1238 | 
            +
            		
         | 
| 1239 | 
            +
            	*/
         | 
| 1240 | 
            +
            	waitingExecute:{
         | 
| 1241 | 
            +
             | 
| 1242 | 
            +
            		/*
         | 
| 1243 | 
            +
            			一维数组形态,存放执行的翻译任务
         | 
| 1244 | 
            +
            			二维对象形态,存放执行传入的 docs
         | 
| 1245 | 
            +
            		*/
         | 
| 1246 | 
            +
            		queue:[],
         | 
| 1247 | 
            +
            		/*
         | 
| 1248 | 
            +
            			增加一个翻译任务到翻译队列中
         | 
| 1249 | 
            +
            			docs 同 translate.execute(docs) 的传入参数
         | 
| 1250 | 
            +
            		 */ 
         | 
| 1251 | 
            +
            		add:function(docs){
         | 
| 1252 | 
            +
            			//向数组末尾追加
         | 
| 1253 | 
            +
            			translate.waitingExecute.queue.push(docs);
         | 
| 1254 | 
            +
            			//开启一个定时器进行触发
         | 
| 1255 | 
            +
            			let intervalId = setInterval(function() {
         | 
| 1256 | 
            +
            				if(translate.state == 0){
         | 
| 1257 | 
            +
            					//清除定时器,结束循环
         | 
| 1258 | 
            +
            					clearInterval(intervalId);
         | 
| 1259 | 
            +
            					var docs = translate.waitingExecute.get();
         | 
| 1260 | 
            +
            					translate.execute(docs);
         | 
| 1261 | 
            +
            					//console.log('stop waitingExecute setInterval');
         | 
| 1262 | 
            +
            				}
         | 
| 1263 | 
            +
            			}, 500);
         | 
| 1264 | 
            +
            		},
         | 
| 1265 | 
            +
            		/*
         | 
| 1266 | 
            +
            			从 quque 中取第一个元素,同时将其从queue中删除掉它。
         | 
| 1267 | 
            +
            			如果取的时候 quque已经没有任何元素了,会返回 null, 但是理论上不会出现null
         | 
| 1268 | 
            +
            		 */
         | 
| 1269 | 
            +
            		get:function(){
         | 
| 1270 | 
            +
            			//使用 shift 方法删除数组的第一个元素,并将第一个元素的值返回
         | 
| 1271 | 
            +
            			if(translate.waitingExecute.queue.length > 0){
         | 
| 1272 | 
            +
            				return translate.waitingExecute.queue.shift();
         | 
| 1273 | 
            +
            			}else{
         | 
| 1274 | 
            +
            				console.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
         | 
| 1275 | 
            +
            				return null;
         | 
| 1276 | 
            +
            			}
         | 
| 1277 | 
            +
            		},
         | 
| 1278 | 
            +
            		//当前 translate.translateRequest[uuid] 的是否已经全部执行完毕,这里单纯只是对 translate.translateRequest[uuid] 的进行判断,这里要在 translate.json 接口触发完并渲染完毕后触发,当然接口失败时也要触发
         | 
| 1279 | 
            +
            		isAllExecuteFinish:function(uuid){
         | 
| 1280 | 
            +
            			
         | 
| 1281 | 
            +
            			for(var lang in translate.translateRequest[uuid]){
         | 
| 1282 | 
            +
            				for(var i = 0; i<translate.translateRequest[uuid][lang].length; i++){
         | 
| 1283 | 
            +
            					if(translate.translateRequest[uuid][lang][i].executeFinish == 0){
         | 
| 1284 | 
            +
            						//这个还没执行完,那么直接退出,不在向后执行了
         | 
| 1285 | 
            +
            						//console.log('uuid:'+uuid+'  lang:'+lang+'  executeFinish:0  time:'+translate.translateRequest[uuid][lang][i][addtime]);
         | 
| 1286 | 
            +
            						
         | 
| 1287 | 
            +
            						//这里要考虑进行时间判断
         | 
| 1288 | 
            +
             | 
| 1289 | 
            +
            						return;
         | 
| 1290 | 
            +
            					}
         | 
| 1291 | 
            +
            				}
         | 
| 1292 | 
            +
            			}
         | 
| 1293 | 
            +
             | 
| 1294 | 
            +
            			//都执行完了,那么设置完毕
         | 
| 1295 | 
            +
            			translate.state = 0;
         | 
| 1296 | 
            +
            			translate.executeNumber++;
         | 
| 1297 | 
            +
            		}
         | 
| 1298 | 
            +
             | 
| 1299 | 
            +
            	},
         | 
| 1224 1300 |  | 
| 1225 | 
            -
            	 | 
| 1226 | 
            -
            	 | 
| 1301 | 
            +
            	//execute() 方法已经被执行过多少次了, 只有execute() 完全执行完,也就是界面渲染完毕后,它才会+1
         | 
| 1302 | 
            +
            	executeNumber:0,
         | 
| 1303 | 
            +
             | 
| 1304 | 
            +
            	/*
         | 
| 1305 | 
            +
            		执行翻译操作。翻译的是 nodeQueue 中的
         | 
| 1306 | 
            +
            		docs 如果传入,那么翻译的只是传入的这个docs的。传入如 [document.getElementById('xxx'),document.getElementById('xxx'),...]
         | 
| 1307 | 
            +
            			 如果不传入或者传入null,则是翻译整个网页所有能翻译的元素	
         | 
| 1308 | 
            +
            	 */ 
         | 
| 1227 1309 | 
             
            	execute:function(docs){
         | 
| 1310 | 
            +
            		if(translate.state != 0){
         | 
| 1311 | 
            +
            			console.log('当前翻译还未完结,新的翻译任务已加入等待翻译队列中,待翻译结束后便会执行当前翻译任务。');
         | 
| 1312 | 
            +
            			translate.waitingExecute.add(docs);
         | 
| 1313 | 
            +
            			return;
         | 
| 1314 | 
            +
            		}
         | 
| 1315 | 
            +
            		translate.state = 1;
         | 
| 1316 | 
            +
            		//console.log('translate.state = 1');
         | 
| 1228 1317 | 
             
            		if(typeof(docs) != 'undefined'){
         | 
| 1229 1318 | 
             
            			//execute传入参数,只有v2版本才支持
         | 
| 1230 1319 | 
             
            			translate.useVersion = 'v2';
         | 
| @@ -1285,6 +1374,7 @@ var translate = { | |
| 1285 1374 | 
             
            			}
         | 
| 1286 1375 |  | 
| 1287 1376 | 
             
            			//没有指定翻译目标语言、又没自动获取用户本国语种,则不翻译
         | 
| 1377 | 
            +
            			translate.state = 0;
         | 
| 1288 1378 | 
             
            			return;
         | 
| 1289 1379 | 
             
            		}
         | 
| 1290 1380 |  | 
| @@ -1294,6 +1384,7 @@ var translate = { | |
| 1294 1384 | 
             
            				//这是自定义设置的允许翻译本地语种中,跟本地语种不一致的语言进行翻译
         | 
| 1295 1385 |  | 
| 1296 1386 | 
             
            			}else{
         | 
| 1387 | 
            +
            				translate.state = 0;
         | 
| 1297 1388 | 
             
            				return;
         | 
| 1298 1389 | 
             
            			}
         | 
| 1299 1390 | 
             
            		}
         | 
| @@ -1312,14 +1403,17 @@ var translate = { | |
| 1312 1403 | 
             
            			其实2、3都是通过 getDocuments() 取,在getDocuments() 就对2、3进行了判断
         | 
| 1313 1404 | 
             
            		*/
         | 
| 1314 1405 | 
             
            		var all;
         | 
| 1315 | 
            -
            		if(typeof(docs) != 'undefined'){
         | 
| 1406 | 
            +
            		if(typeof(docs) != 'undefined' && docs != null){
         | 
| 1316 1407 | 
             
            			//1. 这个方法已经指定的翻译 nodes
         | 
| 1317 1408 |  | 
| 1409 | 
            +
            			/* v3.12.6 注释,转到判断非null
         | 
| 1318 1410 | 
             
            			if(docs == null){
         | 
| 1319 1411 | 
             
            				//要翻译的目标区域不存在
         | 
| 1320 1412 | 
             
            				console.log('translate.execute(...) 中传入的要翻译的目标区域不存在。');
         | 
| 1413 | 
            +
            				translate.state = 0;
         | 
| 1321 1414 | 
             
            				return;
         | 
| 1322 1415 | 
             
            			}
         | 
| 1416 | 
            +
            			*/
         | 
| 1323 1417 |  | 
| 1324 1418 | 
             
            			if(typeof(docs.length) == 'undefined'){
         | 
| 1325 1419 | 
             
            				//不是数组,是单个元素
         | 
| @@ -1722,6 +1816,8 @@ var translate = { | |
| 1722 1816 | 
             
            		//console.log(translate.nodeQueue[uuid]['list'])
         | 
| 1723 1817 | 
             
            		if(fanyiLangs.length == 0){
         | 
| 1724 1818 | 
             
            			//没有需要翻译的,直接退出
         | 
| 1819 | 
            +
            			translate.state = 0;
         | 
| 1820 | 
            +
            			translate.executeNumber++;
         | 
| 1725 1821 | 
             
            			return;
         | 
| 1726 1822 | 
             
            		}
         | 
| 1727 1823 |  | 
| @@ -1767,6 +1863,9 @@ var translate = { | |
| 1767 1863 | 
             
            			}
         | 
| 1768 1864 | 
             
            		}
         | 
| 1769 1865 | 
             
            		//加入 translate.inProgressNodes -- end
         | 
| 1866 | 
            +
            	
         | 
| 1867 | 
            +
            		//状态
         | 
| 1868 | 
            +
            		translate.state = 20;
         | 
| 1770 1869 |  | 
| 1771 1870 |  | 
| 1772 1871 |  | 
| @@ -1776,6 +1875,9 @@ var translate = { | |
| 1776 1875 | 
             
            			//console.log(typeof(translateTextArray[lang]))
         | 
| 1777 1876 |  | 
| 1778 1877 | 
             
            			if(typeof(translateTextArray[lang]) == 'undefined' || translateTextArray[lang].length < 1){
         | 
| 1878 | 
            +
            				console.log('异常,理论上不应该存在: typeof(translateTextArray[lang]) == \'undefined\' || translateTextArray[lang].length < 1');
         | 
| 1879 | 
            +
            				translate.state = 0;
         | 
| 1880 | 
            +
            				translate.executeNumber++;
         | 
| 1779 1881 | 
             
            				return;
         | 
| 1780 1882 | 
             
            			}
         | 
| 1781 1883 |  | 
| @@ -1785,11 +1887,21 @@ var translate = { | |
| 1785 1887 | 
             
            				console.log(translateTextArray[lang][ttr_index])
         | 
| 1786 1888 | 
             
            			}*/
         | 
| 1787 1889 |  | 
| 1890 | 
            +
            			//将需要请求翻译接口的加入到 translate.translateRequest 中
         | 
| 1891 | 
            +
            			if(typeof(translate.translateRequest[uuid]) == 'undefined' || translate.translateRequest[uuid] == null){
         | 
| 1892 | 
            +
            				translate.translateRequest[uuid] = {};
         | 
| 1893 | 
            +
            			}
         | 
| 1894 | 
            +
            			translate.translateRequest[uuid][lang] = {};
         | 
| 1895 | 
            +
            			translate.translateRequest[uuid][lang].executeFinish = 0; //是否执行完毕,0是执行中, 1是执行完毕(不管是失败还是成功) 而且执行完毕是指ajax请求获得响应,并且dom渲染完成之后才算完毕。当然如果ajax接口失败那也是直接算完毕
         | 
| 1896 | 
            +
            			translate.translateRequest[uuid][lang].addtime = Math.floor(Date.now() / 1000);
         | 
| 1897 | 
            +
             | 
| 1898 | 
            +
             | 
| 1788 1899 | 
             
            			/*** 翻译开始 ***/
         | 
| 1789 1900 | 
             
            			var url = translate.request.api.translate;
         | 
| 1790 1901 | 
             
            			var data = {
         | 
| 1791 1902 | 
             
            				from:lang,
         | 
| 1792 1903 | 
             
            				to:translate.to,
         | 
| 1904 | 
            +
            				lowercase:translate.whole.isEnableAll? '0':'1', //首字母大写
         | 
| 1793 1905 | 
             
            				//text:JSON.stringify(translateTextArray[lang])
         | 
| 1794 1906 | 
             
            				text:encodeURIComponent(JSON.stringify(translateTextArray[lang]))
         | 
| 1795 1907 | 
             
            			};
         | 
| @@ -1798,6 +1910,10 @@ var translate = { | |
| 1798 1910 | 
             
            				//console.log(data); 
         | 
| 1799 1911 | 
             
            				//console.log(translateTextArray[data.from]);
         | 
| 1800 1912 | 
             
            				if(data.result == 0){
         | 
| 1913 | 
            +
            					translate.translateRequest[uuid][lang].result = 2;
         | 
| 1914 | 
            +
            					translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
         | 
| 1915 | 
            +
            					translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
         | 
| 1916 | 
            +
            					translate.waitingExecute.isAllExecuteFinish();
         | 
| 1801 1917 | 
             
            					console.log('=======ERROR START=======');
         | 
| 1802 1918 | 
             
            					console.log(translateTextArray[data.from]);
         | 
| 1803 1919 | 
             
            					//console.log(encodeURIComponent(JSON.stringify(translateTextArray[data.from])));
         | 
| @@ -1805,6 +1921,7 @@ var translate = { | |
| 1805 1921 | 
             
            					console.log('response : '+data.info);
         | 
| 1806 1922 | 
             
            					console.log('=======ERROR END  =======');
         | 
| 1807 1923 | 
             
            					//translate.temp_executeFinishNumber++; //记录执行完的次数
         | 
| 1924 | 
            +
             | 
| 1808 1925 | 
             
            					return;
         | 
| 1809 1926 | 
             
            				}
         | 
| 1810 1927 |  | 
| @@ -1868,12 +1985,49 @@ var translate = { | |
| 1868 1985 | 
             
            				task.execute(); //执行渲染任务
         | 
| 1869 1986 | 
             
            				//translate.temp_executeFinishNumber++; //记录执行完的次数
         | 
| 1870 1987 |  | 
| 1988 | 
            +
            				translate.translateRequest[uuid][lang].result = 1;
         | 
| 1989 | 
            +
            				translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
         | 
| 1990 | 
            +
            				translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
         | 
| 1991 | 
            +
            				translate.waitingExecute.isAllExecuteFinish();
         | 
| 1992 | 
            +
            			}, function(xhr){
         | 
| 1993 | 
            +
            				translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
         | 
| 1994 | 
            +
            				translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
         | 
| 1995 | 
            +
            				translate.translateRequest[uuid][lang].result = 3;
         | 
| 1996 | 
            +
            				translate.waitingExecute.isAllExecuteFinish();
         | 
| 1871 1997 | 
             
            			});
         | 
| 1872 1998 | 
             
            			/*** 翻译end ***/
         | 
| 1873 | 
            -
             | 
| 1874 | 
            -
            			
         | 
| 1875 1999 | 
             
            		}
         | 
| 1876 2000 | 
             
            	},
         | 
| 2001 | 
            +
             | 
| 2002 | 
            +
            	/**
         | 
| 2003 | 
            +
            	 * 翻译请求记录
         | 
| 2004 | 
            +
            	 * 一维:key:uuid,也就是execute每次执行都会创建一个翻译队列,这个是翻译队列的唯一标识。  这个uuid跟 nodeQueue 的uuid是一样的
         | 
| 2005 | 
            +
            	 * 		value:对象
         | 
| 2006 | 
            +
            	 * 二维: 对象,包含:
         | 
| 2007 | 
            +
            	 * 		from 存放的是要翻译的源语种,比如要讲简体中文翻译为英文,这里存放的就是 chinese_simplified
         | 
| 2008 | 
            +
            	 * 		state 是否执行完毕,0是执行中, 1是执行完毕(不管是失败还是成功) 而且执行完毕是指ajax请求获得响应,并且dom渲染完成之后才算完毕。当然如果ajax接口失败那也是直接算完毕
         | 
| 2009 | 
            +
            	 * 		addtime 这条数据加入到本数组的时间,也就是进行ajax请求开始那一刻的时间,10位时间戳
         | 
| 2010 | 
            +
            	 * 		stoptime 执行完毕的时间,也就是state转为2那一刻的时间
         | 
| 2011 | 
            +
            	 * 		result 执行结果, 0 是还没执行完,等待执行完, > 0 是执行完了有结果了,  
         | 
| 2012 | 
            +
            	 * 												  1 是执行成功
         | 
| 2013 | 
            +
            	 * 												  2 是接口有响应,也是200响应,但是接口响应的结果返回了错误,也就是返回了 {result:0, info:'...'}
         | 
| 2014 | 
            +
            	 * 												  3 是接口不是200响应码
         | 
| 2015 | 
            +
            	 * 
         | 
| 2016 | 
            +
            	 */
         | 
| 2017 | 
            +
            	translateRequest:{
         | 
| 2018 | 
            +
            		/* 
         | 
| 2019 | 
            +
            		uuid:[
         | 
| 2020 | 
            +
            			'chinese_simplified':{
         | 
| 2021 | 
            +
            				executeFinish:0,
         | 
| 2022 | 
            +
            				addtime:150001111,
         | 
| 2023 | 
            +
            				stoptime:150001111,
         | 
| 2024 | 
            +
            				result:0
         | 
| 2025 | 
            +
            			},
         | 
| 2026 | 
            +
            			...
         | 
| 2027 | 
            +
            		] 
         | 
| 2028 | 
            +
            		*/
         | 
| 2029 | 
            +
            	},
         | 
| 2030 | 
            +
             | 
| 1877 2031 | 
             
            	/*
         | 
| 1878 2032 | 
             
            		将已成功翻译并渲染的node节点进行缓存记录
         | 
| 1879 2033 | 
             
            		key: node节点的唯一标识符,通过 nodeuuid.uuid() 生成
         | 
| @@ -3873,7 +4027,7 @@ var translate = { | |
| 3873 4027 | 
             
            				translate.selectLanguageTag
         | 
| 3874 4028 | 
             
            				translate.execute(); //执行翻译
         | 
| 3875 4029 | 
             
            			}
         | 
| 3876 | 
            -
            		});
         | 
| 4030 | 
            +
            		}, null);
         | 
| 3877 4031 | 
             
            	},
         | 
| 3878 4032 |  | 
| 3879 4033 | 
             
            	util:{
         | 
| @@ -4363,7 +4517,7 @@ var translate = { | |
| 4363 4517 | 
             
            			},
         | 
| 4364 4518 |  | 
| 4365 4519 | 
             
            			language:{
         | 
| 4366 | 
            -
            				json:[{"id":"ukrainian","name":" | 
| 4520 | 
            +
            				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 4521 | 
             
            				/*
         | 
| 4368 4522 | 
             
            					获取map形式的语言列表 
         | 
| 4369 4523 | 
             
            					key为 translate.service 的 name  
         | 
| @@ -4387,7 +4541,7 @@ var translate = { | |
| 4387 4541 | 
             
            			 * @param data 请求的参数数据
         | 
| 4388 4542 | 
             
            			 * @param func 请求完成的回调,传入如 function(data){ console.log(data); }
         | 
| 4389 4543 | 
             
            			 */
         | 
| 4390 | 
            -
            			translate:function(path, data, func){
         | 
| 4544 | 
            +
            			translate:function(path, data, func, abnormalFunc){
         | 
| 4391 4545 | 
             
            				var textArray = JSON.parse(decodeURIComponent(data.text));
         | 
| 4392 4546 | 
             
            				let translateTextArray = translate.util.split(textArray, 48000);
         | 
| 4393 4547 | 
             
            				//console.log(translateTextArray);
         | 
| @@ -4462,10 +4616,7 @@ var translate = { | |
| 4462 4616 | 
             
            							}
         | 
| 4463 4617 |  | 
| 4464 4618 | 
             
            							func(d);
         | 
| 4465 | 
            -
            						}, 'post', true, {'Authorization':'Bearer '+auth, 'Content-Type':'application/json'},  | 
| 4466 | 
            -
            							console.log('---------error--------');
         | 
| 4467 | 
            -
            							console.log('edge translate service error, http code : '+xhr.status + ', response text : '+xhr.responseText);
         | 
| 4468 | 
            -
            						}, true);
         | 
| 4619 | 
            +
            						}, 'post', true, {'Authorization':'Bearer '+auth, 'Content-Type':'application/json'}, abnormalFunc, true);
         | 
| 4469 4620 |  | 
| 4470 4621 |  | 
| 4471 4622 | 
             
            					}
         | 
| @@ -4762,8 +4913,9 @@ var translate = { | |
| 4762 4913 | 
             
            		 * 		}
         | 
| 4763 4914 | 
             
            		 * 		
         | 
| 4764 4915 | 
             
            		 * @param func 请求完成的回调,传入如 function(data){ console.log(data); }
         | 
| 4916 | 
            +
            		 * @param abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){}  另外这里的 xhr 会额外有个参数  xhr.requestURL 返回当前请求失败的url
         | 
| 4765 4917 | 
             
            		 */
         | 
| 4766 | 
            -
            		post:function(path, data, func){
         | 
| 4918 | 
            +
            		post:function(path, data, func, abnormalFunc){
         | 
| 4767 4919 | 
             
            			var headers = {
         | 
| 4768 4920 | 
             
            				'content-type':'application/x-www-form-urlencoded',
         | 
| 4769 4921 | 
             
            			};
         | 
| @@ -4779,7 +4931,7 @@ var translate = { | |
| 4779 4931 | 
             
            			//if(url.indexOf('edge') > -1 && path == translate.request.api.translate){
         | 
| 4780 4932 | 
             
            			if(translate.service.name == 'client.edge'){	
         | 
| 4781 4933 | 
             
            				if(path == translate.request.api.translate){
         | 
| 4782 | 
            -
            					translate.service.edge.translate(path, data, func);
         | 
| 4934 | 
            +
            					translate.service.edge.translate(path, data, func, abnormalFunc);
         | 
| 4783 4935 | 
             
            					return;
         | 
| 4784 4936 | 
             
            				}
         | 
| 4785 4937 | 
             
            				if(path == translate.request.api.language){
         | 
| @@ -4795,7 +4947,7 @@ var translate = { | |
| 4795 4947 | 
             
            			}
         | 
| 4796 4948 | 
             
            			// ------- edge end --------
         | 
| 4797 4949 |  | 
| 4798 | 
            -
            			this.send(path, data, func, 'post', true, headers,  | 
| 4950 | 
            +
            			this.send(path, data, func, 'post', true, headers, abnormalFunc, true);
         | 
| 4799 4951 | 
             
            		},
         | 
| 4800 4952 | 
             
            		/**
         | 
| 4801 4953 | 
             
            		 * 发送请求
         | 
| @@ -5014,7 +5166,7 @@ var translate = { | |
| 5014 5166 | 
             
            				}
         | 
| 5015 5167 |  | 
| 5016 5168 | 
             
            				func(data);
         | 
| 5017 | 
            -
            			});
         | 
| 5169 | 
            +
            			}, null);
         | 
| 5018 5170 | 
             
            		},
         | 
| 5019 5171 | 
             
            		listener:{
         | 
| 5020 5172 | 
             
            			minIntervalTime:800, // 两次触发的最小间隔时间,单位是毫秒,这里默认是800毫秒。最小填写时间为 200毫秒
         | 
| @@ -5365,7 +5517,7 @@ var translate = { | |
| 5365 5517 | 
             
            				curTooltipEle.style.top =selectionY+20+"px";
         | 
| 5366 5518 | 
             
            				curTooltipEle.style.left = selectionX+50+"px" ;
         | 
| 5367 5519 | 
             
            				curTooltipEle.style.display = "";
         | 
| 5368 | 
            -
            			});
         | 
| 5520 | 
            +
            			}, null);
         | 
| 5369 5521 | 
             
            		},
         | 
| 5370 5522 | 
             
            		start:function () {
         | 
| 5371 5523 | 
             
            			//新建一个tooltip元素节点用于显示翻译
         | 
| @@ -5536,6 +5688,22 @@ var nodeuuid = { | |
| 5536 5688 | 
             
            		}
         | 
| 5537 5689 | 
             
            		return uuid;
         | 
| 5538 5690 | 
             
            	},
         | 
| 5691 | 
            +
            	/*
         | 
| 5692 | 
            +
            		开启远程调试能力,当你使用中遇到问题,需要向开源作者求助时,可以在你项目中主动调用这个方法,也就是 translate.enableRemoteDebug(); 即可启动远程调试能力
         | 
| 5693 | 
            +
            		开源项目作者就可以对你当前出错的页面进行远程调试排查问题所在。当然前提是你的页面要保持别关闭。
         | 
| 5694 | 
            +
             | 
| 5695 | 
            +
            		这个能力是通过开源项目 https://github.com/HuolalaTech/page-spy-web 来实现的
         | 
| 5696 | 
            +
            		
         | 
| 5697 | 
            +
            	*/
         | 
| 5698 | 
            +
            	enableRemoteDebug:function(){
         | 
| 5699 | 
            +
             | 
| 5700 | 
            +
            		/*
         | 
| 5701 | 
            +
             | 
| 5702 | 
            +
            			待同事实现
         | 
| 5703 | 
            +
            		*/
         | 
| 5704 | 
            +
             | 
| 5705 | 
            +
            	}
         | 
| 5706 | 
            +
             | 
| 5539 5707 |  | 
| 5540 5708 | 
             
            }
         | 
| 5541 5709 | 
             
            console.log('------ translate.js ------\nTwo lines of js html automatic translation, page without change, no language configuration file, no API Key, SEO friendly! Open warehouse : https://github.com/xnx3/translate \n两行js实现html全自动翻译。 无需改动页面、无语言配置文件、无API Key、对SEO友好!完全开源,代码仓库:https://gitee.com/mail_osc/translate');
         | 
    
        package/package.json
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            {
         | 
| 2 2 | 
             
              "name": "i18n-jsautotranslate",
         | 
| 3 | 
            -
              "version": "3.12. | 
| 3 | 
            +
              "version": "3.12.11",
         | 
| 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": {
         |