torchv-translate 1.0.5 → 1.0.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "torchv-translate",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
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
  "exports": {
@@ -2086,8 +2086,13 @@ var translate = {
2086
2086
  20 浏览器缓存渲染完毕,ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求
2087
2087
  至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程
2088
2088
  */
2089
- state:0,
2090
-
2089
+ state:0,
2090
+
2091
+ /*
2092
+ 取消翻译任务的版本号(路由切换时+1),用于忽略未完成的翻译请求
2093
+ */
2094
+ cancelVersion:0,
2095
+
2091
2096
 
2092
2097
  /*
2093
2098
  等待翻译队列 v3.12.6 增加
@@ -2095,45 +2100,72 @@ var translate = {
2095
2100
  当执行 translate.execute() 时,会先判断状态 translate.state 是否是0空闲的状态,如果空闲,才会执行,如果不是空闲,则不会执行,而是进入到这里进行等待,等待执行完毕后 translate.state 变成0空闲之后,再来执行这里的
2096
2101
 
2097
2102
  */
2098
- waitingExecute:{
2099
- use:true, //默认是使用,自有部署场景不担心并发的场景,可以禁用,以提高用户使用体验。
2100
-
2101
- /*
2102
- 一维数组形态,存放执行的翻译任务
2103
- 二维对象形态,存放执行传入的 docs
2104
- */
2105
- queue:[],
2106
- /*
2107
- 增加一个翻译任务到翻译队列中
2108
- docs 同 translate.execute(docs) 的传入参数
2109
- */
2110
- add:function(docs){
2111
- //向数组末尾追加
2112
- translate.waitingExecute.queue.push(docs);
2113
- //开启一个定时器进行触发
2114
- let intervalId = setInterval(function() {
2115
- if(translate.state == 0){
2116
- //清除定时器,结束循环
2117
- clearInterval(intervalId);
2118
- var docs = translate.waitingExecute.get();
2119
- translate.execute(docs);
2120
- //console.log('stop waitingExecute setInterval');
2121
- }
2122
- }, 500);
2123
- },
2103
+ waitingExecute:{
2104
+ use:true, //默认是使用,自有部署场景不担心并发的场景,可以禁用,以提高用户使用体验。
2105
+
2106
+ /*
2107
+ 一维数组形态,存放执行的翻译任务
2108
+ 二维对象形态,存放执行传入的 docs
2109
+ */
2110
+ queue:[],
2111
+ //等待队列使用的定时器id集合,便于取消
2112
+ intervalIds:[],
2113
+ /*
2114
+ 增加一个翻译任务到翻译队列中
2115
+ docs 同 translate.execute(docs) 的传入参数
2116
+ */
2117
+ add:function(docs){
2118
+ //向数组末尾追加
2119
+ translate.waitingExecute.queue.push(docs);
2120
+ //开启一个定时器进行触发
2121
+ let intervalId = setInterval(function() {
2122
+ if(translate.state == 0){
2123
+ //清除定时器,结束循环
2124
+ clearInterval(intervalId);
2125
+ //移除记录
2126
+ for(var iid = translate.waitingExecute.intervalIds.length - 1; iid >= 0; iid--){
2127
+ if(translate.waitingExecute.intervalIds[iid] === intervalId){
2128
+ translate.waitingExecute.intervalIds.splice(iid, 1);
2129
+ break;
2130
+ }
2131
+ }
2132
+ if(translate.waitingExecute.queue.length < 1){
2133
+ return;
2134
+ }
2135
+ var docs = translate.waitingExecute.get();
2136
+ if(docs != null){
2137
+ translate.execute(docs);
2138
+ }
2139
+ //console.log('stop waitingExecute setInterval');
2140
+ }
2141
+ }, 500);
2142
+ translate.waitingExecute.intervalIds.push(intervalId);
2143
+ },
2124
2144
  /*
2125
2145
  从 quque 中取第一个元素,同时将其从queue中删除掉它。
2126
2146
  如果取的时候 quque已经没有任何元素了,会返回 null, 但是理论上不会出现null
2127
2147
  */
2128
- get:function(){
2129
- //使用 shift 方法删除数组的第一个元素,并将第一个元素的值返回
2130
- if(translate.waitingExecute.queue.length > 0){
2131
- return translate.waitingExecute.queue.shift();
2132
- }else{
2133
- translate.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
2134
- return null;
2135
- }
2136
- },
2148
+ get:function(){
2149
+ //使用 shift 方法删除数组的第一个元素,并将第一个元素的值返回
2150
+ if(translate.waitingExecute.queue.length > 0){
2151
+ return translate.waitingExecute.queue.shift();
2152
+ }else{
2153
+ translate.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。');
2154
+ return null;
2155
+ }
2156
+ },
2157
+ /*
2158
+ 清空等待队列,并取消定时器
2159
+ */
2160
+ clear:function(){
2161
+ translate.waitingExecute.queue = [];
2162
+ if(typeof(translate.waitingExecute.intervalIds) != 'undefined' && translate.waitingExecute.intervalIds.length > 0){
2163
+ for(var i = 0; i < translate.waitingExecute.intervalIds.length; i++){
2164
+ clearInterval(translate.waitingExecute.intervalIds[i]);
2165
+ }
2166
+ translate.waitingExecute.intervalIds = [];
2167
+ }
2168
+ },
2137
2169
  /*
2138
2170
  当前 translate.translateRequest[uuid] 的是否已经全部执行完毕
2139
2171
  这里单纯只是对 translate.translateRequest[uuid] 的进行判断
@@ -2151,28 +2183,38 @@ var translate = {
2151
2183
  @param result 本次网络请求的结果, 1成功, 0失败。 网络不通,翻译结果返回result非1都是记入0
2152
2184
  @param info 如果result为0,这里是失败信息
2153
2185
  */
2154
- isAllExecuteFinish:function(uuid, from, to, result, info){
2155
-
2156
- translate.listener.execute.renderFinishByApiRun(uuid, from, to);
2157
-
2158
- //通过 uuid、from 取得本次翻译相关的 texts、nodes , 触发 translateNetworkAfter_Trigger 钩子
2159
- //获取请求日志
2160
- var requestData = translate.request.data[uuid].list[from][to];
2161
- translate.lifecycle.execute.translateNetworkAfter_Trigger({
2162
- uuid: uuid,
2163
- from: from,
2164
- to: to,
2165
- texts: requestData.texts,
2166
- nodes: requestData.nodes,
2167
- result: result,
2168
- info: info
2169
- });
2170
-
2171
- //console.log('uuid:'+uuid+', from:'+from+', to:'+to);
2172
- for(var lang in translate.translateRequest[uuid]){
2173
- if (!translate.translateRequest[uuid].hasOwnProperty(lang)) {
2174
- continue;
2175
- }
2186
+ isAllExecuteFinish:function(uuid, from, to, result, info){
2187
+
2188
+ translate.listener.execute.renderFinishByApiRun(uuid, from, to);
2189
+
2190
+ //通过 uuid、from 取得本次翻译相关的 texts、nodes , 触发 translateNetworkAfter_Trigger 钩子
2191
+ //获取请求日志
2192
+ if(typeof(translate.request) === 'object'
2193
+ && typeof(translate.request.data) === 'object'
2194
+ && typeof(translate.request.data[uuid]) === 'object'
2195
+ && typeof(translate.request.data[uuid].list) === 'object'
2196
+ && typeof(translate.request.data[uuid].list[from]) === 'object'
2197
+ && typeof(translate.request.data[uuid].list[from][to]) === 'object'){
2198
+ var requestData = translate.request.data[uuid].list[from][to];
2199
+ translate.lifecycle.execute.translateNetworkAfter_Trigger({
2200
+ uuid: uuid,
2201
+ from: from,
2202
+ to: to,
2203
+ texts: requestData.texts,
2204
+ nodes: requestData.nodes,
2205
+ result: result,
2206
+ info: info
2207
+ });
2208
+ }
2209
+
2210
+ //console.log('uuid:'+uuid+', from:'+from+', to:'+to);
2211
+ if(typeof(translate.translateRequest) !== 'object' || typeof(translate.translateRequest[uuid]) !== 'object'){
2212
+ return;
2213
+ }
2214
+ for(var lang in translate.translateRequest[uuid]){
2215
+ if (!translate.translateRequest[uuid].hasOwnProperty(lang)) {
2216
+ continue;
2217
+ }
2176
2218
  if(translate.translateRequest[uuid][lang].executeFinish == 0){
2177
2219
  //这个还没执行完,那么直接退出,不在向后执行了
2178
2220
  //console.log('uuid:'+uuid+' lang:'+lang+' executeFinish:0 time:'+translate.translateRequest[uuid][lang][i][addtime]);
@@ -2189,12 +2231,32 @@ var translate = {
2189
2231
  //都执行完了,那么设置完毕
2190
2232
  translate.state = 0;
2191
2233
  translate.executeNumber++;
2192
- }
2193
-
2194
- },
2195
-
2196
- //execute() 方法已经被执行过多少次了, 只有 translate.execute() 完全执行完,也就是界面渲染完毕后,它才会+1
2197
- executeNumber:0,
2234
+ }
2235
+
2236
+ },
2237
+
2238
+ /*
2239
+ 路由切换时调用,取消未完成翻译任务并清理等待队列
2240
+ */
2241
+ routeChange:function(){
2242
+ //版本号递增,旧请求全部失效
2243
+ translate.cancelVersion = translate.cancelVersion + 1;
2244
+ //清空等待队列
2245
+ translate.waitingExecute.clear();
2246
+ //终止当前执行状态
2247
+ translate.state = 0;
2248
+ //中断未完成的翻译请求
2249
+ if(typeof(translate.request) === 'object' && typeof(translate.request.abortTranslateRequests) === 'function'){
2250
+ translate.request.abortTranslateRequests();
2251
+ }
2252
+ //清理本轮翻译请求记录
2253
+ translate.translateRequest = {};
2254
+ translate.request.data = {};
2255
+ translate.nodeQueue = {};
2256
+ },
2257
+
2258
+ //execute() 方法已经被执行过多少次了, 只有 translate.execute() 完全执行完,也就是界面渲染完毕后,它才会+1
2259
+ executeNumber:0,
2198
2260
  //translate.execute() 方法已经被触发过多少次了, 只要 translate.execute() 被触发,它就会在触发时立即 +1 (translate.execute() 默认是同一时刻只能执行一次,这个触发是在这个同一时刻执行一次的判定之前进行++ 的,如果这个同一时刻执行一次不通过,还有其他在执行,进入排队执行时,这里也会++ ,当从排队的中顺序排到进行执行时,又会执行++ ) 。 当页面打开第一次触发执行translate.execute(),这里便是 1
2199
2261
  executeTriggerNumber:0,
2200
2262
 
@@ -2496,9 +2558,10 @@ var translate = {
2496
2558
  translate.executeTriggerNumber = translate.executeTriggerNumber + 1;
2497
2559
  var triggerNumber = translate.executeTriggerNumber; //为了整个 translate.execute 的数据一致性,下面都是使用这个变量
2498
2560
 
2499
- //每次执行execute,都会生成一个唯一uuid,也可以叫做队列的唯一标识,每一次执行execute都会创建一个独立的翻译执行队列
2500
- var uuid = translate.util.uuid();
2501
- translate.time.log('创建uuid:'+uuid);
2561
+ //每次执行execute,都会生成一个唯一uuid,也可以叫做队列的唯一标识,每一次执行execute都会创建一个独立的翻译执行队列
2562
+ var uuid = translate.util.uuid();
2563
+ translate.time.log('创建uuid:'+uuid);
2564
+ var executeCancelVersion = translate.cancelVersion;
2502
2565
 
2503
2566
  //如果页面打开第一次使用,先判断缓存中有没有上次使用的语种,从缓存中取出
2504
2567
  if(translate.to == null || translate.to == ''){
@@ -3315,6 +3378,9 @@ var translate = {
3315
3378
 
3316
3379
  var splitHashIndex = 0;
3317
3380
  var splitRequestFinish = function(result, info, errorResult){
3381
+ if(translate.cancelVersion != executeCancelVersion){
3382
+ return;
3383
+ }
3318
3384
  if(typeof(translate.translateRequest[uuid]) != 'object' || typeof(translate.translateRequest[uuid][lang]) != 'object'){
3319
3385
  return;
3320
3386
  }
@@ -3365,10 +3431,14 @@ var translate = {
3365
3431
  //text:JSON.stringify(translateTextArray[lang])
3366
3432
  text:encodeURIComponent(JSON.stringify(splitTexts))
3367
3433
  };
3368
- translate.request.post(url, data, function(responseData, requestData){
3434
+ var xhr = translate.request.post(url, data, function(responseData, requestData){
3369
3435
  //console.log(data);
3370
3436
  //console.log(translateTextArray[data.from]);
3371
3437
 
3438
+ if(translate.cancelVersion != executeCancelVersion){
3439
+ return;
3440
+ }
3441
+
3372
3442
  //针对 giteeai 增加了账户余额、账户是否激活的拍的判定,所以增加了 401 这个参数,凡是账户异常的,参数值是 401~499 之间。所以只要不是1都是失败
3373
3443
  if(responseData.result != 1){
3374
3444
  splitRequestFinish(0, responseData.info, 2);
@@ -3458,6 +3528,9 @@ var translate = {
3458
3528
 
3459
3529
  splitRequestFinish(1, '', 0);
3460
3530
  }, function(xhr){
3531
+ if(translate.cancelVersion != executeCancelVersion){
3532
+ return;
3533
+ }
3461
3534
  var info = '';
3462
3535
  if(typeof(xhr.status) != 'undefined'){
3463
3536
  if(xhr.status < 1){
@@ -3470,6 +3543,12 @@ var translate = {
3470
3543
  }
3471
3544
  splitRequestFinish(0, info, 3);
3472
3545
  });
3546
+ if(xhr != null && typeof(xhr) == 'object' && typeof(translate.translateRequest[uuid]) == 'object' && typeof(translate.translateRequest[uuid][lang]) == 'object'){
3547
+ if(typeof(translate.translateRequest[uuid][lang].xhrs) == 'undefined'){
3548
+ translate.translateRequest[uuid][lang].xhrs = [];
3549
+ }
3550
+ translate.translateRequest[uuid][lang].xhrs.push(xhr);
3551
+ }
3473
3552
  }
3474
3553
  /*** 翻译end ***/
3475
3554
  }
@@ -8695,12 +8774,12 @@ var translate = {
8695
8774
  * 注意,是响应数据是第一个参数,请求数据是第二个参数。 以向前兼容
8696
8775
  * @param abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url
8697
8776
  */
8698
- post:function(path, data, func, abnormalFunc){
8699
- var headers = {
8700
- 'content-type':'application/x-www-form-urlencoded',
8701
- };
8702
- if(typeof(data) == 'undefined'){
8703
- return;
8777
+ post:function(path, data, func, abnormalFunc){
8778
+ var headers = {
8779
+ 'content-type':'application/x-www-form-urlencoded',
8780
+ };
8781
+ if(typeof(data) == 'undefined'){
8782
+ return;
8704
8783
  }
8705
8784
 
8706
8785
  //企业级翻译自动检测
@@ -8711,26 +8790,25 @@ var translate = {
8711
8790
  // ------- edge start --------
8712
8791
  var url = translate.request.getUrl(path);
8713
8792
  //if(url.indexOf('edge') > -1 && path == translate.request.api.translate){
8714
- if(translate.service.name == 'client.edge'){
8715
- if(path == translate.request.api.translate){
8716
- translate.service.edge.translate(path, data, func, abnormalFunc);
8717
- return;
8718
- }
8719
- if(path == translate.request.api.language){
8720
- var d = {};
8721
- d.info = 'SUCCESS';
8722
- d.result = 1;
8723
- d.list = translate.service.edge.language.json;
8724
- func(d);
8725
- return;
8726
- }
8727
-
8728
- //return;
8729
- }
8730
- // ------- edge end --------
8731
-
8732
- this.send(path, data, data, func, 'post', true, headers, abnormalFunc, true);
8733
- },
8793
+ if(translate.service.name == 'client.edge'){
8794
+ if(path == translate.request.api.translate){
8795
+ return translate.service.edge.translate(path, data, func, abnormalFunc);
8796
+ }
8797
+ if(path == translate.request.api.language){
8798
+ var d = {};
8799
+ d.info = 'SUCCESS';
8800
+ d.result = 1;
8801
+ d.list = translate.service.edge.language.json;
8802
+ func(d);
8803
+ return;
8804
+ }
8805
+
8806
+ //return;
8807
+ }
8808
+ // ------- edge end --------
8809
+
8810
+ return this.send(path, data, data, func, 'post', true, headers, abnormalFunc, true);
8811
+ },
8734
8812
  /**
8735
8813
  * 发送请求
8736
8814
  * url 请求的url或者path(path,传入的是translate.request.api.translate 这种的,需要使用 getUrl 来组合真正请求的url )
@@ -8746,7 +8824,7 @@ var translate = {
8746
8824
  * abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url
8747
8825
  * showErrorLog 是否控制台打印出来错误日志,true打印, false 不打印
8748
8826
  */
8749
- send:function(url, data, appendXhrData, func, method, isAsynchronize, headers, abnormalFunc, showErrorLog){
8827
+ send:function(url, data, appendXhrData, func, method, isAsynchronize, headers, abnormalFunc, showErrorLog){
8750
8828
  //post提交的参数
8751
8829
  var params = '';
8752
8830
 
@@ -8883,8 +8961,41 @@ var translate = {
8883
8961
  }
8884
8962
  }
8885
8963
  }
8886
- return xhr;
8887
- },
8964
+ return xhr;
8965
+ },
8966
+ /*
8967
+ 中断未完成的翻译请求(translate.json)
8968
+ */
8969
+ abortTranslateRequests:function(){
8970
+ if(typeof(translate.translateRequest) == 'undefined' || translate.translateRequest == null){
8971
+ return;
8972
+ }
8973
+ for(var uuid in translate.translateRequest){
8974
+ if (!translate.translateRequest.hasOwnProperty(uuid)) {
8975
+ continue;
8976
+ }
8977
+ var langs = translate.translateRequest[uuid];
8978
+ for(var lang in langs){
8979
+ if (!langs.hasOwnProperty(lang)) {
8980
+ continue;
8981
+ }
8982
+ var item = langs[lang];
8983
+ if(typeof(item) !== 'object' || item == null){
8984
+ continue;
8985
+ }
8986
+ if(typeof(item.xhrs) === 'object' && item.xhrs.length > 0){
8987
+ for(var xi = 0; xi < item.xhrs.length; xi++){
8988
+ try{
8989
+ if(item.xhrs[xi] && typeof(item.xhrs[xi].abort) === 'function'){
8990
+ item.xhrs[xi].abort();
8991
+ }
8992
+ }catch(e){}
8993
+ }
8994
+ item.xhrs = [];
8995
+ }
8996
+ }
8997
+ }
8998
+ },
8888
8999
  /*
8889
9000
 
8890
9001
  手动进行翻译操作。参数说明:
@@ -8928,10 +9039,11 @@ var translate = {
8928
9039
  console.log(xhr);
8929
9040
  });
8930
9041
  */
8931
- translateText:function(obj, func, abnormalFunc){
8932
- var texts = new Array();
8933
- var from = translate.language.getLocal();
8934
- var to = translate.language.getCurrent();
9042
+ translateText:function(obj, func, abnormalFunc){
9043
+ var texts = new Array();
9044
+ var from = translate.language.getLocal();
9045
+ var to = translate.language.getCurrent();
9046
+ var executeCancelVersion = translate.cancelVersion;
8935
9047
 
8936
9048
  if(typeof(obj) == 'string'){
8937
9049
  //案例一的场景,传入单个字符串
@@ -9021,6 +9133,9 @@ var translate = {
9021
9133
  var splitResponseErrorInfo = '';
9022
9134
  var splitNetworkError = false;
9023
9135
  var splitFinish = function(){
9136
+ if(translate.cancelVersion != executeCancelVersion){
9137
+ return;
9138
+ }
9024
9139
  splitFinishCount++;
9025
9140
  if(splitFinishCount >= splitTextList.length){
9026
9141
  if(splitNetworkError){
@@ -9054,6 +9169,9 @@ var translate = {
9054
9169
  translate.request.post(url, data, function(responseData, requestData){
9055
9170
  //console.log(responseData);
9056
9171
  //console.log(data);
9172
+ if(translate.cancelVersion != executeCancelVersion){
9173
+ return;
9174
+ }
9057
9175
  if(responseData.result != 1){
9058
9176
  splitResponseError = true;
9059
9177
  if(typeof(responseData.info) === 'string' && responseData.info.length > 0 && splitResponseErrorInfo.length < 1){
@@ -9090,6 +9208,9 @@ var translate = {
9090
9208
 
9091
9209
  splitFinish();
9092
9210
  }, (function(xhr){
9211
+ if(translate.cancelVersion != executeCancelVersion){
9212
+ return;
9213
+ }
9093
9214
  splitNetworkError = true;
9094
9215
  if(abnormalFunc && typeof(abnormalFunc) == 'function'){
9095
9216
  abnormalFunc(xhr);