torchv-translate 1.0.8 → 1.0.10

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.8",
3
+ "version": "1.0.10",
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,13 +2086,8 @@ var translate = {
2086
2086
  20 浏览器缓存渲染完毕,ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求
2087
2087
  至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程
2088
2088
  */
2089
- state:0,
2090
-
2091
- /*
2092
- 取消翻译任务的版本号(路由切换时+1),用于忽略未完成的翻译请求
2093
- */
2094
- cancelVersion:0,
2095
-
2089
+ state:0,
2090
+
2096
2091
 
2097
2092
  /*
2098
2093
  等待翻译队列 v3.12.6 增加
@@ -2100,72 +2095,45 @@ var translate = {
2100
2095
  当执行 translate.execute() 时,会先判断状态 translate.state 是否是0空闲的状态,如果空闲,才会执行,如果不是空闲,则不会执行,而是进入到这里进行等待,等待执行完毕后 translate.state 变成0空闲之后,再来执行这里的
2101
2096
 
2102
2097
  */
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
- },
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
+ },
2144
2124
  /*
2145
2125
  从 quque 中取第一个元素,同时将其从queue中删除掉它。
2146
2126
  如果取的时候 quque已经没有任何元素了,会返回 null, 但是理论上不会出现null
2147
2127
  */
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
- },
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
+ },
2169
2137
  /*
2170
2138
  当前 translate.translateRequest[uuid] 的是否已经全部执行完毕
2171
2139
  这里单纯只是对 translate.translateRequest[uuid] 的进行判断
@@ -2183,38 +2151,28 @@ var translate = {
2183
2151
  @param result 本次网络请求的结果, 1成功, 0失败。 网络不通,翻译结果返回result非1都是记入0
2184
2152
  @param info 如果result为0,这里是失败信息
2185
2153
  */
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
- }
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
+ }
2218
2176
  if(translate.translateRequest[uuid][lang].executeFinish == 0){
2219
2177
  //这个还没执行完,那么直接退出,不在向后执行了
2220
2178
  //console.log('uuid:'+uuid+' lang:'+lang+' executeFinish:0 time:'+translate.translateRequest[uuid][lang][i][addtime]);
@@ -2231,36 +2189,12 @@ var translate = {
2231
2189
  //都执行完了,那么设置完毕
2232
2190
  translate.state = 0;
2233
2191
  translate.executeNumber++;
2234
- }
2235
-
2236
- },
2237
-
2238
- /*
2239
- 路由切换时调用,取消未完成翻译任务并清理等待队列
2240
- */
2241
- routeChange:function(){
2242
- //版本号递增,旧请求全部失效
2243
- translate.cancelVersion = translate.cancelVersion + 1;
2244
- //清空等待队列
2245
- translate.waitingExecute.clear();
2246
- //清空翻译请求去重缓存
2247
- if(typeof(translate.request) === 'object' && typeof(translate.request.pending) === 'object'){
2248
- translate.request.pending.clear();
2249
- }
2250
- //终止当前执行状态
2251
- translate.state = 0;
2252
- //中断未完成的翻译请求
2253
- if(typeof(translate.request) === 'object' && typeof(translate.request.abortTranslateRequests) === 'function'){
2254
- translate.request.abortTranslateRequests();
2255
- }
2256
- //清理本轮翻译请求记录
2257
- translate.translateRequest = {};
2258
- translate.request.data = {};
2259
- translate.nodeQueue = {};
2260
- },
2261
-
2262
- //execute() 方法已经被执行过多少次了, 只有 translate.execute() 完全执行完,也就是界面渲染完毕后,它才会+1
2263
- executeNumber:0,
2192
+ }
2193
+
2194
+ },
2195
+
2196
+ //execute() 方法已经被执行过多少次了, 只有 translate.execute() 完全执行完,也就是界面渲染完毕后,它才会+1
2197
+ executeNumber:0,
2264
2198
  //translate.execute() 方法已经被触发过多少次了, 只要 translate.execute() 被触发,它就会在触发时立即 +1 (translate.execute() 默认是同一时刻只能执行一次,这个触发是在这个同一时刻执行一次的判定之前进行++ 的,如果这个同一时刻执行一次不通过,还有其他在执行,进入排队执行时,这里也会++ ,当从排队的中顺序排到进行执行时,又会执行++ ) 。 当页面打开第一次触发执行translate.execute(),这里便是 1
2265
2199
  executeTriggerNumber:0,
2266
2200
 
@@ -2562,11 +2496,9 @@ var translate = {
2562
2496
  translate.executeTriggerNumber = translate.executeTriggerNumber + 1;
2563
2497
  var triggerNumber = translate.executeTriggerNumber; //为了整个 translate.execute 的数据一致性,下面都是使用这个变量
2564
2498
 
2565
- //每次执行execute,都会生成一个唯一uuid,也可以叫做队列的唯一标识,每一次执行execute都会创建一个独立的翻译执行队列
2566
- var uuid = translate.util.uuid();
2567
- translate.time.log('创建uuid:'+uuid);
2568
- var executeCancelVersion = translate.cancelVersion;
2569
- var pendingKeysCreated = [];
2499
+ //每次执行execute,都会生成一个唯一uuid,也可以叫做队列的唯一标识,每一次执行execute都会创建一个独立的翻译执行队列
2500
+ var uuid = translate.util.uuid();
2501
+ translate.time.log('创建uuid:'+uuid);
2570
2502
 
2571
2503
  //如果页面打开第一次使用,先判断缓存中有没有上次使用的语种,从缓存中取出
2572
2504
  if(translate.to == null || translate.to == ''){
@@ -2982,12 +2914,12 @@ var translate = {
2982
2914
  //console.log(originalWord);
2983
2915
 
2984
2916
  //根据hash,判断本地是否有缓存了
2985
- var cacheHash = originalWord == translateText ? hash:translate.util.hash(translateText); //如果匹配到了自定义术语库,那翻译前的hash是被改变了
2986
- translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash'] = cacheHash; //缓存的hash。 缓存时,其hash跟翻译的语言是完全对应的,缓存的hash就是翻译的语言转换来的
2987
- var cache = translate.storage.get('hash_'+translate.to+'_'+cacheHash);
2988
-
2989
- //缓存是否有拿到具体缓存内容
2990
- if(cache != null && cache.length > 0){
2917
+ var cacheHash = originalWord == translateText ? hash:translate.util.hash(translateText); //如果匹配到了自定义术语库,那翻译前的hash是被改变了
2918
+ translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash'] = cacheHash; //缓存的hash。 缓存时,其hash跟翻译的语言是完全对应的,缓存的hash就是翻译的语言转换来的
2919
+ var cache = translate.storage.get('hash_'+translate.to+'_'+cacheHash);
2920
+
2921
+ //缓存是否有拿到具体缓存内容
2922
+ if(cache != null && cache.length > 0){
2991
2923
  for(var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++){
2992
2924
  //console.log(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]);
2993
2925
 
@@ -3070,27 +3002,14 @@ var translate = {
3070
3002
  }
3071
3003
 
3072
3004
 
3073
-
3074
- continue; //跳出,不用在传入下面的翻译接口了
3075
- }
3076
-
3077
- //避免虚拟滚动等场景重复请求:如果同一文本正在翻译中,则加入等待队列
3078
- if(typeof(translate.request) === 'object' && typeof(translate.request.pending) === 'object'){
3079
- var pendingKey = translate.request.pending.key(lang, translate.to, cacheHash);
3080
- var pendingItem = translate.request.pending.get(pendingKey);
3081
- if(pendingItem != null){
3082
- translate.request.pending.add(pendingKey, {uuid:uuid, lang:lang, hash:hash});
3083
- continue;
3084
- }
3085
- //记录本次创建的pending,方便异常情况下清理
3086
- translate.request.pending.add(pendingKey, {uuid:uuid, lang:lang, hash:hash});
3087
- pendingKeysCreated.push(pendingKey);
3088
- }
3089
-
3090
- /*
3091
- //取出数组
3092
- var queueNodes = this.nodeQueue[lang][hash];
3093
- if(queueNodes.length > 0){
3005
+
3006
+ continue; //跳出,不用在传入下面的翻译接口了
3007
+ }
3008
+
3009
+ /*
3010
+ //取出数组
3011
+ var queueNodes = this.nodeQueue[lang][hash];
3012
+ if(queueNodes.length > 0){
3094
3013
  //因为在这个数组中的值都是一样的,那么只需要取出第一个就行了
3095
3014
  var valueStr = queueNodes[0].nodeValue;
3096
3015
  valueStr = this.util.charReplace(valueStr);
@@ -3118,20 +3037,13 @@ var translate = {
3118
3037
  //console.log(translateTextArray);
3119
3038
  //return;
3120
3039
 
3121
- if(typeof(translate.request.api.translate) != 'string' || translate.request.api.translate == null || translate.request.api.translate.length < 1){
3122
- //用户已经设置了不掉翻译接口进行翻译
3123
- translate.state = 0;
3124
-
3125
- //清理本次创建的pending记录
3126
- if(pendingKeysCreated.length > 0 && typeof(translate.request) === 'object' && typeof(translate.request.pending) === 'object'){
3127
- for(var pk = 0; pk < pendingKeysCreated.length; pk++){
3128
- translate.request.pending.take(pendingKeysCreated[pk]);
3129
- }
3130
- }
3131
-
3132
- //生命周期触发事件
3133
- translate.lifecycle.execute.renderFinish_Trigger(uuid, translate.to);
3134
- translate.executeNumber++;
3040
+ if(typeof(translate.request.api.translate) != 'string' || translate.request.api.translate == null || translate.request.api.translate.length < 1){
3041
+ //用户已经设置了不掉翻译接口进行翻译
3042
+ translate.state = 0;
3043
+
3044
+ //生命周期触发事件
3045
+ translate.lifecycle.execute.renderFinish_Trigger(uuid, translate.to);
3046
+ translate.executeNumber++;
3135
3047
 
3136
3048
  //钩子
3137
3049
  translate.lifecycle.execute.finally_Trigger({
@@ -3321,7 +3233,7 @@ var translate = {
3321
3233
  if (!fanyiLangs.hasOwnProperty(lang_index)) {
3322
3234
  continue;
3323
3235
  }
3324
- let lang = fanyiLangs[lang_index];
3236
+ var lang = fanyiLangs[lang_index];
3325
3237
  if(typeof(lang) != 'string'){
3326
3238
  continue;
3327
3239
  }
@@ -3381,250 +3293,151 @@ var translate = {
3381
3293
  if(typeof(translate.request.data[uuid].list[lang]) === 'undefined'){
3382
3294
  translate.request.data[uuid].list[lang] = {};
3383
3295
  }
3384
- translate.request.data[uuid].list[lang][translate.to] = {
3385
- texts: translateTextArray[lang],
3386
- nodes: translateTextNodes,
3387
- };
3388
-
3389
-
3390
- /*** 翻译开始 ***/
3391
- var url = translate.request.api.translate;
3392
- //按配置拆分文本数组,避免一次请求过大导致超时
3393
- var splitTextList = translate.request.splitTranslateTextArray(translateTextArray[lang]);
3394
- if(typeof(splitTextList) == 'undefined' || splitTextList == null || splitTextList.length < 1){
3395
- splitTextList = [translateTextArray[lang]];
3396
- }
3397
-
3398
- translate.translateRequest[uuid][lang].requestTotal = splitTextList.length;
3399
- translate.translateRequest[uuid][lang].requestFinish = 0;
3400
- translate.translateRequest[uuid][lang].requestError = 0;
3401
- translate.translateRequest[uuid][lang].requestErrorInfo = '';
3402
- translate.translateRequest[uuid][lang].requestErrorResult = 0;
3403
-
3404
- var splitHashIndex = 0;
3405
- var splitRequestFinish = function(result, info, errorResult){
3406
- if(translate.cancelVersion != executeCancelVersion){
3407
- return;
3408
- }
3409
- if(typeof(translate.translateRequest[uuid]) != 'object' || typeof(translate.translateRequest[uuid][lang]) != 'object'){
3410
- return;
3411
- }
3412
- var requestItem = translate.translateRequest[uuid][lang];
3413
- requestItem.requestFinish++;
3414
- if(result === 0){
3415
- requestItem.requestError = 1;
3416
- if(typeof(info) === 'string' && info.length > 0){
3417
- if(typeof(requestItem.requestErrorInfo) !== 'string' || requestItem.requestErrorInfo.length < 1){
3418
- requestItem.requestErrorInfo = info;
3419
- }
3420
- }
3421
- if(typeof(errorResult) === 'number' && errorResult > 0){
3422
- if(typeof(requestItem.requestErrorResult) !== 'number' || requestItem.requestErrorResult < errorResult){
3423
- requestItem.requestErrorResult = errorResult;
3424
- }
3425
- }
3426
- }
3427
- if(requestItem.requestFinish >= requestItem.requestTotal){
3428
- if(requestItem.requestError === 1){
3429
- requestItem.result = requestItem.requestErrorResult > 0 ? requestItem.requestErrorResult : 2;
3430
- }else{
3431
- requestItem.result = 1;
3432
- }
3433
- requestItem.executeFinish = 1; //1是执行完毕
3434
- requestItem.stoptime = Math.floor(Date.now() / 1000);
3435
- var resultFlag = requestItem.requestError === 1 ? 0 : 1;
3436
- var infoText = requestItem.requestError === 1 ? (requestItem.requestErrorInfo || '') : '';
3437
- setTimeout(function(){
3438
- translate.waitingExecute.isAllExecuteFinish(uuid, lang, translate.to, resultFlag, infoText);
3439
- },5);
3440
- }
3441
- };
3442
-
3443
- for(var splitIndex = 0; splitIndex < splitTextList.length; splitIndex++){
3444
- let splitTexts = splitTextList[splitIndex];
3445
- if(typeof(splitTexts) == 'undefined' || splitTexts == null || splitTexts.length < 1){
3446
- splitRequestFinish(1, '', 0);
3447
- continue;
3448
- }
3449
- let splitHashes = translateHashArray[lang].slice(splitHashIndex, splitHashIndex + splitTexts.length);
3450
- splitHashIndex = splitHashIndex + splitTexts.length;
3451
-
3452
- let data = {
3453
- from:lang,
3454
- to:translate.to,
3455
- //lowercase:translate.whole.isEnableAll? '0':'1', //首字母大写
3456
- //text:JSON.stringify(translateTextArray[lang])
3457
- text:encodeURIComponent(JSON.stringify(splitTexts))
3458
- };
3459
- var xhr = translate.request.post(url, data, function(responseData, requestData){
3460
- //console.log(data);
3461
- //console.log(translateTextArray[data.from]);
3462
-
3463
- if(translate.cancelVersion != executeCancelVersion){
3464
- return;
3465
- }
3466
-
3467
- //针对 giteeai 增加了账户余额、账户是否激活的拍的判定,所以增加了 401 这个参数,凡是账户异常的,参数值是 401~499 之间。所以只要不是1都是失败
3468
- if(responseData.result != 1){
3469
- splitRequestFinish(0, responseData.info, 2);
3470
-
3471
- translate.log('=======ERROR START=======');
3472
- translate.log(translateTextArray[requestData.from]);
3473
- //console.log(encodeURIComponent(JSON.stringify(translateTextArray[data.from])));
3474
- translate.log('response : '+responseData.info);
3475
- translate.log('=======ERROR END =======');
3476
- //translate.temp_executeFinishNumber++; //记录执行完的次数
3477
- return;
3478
- }
3479
-
3480
- if(typeof(translate.nodeQueue[uuid]) == 'undefined'){
3481
- translate.log('提示:你很可能多次引入了 translate.js 所以造成了翻译本身的数据错乱,这只是个提示,它还是会给你正常翻译的,但是你最好不要重复引入太多次 translate.js ,正常情况下只需要引入一次 translate.js 就可以了。太多的话很可能会导致你页面卡顿');
3482
- splitRequestFinish(0, 'translate.nodeQueue not find', 2);
3483
- return;
3484
- }
3485
-
3486
- //console.log('-----待翻译3:----');
3487
- //console.log(translate.nodeQueue);
3488
-
3489
- //console.log('response:'+uuid);
3490
- let task = new translate.renderTask();
3491
- //遍历 translateHashArray
3492
- var loopLength = responseData.text.length;
3493
- if(loopLength > splitHashes.length){
3494
- loopLength = splitHashes.length;
3495
- }
3496
- for(var i=0; i<loopLength; i++){
3497
- //翻译前的语种,如 english
3498
- var lang = responseData.from;
3499
- //翻译后的内容
3500
- var text = responseData.text[i];
3501
- //如果text为null,那么这个可能是一次翻译字数太多,为了保持数组长度,拼上的null
3502
- if(text == null){
3503
- continue;
3504
- }
3505
-
3506
- // v3.0.3 添加,避免像是 JavaScript 被错误翻译为 “JavaScript的” ,然后出现了多个句子中都出现了Javascript时,会出现翻译后文本重复的问题
3507
- // 这里就是验证一下,翻译后的文本,是否会完全包含翻以前的文本,如果包含了,那么强制将翻译后的文本赋予翻译前的原始文本(也就是不被翻译)
3508
- if(text.toLowerCase().indexOf(splitTexts[i].toLowerCase()) > -1){
3509
- //发现了,那么强制赋予翻以前内容
3510
- text = splitTexts[i];
3511
- }
3512
-
3513
-
3514
- //翻译前的hash对应下标
3515
- var hash = splitHashes[i];
3516
- var cacheHash = translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash'];
3517
- var pendingItem = null;
3518
- if(typeof(translate.request) === 'object' && typeof(translate.request.pending) === 'object'){
3519
- var pendingKey = translate.request.pending.key(lang, responseData.to, cacheHash);
3520
- pendingItem = translate.request.pending.take(pendingKey);
3521
- }
3522
-
3523
-
3524
-
3525
- //取原始的词,还未经过翻译的,需要进行翻译的词
3526
- var originalWord = '';
3527
- try{
3528
- originalWord = translate.nodeQueue[uuid]['list'][lang][hash]['original'];
3529
- //console.log('bef:'+translate.nodeQueue[uuid]['list'][lang][hash]['beforeText']);
3530
- }catch(e){
3531
- translate.log('uuid:'+uuid+', originalWord:'+originalWord+', lang:'+lang+', hash:'+hash+', text:'+text+', queue:'+translate.nodeQueue[uuid]);
3532
- translate.log(e);
3533
- continue;
3534
- }
3535
-
3536
- //for(var index = 0; index < translate.nodeQueue[lang][hash].length; index++){
3537
- for(var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++){
3538
- //translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue = translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue.replace(new RegExp(originalWord,'g'), text);
3539
- //加入任务
3540
- task.add(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'], originalWord, translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['beforeText']+text+translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['afterText'], translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['attribute']);
3541
- }
3542
- //处理等待同一文本的其他节点
3543
- if(pendingItem != null && typeof(pendingItem.waits) === 'object'){
3544
- for(var wi = 0; wi < pendingItem.waits.length; wi++){
3545
- var waitItem = pendingItem.waits[wi];
3546
- if(waitItem.uuid === uuid && waitItem.lang === lang && waitItem.hash === hash){
3547
- continue;
3548
- }
3549
- if(typeof(translate.nodeQueue[waitItem.uuid]) === 'undefined'){
3550
- continue;
3551
- }
3552
- if(typeof(translate.nodeQueue[waitItem.uuid]['list'][waitItem.lang]) === 'undefined'){
3553
- continue;
3554
- }
3555
- if(typeof(translate.nodeQueue[waitItem.uuid]['list'][waitItem.lang][waitItem.hash]) === 'undefined'){
3556
- continue;
3557
- }
3558
- var waitQueue = translate.nodeQueue[waitItem.uuid]['list'][waitItem.lang][waitItem.hash];
3559
- if(typeof(waitQueue) === 'undefined' || typeof(waitQueue.nodes) === 'undefined'){
3560
- continue;
3561
- }
3562
- var waitOriginal = waitQueue.original;
3563
- for(var wni = 0; wni < waitQueue.nodes.length; wni++){
3564
- task.add(waitQueue.nodes[wni]['node'], waitOriginal, waitQueue.nodes[wni]['beforeText']+text+waitQueue.nodes[wni]['afterText'], waitQueue.nodes[wni]['attribute']);
3565
- }
3566
- }
3567
- }
3568
- //}
3569
- /*
3570
- for(var index = 0; index < translate.nodeQueue[data.from][hash].length; index++){
3571
- translate.nodeQueue[data.from][hash][index].nodeValue = text;
3572
- }
3573
- */
3574
-
3575
- //将翻译结果以 key:hash value翻译结果的形式缓存
3576
- translate.storage.set('hash_'+responseData.to+'_'+cacheHash,text);
3577
- //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
3578
- if(translate.offline.fullExtract.isUse){
3579
- translate.offline.fullExtract.set(hash, originalWord, responseData.to, text);
3580
- }
3581
- }
3582
- task.execute(); //执行渲染任务
3583
- //translate.temp_executeFinishNumber++; //记录执行完的次数
3584
-
3585
- splitRequestFinish(1, '', 0);
3586
- }, function(xhr){
3587
- if(translate.cancelVersion != executeCancelVersion){
3588
- return;
3589
- }
3590
- //请求异常,清理pending,允许后续重试
3591
- if(typeof(translate.request) === 'object' && typeof(translate.request.pending) === 'object'){
3592
- for(var ph = 0; ph < splitHashes.length; ph++){
3593
- if(typeof(translate.nodeQueue[uuid]) === 'undefined'){
3594
- break;
3595
- }
3596
- if(typeof(translate.nodeQueue[uuid]['list'][lang]) === 'undefined'){
3597
- break;
3598
- }
3599
- if(typeof(translate.nodeQueue[uuid]['list'][lang][splitHashes[ph]]) === 'undefined'){
3600
- continue;
3601
- }
3602
- var cacheHash = translate.nodeQueue[uuid]['list'][lang][splitHashes[ph]]['cacheHash'];
3603
- var pendingKey = translate.request.pending.key(lang, translate.to, cacheHash);
3604
- translate.request.pending.take(pendingKey);
3605
- }
3606
- }
3607
- var info = '';
3608
- if(typeof(xhr.status) != 'undefined'){
3609
- if(xhr.status < 1){
3610
- info = 'Network connection failed. url: '+xhr.requestURL;
3611
- }else{
3612
- info = 'HTTP response code : '+xhr.status+', url: '+xhr.requestURL;
3613
- }
3614
- }else{
3615
- info = 'Network connection failed. url: '+xhr.requestURL;
3616
- }
3617
- splitRequestFinish(0, info, 3);
3618
- });
3619
- if(xhr != null && typeof(xhr) == 'object' && typeof(translate.translateRequest[uuid]) == 'object' && typeof(translate.translateRequest[uuid][lang]) == 'object'){
3620
- if(typeof(translate.translateRequest[uuid][lang].xhrs) == 'undefined'){
3621
- translate.translateRequest[uuid][lang].xhrs = [];
3622
- }
3623
- translate.translateRequest[uuid][lang].xhrs.push(xhr);
3624
- }
3625
- }
3626
- /*** 翻译end ***/
3627
- }
3296
+ translate.request.data[uuid].list[lang][translate.to] = {
3297
+ texts: translateTextArray[lang],
3298
+ nodes: translateTextNodes,
3299
+ };
3300
+
3301
+
3302
+ /*** 翻译开始 ***/
3303
+ var url = translate.request.api.translate;
3304
+ var data = {
3305
+ from:lang,
3306
+ to:translate.to,
3307
+ //lowercase:translate.whole.isEnableAll? '0':'1', //首字母大写
3308
+ //text:JSON.stringify(translateTextArray[lang])
3309
+ text:encodeURIComponent(JSON.stringify(translateTextArray[lang]))
3310
+ };
3311
+ translate.request.post(url, data, function(responseData, requestData){
3312
+ //console.log(data);
3313
+ //console.log(translateTextArray[data.from]);
3314
+
3315
+ //针对 giteeai 增加了账户余额、账户是否激活的拍的判定,所以增加了 401 这个参数,凡是账户异常的,参数值是 401~499 之间。所以只要不是1都是失败
3316
+ if(responseData.result != 1){
3317
+ if(typeof(translate.translateRequest[uuid]) == 'object' && typeof(translate.translateRequest[uuid][requestData.from]) == 'object'){
3318
+ translate.translateRequest[uuid][requestData.from]['result'] = 2;
3319
+ translate.translateRequest[uuid][requestData.from].executeFinish = 1; //1是执行完毕
3320
+ translate.translateRequest[uuid][requestData.from].stoptime = Math.floor(Date.now() / 1000);
3321
+ }else{
3322
+ translate.log('WARINNG!!! translate.translateRequest[uuid][requestData.from] is not object');
3323
+ }
3324
+
3325
+ //为了兼容 v3.14以前的translate.service 版本,做了判断
3326
+ var from = '';
3327
+ if(typeof(requestData.from) != 'undefined' && requestData.from != null){
3328
+ from = requestData.from;
3329
+ }
3330
+ var to = '';
3331
+ if(typeof(requestData.to) != 'undefined' && requestData.to != null){
3332
+ to = requestData.to;
3333
+ }else{
3334
+ to = translate.to;
3335
+ }
3336
+ translate.waitingExecute.isAllExecuteFinish(uuid, from, to, 0, responseData.info);
3337
+
3338
+
3339
+ translate.log('=======ERROR START=======');
3340
+ translate.log(translateTextArray[requestData.from]);
3341
+ //console.log(encodeURIComponent(JSON.stringify(translateTextArray[data.from])));
3342
+ translate.log('response : '+responseData.info);
3343
+ translate.log('=======ERROR END =======');
3344
+ //translate.temp_executeFinishNumber++; //记录执行完的次数
3345
+ return;
3346
+ }
3347
+
3348
+ if(typeof(translate.nodeQueue[uuid]) == 'undefined'){
3349
+ translate.log('提示:你很可能多次引入了 translate.js 所以造成了翻译本身的数据错乱,这只是个提示,它还是会给你正常翻译的,但是你最好不要重复引入太多次 translate.js ,正常情况下只需要引入一次 translate.js 就可以了。太多的话很可能会导致你页面卡顿');
3350
+ return;
3351
+ }
3352
+
3353
+ //console.log('-----待翻译3:----');
3354
+ //console.log(translate.nodeQueue);
3355
+
3356
+ //console.log('response:'+uuid);
3357
+ let task = new translate.renderTask();
3358
+ //遍历 translateHashArray
3359
+ for(var i=0; i<translateHashArray[responseData.from].length; i++){
3360
+ //翻译前的语种,如 english
3361
+ var lang = responseData.from;
3362
+ //翻译后的内容
3363
+ var text = responseData.text[i];
3364
+ //如果text为null,那么这个可能是一次翻译字数太多,为了保持数组长度,拼上的null
3365
+ if(text == null){
3366
+ continue;
3367
+ }
3368
+
3369
+ // v3.0.3 添加,避免像是 JavaScript 被错误翻译为 “JavaScript的” ,然后出现了多个句子中都出现了Javascript时,会出现翻译后文本重复的问题
3370
+ // 这里就是验证一下,翻译后的文本,是否会完全包含翻以前的文本,如果包含了,那么强制将翻译后的文本赋予翻译前的原始文本(也就是不被翻译)
3371
+ if(text.toLowerCase().indexOf(translateTextArray[responseData.from][i].toLowerCase()) > -1){
3372
+ //发现了,那么强制赋予翻以前内容
3373
+ text = translateTextArray[responseData.from][i];
3374
+ }
3375
+
3376
+
3377
+ //翻译前的hash对应下标
3378
+ var hash = translateHashArray[responseData.from][i];
3379
+ var cacheHash = translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash'];
3380
+
3381
+
3382
+
3383
+ //取原始的词,还未经过翻译的,需要进行翻译的词
3384
+ var originalWord = '';
3385
+ try{
3386
+ originalWord = translate.nodeQueue[uuid]['list'][lang][hash]['original'];
3387
+ //console.log('bef:'+translate.nodeQueue[uuid]['list'][lang][hash]['beforeText']);
3388
+ }catch(e){
3389
+ translate.log('uuid:'+uuid+', originalWord:'+originalWord+', lang:'+lang+', hash:'+hash+', text:'+text+', queue:'+translate.nodeQueue[uuid]);
3390
+ translate.log(e);
3391
+ continue;
3392
+ }
3393
+
3394
+ //for(var index = 0; index < translate.nodeQueue[lang][hash].length; index++){
3395
+ for(var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++){
3396
+ //translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue = translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue.replace(new RegExp(originalWord,'g'), text);
3397
+ //加入任务
3398
+ task.add(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['node'], originalWord, translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['beforeText']+text+translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['afterText'], translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][node_index]['attribute']);
3399
+ }
3400
+ //}
3401
+ /*
3402
+ for(var index = 0; index < translate.nodeQueue[data.from][hash].length; index++){
3403
+ translate.nodeQueue[data.from][hash][index].nodeValue = text;
3404
+ }
3405
+ */
3406
+
3407
+ //将翻译结果以 key:hash value翻译结果的形式缓存
3408
+ translate.storage.set('hash_'+responseData.to+'_'+cacheHash,text);
3409
+ //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
3410
+ if(translate.offline.fullExtract.isUse){
3411
+ translate.offline.fullExtract.set(hash, originalWord, responseData.to, text);
3412
+ }
3413
+ }
3414
+ task.execute(); //执行渲染任务
3415
+ //translate.temp_executeFinishNumber++; //记录执行完的次数
3416
+
3417
+ translate.translateRequest[uuid][lang].result = 1;
3418
+ translate.translateRequest[uuid][lang].executeFinish = 1; //1是执行完毕
3419
+ translate.translateRequest[uuid][lang].stoptime = Math.floor(Date.now() / 1000);
3420
+ setTimeout(function(){
3421
+ translate.waitingExecute.isAllExecuteFinish(uuid, responseData.from, responseData.to, 1, '');
3422
+ },5);
3423
+ }, function(xhr){
3424
+ translate.translateRequest[uuid][xhr.data.from].executeFinish = 1; //1是执行完毕
3425
+ translate.translateRequest[uuid][xhr.data.from].stoptime = Math.floor(Date.now() / 1000);
3426
+ translate.translateRequest[uuid][xhr.data.from].result = 3;
3427
+ var info = '';
3428
+ if(typeof(xhr.status) != 'undefined'){
3429
+ if(xhr.status < 1){
3430
+ info = 'Network connection failed. url: '+xhr.requestURL;
3431
+ }else{
3432
+ info = 'HTTP response code : '+xhr.status+', url: '+xhr.requestURL;
3433
+ }
3434
+ }else{
3435
+ info = 'Network connection failed. url: '+xhr.requestURL;
3436
+ }
3437
+ translate.waitingExecute.isAllExecuteFinish(uuid, xhr.data.from, translate.to, 0, info);
3438
+ });
3439
+ /*** 翻译end ***/
3440
+ }
3628
3441
 
3629
3442
  //钩子
3630
3443
  translate.lifecycle.execute.finally_Trigger({
@@ -8336,7 +8149,7 @@ var translate = {
8336
8149
  */
8337
8150
  data:{},
8338
8151
  //相关API接口方面
8339
- api:{
8152
+ api:{
8340
8153
  /**
8341
8154
  * 翻译接口请求的域名主机 host
8342
8155
  * 格式注意前面要带上协议如 https:// 域名后要加 /
@@ -8350,130 +8163,9 @@ var translate = {
8350
8163
  translate:'translate.json', //翻译接口
8351
8164
  ip:'ip.json', //根据用户当前ip获取其所在地的语种
8352
8165
  connectTest:'connectTest.json', //用于 translate.js 多节点翻译自动检测网络连通情况
8353
- init:'init.json', //获取最新版本号,跟当前版本进行比对,用于提醒版本升级等使用
8354
-
8355
- },
8356
- /*
8357
- translate.json 接口单次请求的文本大小控制
8358
- size: 按 JSON.stringify(array) 的长度进行拆分
8359
- maxSize: 拆分后的数组最大元素数量,0则不限制
8360
- */
8361
- translateTextSplit:{
8362
- size:20000,
8363
- maxSize:10,
8364
- //单条文本达到该长度后单独成组,避免与其它文本拼接,0则使用 size/2
8365
- singleTextMinSize:0
8366
- },
8367
- /*
8368
- 翻译请求去重(处理中)
8369
- */
8370
- pending:{
8371
- map:new Map(),
8372
- key:function(from, to, cacheHash){
8373
- return from+'|'+to+'|'+cacheHash;
8374
- },
8375
- get:function(key){
8376
- if(this.map == null){
8377
- this.map = new Map();
8378
- }
8379
- return this.map.get(key) || null;
8380
- },
8381
- add:function(key, waitItem){
8382
- if(this.map == null){
8383
- this.map = new Map();
8384
- }
8385
- var item = this.map.get(key);
8386
- if(item == null){
8387
- item = {waits:[]};
8388
- this.map.set(key, item);
8389
- }
8390
- if(waitItem != null){
8391
- item.waits.push(waitItem);
8392
- }
8393
- return item;
8394
- },
8395
- take:function(key){
8396
- if(this.map == null){
8397
- this.map = new Map();
8398
- return null;
8399
- }
8400
- var item = this.map.get(key) || null;
8401
- if(item != null){
8402
- this.map.delete(key);
8403
- }
8404
- return item;
8405
- },
8406
- clear:function(){
8407
- this.map = new Map();
8408
- }
8409
- },
8410
- /*
8411
- 将翻译文本数组拆分为多个请求,避免一次请求过大导致超时
8412
- 注意:不会拆分单条文本,避免破坏段落/语义
8413
- */
8414
- splitTranslateTextArray:function(textArray){
8415
- if(typeof(textArray) == 'undefined' || textArray == null){
8416
- return [];
8417
- }
8418
- if(typeof(textArray.length) == 'undefined'){
8419
- return [textArray];
8420
- }
8421
- var size = translate.request.translateTextSplit.size;
8422
- var maxSize = translate.request.translateTextSplit.maxSize;
8423
- var singleMinSize = translate.request.translateTextSplit.singleTextMinSize;
8424
- if(typeof(size) !== 'number' || size <= 0){
8425
- return [textArray];
8426
- }
8427
- if(typeof(singleMinSize) !== 'number' || singleMinSize <= 0){
8428
- singleMinSize = Math.floor(size / 2);
8429
- }
8430
-
8431
- var list = [];
8432
- var current = [];
8433
- var currentSize = 2; // "[]"
8434
- var pushCurrent = function(){
8435
- if(current.length > 0){
8436
- list.push(current);
8437
- current = [];
8438
- currentSize = 2;
8439
- }
8440
- };
8441
-
8442
- for(var i = 0; i < textArray.length; i++){
8443
- var item = textArray[i];
8444
- if(typeof(item) !== 'string'){
8445
- item = '' + item;
8446
- }
8447
-
8448
- var itemJson = JSON.stringify(item);
8449
- var itemLen = itemJson.length + 2; // 作为单元素数组的长度
8450
-
8451
- //大文本单独成组,避免与其他文本拼接
8452
- if(singleMinSize > 0 && itemLen >= singleMinSize){
8453
- pushCurrent();
8454
- list.push([item]);
8455
- continue;
8456
- }
8457
-
8458
- var nextSize = current.length === 0 ? (2 + itemJson.length) : (currentSize + 1 + itemJson.length);
8459
-
8460
- //超过限制或达到数组最大元素数量,先提交当前组
8461
- if((maxSize && maxSize > 0 && current.length >= maxSize) || nextSize > size){
8462
- pushCurrent();
8463
- current.push(item);
8464
- currentSize = 2 + itemJson.length;
8465
- }else{
8466
- current.push(item);
8467
- currentSize = nextSize;
8468
- }
8469
- }
8470
-
8471
- pushCurrent();
8472
- if(list.length < 1){
8473
- list = [textArray];
8474
- }
8475
- return list;
8476
- },
8166
+ init:'init.json', //获取最新版本号,跟当前版本进行比对,用于提醒版本升级等使用
8167
+
8168
+ },
8477
8169
  /*
8478
8170
  v3.18.35.20250920 增加
8479
8171
 
@@ -8890,12 +8582,12 @@ var translate = {
8890
8582
  * 注意,是响应数据是第一个参数,请求数据是第二个参数。 以向前兼容
8891
8583
  * @param abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url
8892
8584
  */
8893
- post:function(path, data, func, abnormalFunc){
8894
- var headers = {
8895
- 'content-type':'application/x-www-form-urlencoded',
8896
- };
8897
- if(typeof(data) == 'undefined'){
8898
- return;
8585
+ post:function(path, data, func, abnormalFunc){
8586
+ var headers = {
8587
+ 'content-type':'application/x-www-form-urlencoded',
8588
+ };
8589
+ if(typeof(data) == 'undefined'){
8590
+ return;
8899
8591
  }
8900
8592
 
8901
8593
  //企业级翻译自动检测
@@ -8906,25 +8598,26 @@ var translate = {
8906
8598
  // ------- edge start --------
8907
8599
  var url = translate.request.getUrl(path);
8908
8600
  //if(url.indexOf('edge') > -1 && path == translate.request.api.translate){
8909
- if(translate.service.name == 'client.edge'){
8910
- if(path == translate.request.api.translate){
8911
- return translate.service.edge.translate(path, data, func, abnormalFunc);
8912
- }
8913
- if(path == translate.request.api.language){
8914
- var d = {};
8915
- d.info = 'SUCCESS';
8916
- d.result = 1;
8917
- d.list = translate.service.edge.language.json;
8918
- func(d);
8919
- return;
8920
- }
8921
-
8922
- //return;
8923
- }
8924
- // ------- edge end --------
8925
-
8926
- return this.send(path, data, data, func, 'post', true, headers, abnormalFunc, true);
8927
- },
8601
+ if(translate.service.name == 'client.edge'){
8602
+ if(path == translate.request.api.translate){
8603
+ translate.service.edge.translate(path, data, func, abnormalFunc);
8604
+ return;
8605
+ }
8606
+ if(path == translate.request.api.language){
8607
+ var d = {};
8608
+ d.info = 'SUCCESS';
8609
+ d.result = 1;
8610
+ d.list = translate.service.edge.language.json;
8611
+ func(d);
8612
+ return;
8613
+ }
8614
+
8615
+ //return;
8616
+ }
8617
+ // ------- edge end --------
8618
+
8619
+ this.send(path, data, data, func, 'post', true, headers, abnormalFunc, true);
8620
+ },
8928
8621
  /**
8929
8622
  * 发送请求
8930
8623
  * url 请求的url或者path(path,传入的是translate.request.api.translate 这种的,需要使用 getUrl 来组合真正请求的url )
@@ -8940,7 +8633,7 @@ var translate = {
8940
8633
  * abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url
8941
8634
  * showErrorLog 是否控制台打印出来错误日志,true打印, false 不打印
8942
8635
  */
8943
- send:function(url, data, appendXhrData, func, method, isAsynchronize, headers, abnormalFunc, showErrorLog){
8636
+ send:function(url, data, appendXhrData, func, method, isAsynchronize, headers, abnormalFunc, showErrorLog){
8944
8637
  //post提交的参数
8945
8638
  var params = '';
8946
8639
 
@@ -9077,41 +8770,8 @@ var translate = {
9077
8770
  }
9078
8771
  }
9079
8772
  }
9080
- return xhr;
9081
- },
9082
- /*
9083
- 中断未完成的翻译请求(translate.json)
9084
- */
9085
- abortTranslateRequests:function(){
9086
- if(typeof(translate.translateRequest) == 'undefined' || translate.translateRequest == null){
9087
- return;
9088
- }
9089
- for(var uuid in translate.translateRequest){
9090
- if (!translate.translateRequest.hasOwnProperty(uuid)) {
9091
- continue;
9092
- }
9093
- var langs = translate.translateRequest[uuid];
9094
- for(var lang in langs){
9095
- if (!langs.hasOwnProperty(lang)) {
9096
- continue;
9097
- }
9098
- var item = langs[lang];
9099
- if(typeof(item) !== 'object' || item == null){
9100
- continue;
9101
- }
9102
- if(typeof(item.xhrs) === 'object' && item.xhrs.length > 0){
9103
- for(var xi = 0; xi < item.xhrs.length; xi++){
9104
- try{
9105
- if(item.xhrs[xi] && typeof(item.xhrs[xi].abort) === 'function'){
9106
- item.xhrs[xi].abort();
9107
- }
9108
- }catch(e){}
9109
- }
9110
- item.xhrs = [];
9111
- }
9112
- }
9113
- }
9114
- },
8773
+ return xhr;
8774
+ },
9115
8775
  /*
9116
8776
 
9117
8777
  手动进行翻译操作。参数说明:
@@ -9155,11 +8815,10 @@ var translate = {
9155
8815
  console.log(xhr);
9156
8816
  });
9157
8817
  */
9158
- translateText:function(obj, func, abnormalFunc){
9159
- var texts = new Array();
9160
- var from = translate.language.getLocal();
9161
- var to = translate.language.getCurrent();
9162
- var executeCancelVersion = translate.cancelVersion;
8818
+ translateText:function(obj, func, abnormalFunc){
8819
+ var texts = new Array();
8820
+ var from = translate.language.getLocal();
8821
+ var to = translate.language.getCurrent();
9163
8822
 
9164
8823
  if(typeof(obj) == 'string'){
9165
8824
  //案例一的场景,传入单个字符串
@@ -9237,104 +8896,47 @@ var translate = {
9237
8896
  return;
9238
8897
  }
9239
8898
 
9240
- var url = translate.request.api.translate;
9241
- //按配置拆分文本数组,避免一次请求过大导致超时
9242
- var splitTextList = translate.request.splitTranslateTextArray(apiTranslateText);
9243
- if(typeof(splitTextList) == 'undefined' || splitTextList == null || splitTextList.length < 1){
9244
- splitTextList = [apiTranslateText];
9245
- }
9246
-
9247
- var splitFinishCount = 0;
9248
- var splitResponseError = false;
9249
- var splitResponseErrorInfo = '';
9250
- var splitNetworkError = false;
9251
- var splitFinish = function(){
9252
- if(translate.cancelVersion != executeCancelVersion){
9253
- return;
9254
- }
9255
- splitFinishCount++;
9256
- if(splitFinishCount >= splitTextList.length){
9257
- if(splitNetworkError){
9258
- return;
9259
- }
9260
- var resultData = {
9261
- from:from,
9262
- to: to,
9263
- text:translateResultArray,
9264
- result: splitResponseError ? 0 : 1
9265
- };
9266
- if(splitResponseError && typeof(splitResponseErrorInfo) === 'string' && splitResponseErrorInfo.length > 0){
9267
- resultData.info = splitResponseErrorInfo;
9268
- }
9269
- func(resultData);
9270
- }
9271
- };
9272
-
9273
- for(var splitIndex = 0; splitIndex < splitTextList.length; splitIndex++){
9274
- let splitTexts = splitTextList[splitIndex];
9275
- if(typeof(splitTexts) == 'undefined' || splitTexts == null || splitTexts.length < 1){
9276
- splitFinish();
9277
- continue;
9278
- }
9279
- let data = {
9280
- from:from,
9281
- to: to,
9282
- text:encodeURIComponent(JSON.stringify(splitTexts))
9283
- };
9284
- //console.log(splitTexts);
9285
- translate.request.post(url, data, function(responseData, requestData){
9286
- //console.log(responseData);
9287
- //console.log(data);
9288
- if(translate.cancelVersion != executeCancelVersion){
9289
- return;
9290
- }
9291
- if(responseData.result != 1){
9292
- splitResponseError = true;
9293
- if(typeof(responseData.info) === 'string' && responseData.info.length > 0 && splitResponseErrorInfo.length < 1){
9294
- splitResponseErrorInfo = responseData.info;
9295
- }
9296
- translate.log('=======ERROR START=======');
9297
- translate.log('from : '+requestData.from);
9298
- translate.log('to : '+requestData.to);
9299
- translate.log('translate text array : '+texts);
9300
- translate.log('response error info: '+responseData.info);
9301
- translate.log('=======ERROR END =======');
9302
- //return;
9303
- }
9304
-
9305
- if(typeof(responseData.text) == 'undefined' || responseData.text == null){
9306
- responseData.text = [];
9307
- }
9308
- var loopLength = responseData.text.length;
9309
- if(loopLength > splitTexts.length){
9310
- loopLength = splitTexts.length;
9311
- }
9312
- for(var i = 0; i < loopLength; i++){
9313
- //将翻译结果以 key:hash value翻译结果的形式缓存
9314
- var hash = translate.util.hash(splitTexts[i]);
9315
- translate.storage.set('hash_'+to+'_'+hash, responseData.text[i]);
9316
- //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
9317
- if(translate.offline.fullExtract.isUse){
9318
- translate.offline.fullExtract.set(hash, splitTexts[i], data.to, responseData.text[i]);
9319
- }
9320
-
9321
- //进行组合数据到 translateResultArray
9322
- translateResultArray[apiTranslateArray[hash]] = responseData.text[i];
9323
- }
9324
-
9325
- splitFinish();
9326
- }, (function(xhr){
9327
- if(translate.cancelVersion != executeCancelVersion){
9328
- return;
9329
- }
9330
- splitNetworkError = true;
9331
- if(abnormalFunc && typeof(abnormalFunc) == 'function'){
9332
- abnormalFunc(xhr);
9333
- }
9334
- splitFinish();
9335
- }));
9336
- }
9337
- },
8899
+ var url = translate.request.api.translate;
8900
+ var data = {
8901
+ from:from,
8902
+ to: to,
8903
+ text:encodeURIComponent(JSON.stringify(apiTranslateText))
8904
+ };
8905
+ //console.log(apiTranslateText);
8906
+ translate.request.post(url, data, function(responseData, requestData){
8907
+ //console.log(responseData);
8908
+ //console.log(data);
8909
+ if(responseData.result != 1){
8910
+ translate.log('=======ERROR START=======');
8911
+ translate.log('from : '+requestData.from);
8912
+ translate.log('to : '+requestData.to);
8913
+ translate.log('translate text array : '+texts);
8914
+ translate.log('response error info: '+responseData.info);
8915
+ translate.log('=======ERROR END =======');
8916
+ //return;
8917
+ }
8918
+
8919
+ for(var i = 0; i < responseData.text.length; i++){
8920
+ //将翻译结果以 key:hash value翻译结果的形式缓存
8921
+ var hash = translate.util.hash(apiTranslateText[i]);
8922
+ translate.storage.set('hash_'+to+'_'+hash, responseData.text[i]);
8923
+ //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
8924
+ if(translate.offline.fullExtract.isUse){
8925
+ translate.offline.fullExtract.set(hash, apiTranslateText[i], data.to, responseData.text[i]);
8926
+ }
8927
+
8928
+ //进行组合数据到 translateResultArray
8929
+ translateResultArray[apiTranslateArray[hash]] = responseData.text[i];
8930
+ }
8931
+ responseData.text = translateResultArray;
8932
+
8933
+ func(responseData);
8934
+ }, (function(xhr){
8935
+ if(abnormalFunc && typeof(abnormalFunc) == 'function'){
8936
+ abnormalFunc(xhr);
8937
+ }
8938
+ }));
8939
+ },
9338
8940
  listener:{
9339
8941
  //是否已经启动过 translate.request.listener.addListener() 开始监听了,开始了则是true,默认没开始则是false
9340
8942
  isStart:false,