torchv-translate 1.0.2 → 1.0.4

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.2",
3
+ "version": "1.0.4",
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": {
@@ -14,7 +14,7 @@ var translate = {
14
14
  * 格式:major.minor.patch.date
15
15
  */
16
16
  // AUTO_VERSION_START
17
- version: '1.0.2.20260127',
17
+ version: '1.0.3.20260127',
18
18
  // AUTO_VERSION_END
19
19
  /*
20
20
  当前使用的版本,默认使用v2. 可使用 setUseVersion2();
@@ -3233,7 +3233,7 @@ var translate = {
3233
3233
  if (!fanyiLangs.hasOwnProperty(lang_index)) {
3234
3234
  continue;
3235
3235
  }
3236
- var lang = fanyiLangs[lang_index];
3236
+ let lang = fanyiLangs[lang_index];
3237
3237
  if(typeof(lang) != 'string'){
3238
3238
  continue;
3239
3239
  }
@@ -3293,151 +3293,186 @@ var translate = {
3293
3293
  if(typeof(translate.request.data[uuid].list[lang]) === 'undefined'){
3294
3294
  translate.request.data[uuid].list[lang] = {};
3295
3295
  }
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
- }
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
+ //按配置拆分文本数组,避免一次请求过大导致超时
3305
+ var splitTextList = translate.request.splitTranslateTextArray(translateTextArray[lang]);
3306
+ if(typeof(splitTextList) == 'undefined' || splitTextList == null || splitTextList.length < 1){
3307
+ splitTextList = [translateTextArray[lang]];
3308
+ }
3309
+
3310
+ translate.translateRequest[uuid][lang].requestTotal = splitTextList.length;
3311
+ translate.translateRequest[uuid][lang].requestFinish = 0;
3312
+ translate.translateRequest[uuid][lang].requestError = 0;
3313
+ translate.translateRequest[uuid][lang].requestErrorInfo = '';
3314
+ translate.translateRequest[uuid][lang].requestErrorResult = 0;
3315
+
3316
+ var splitHashIndex = 0;
3317
+ var splitRequestFinish = function(result, info, errorResult){
3318
+ if(typeof(translate.translateRequest[uuid]) != 'object' || typeof(translate.translateRequest[uuid][lang]) != 'object'){
3319
+ return;
3320
+ }
3321
+ var requestItem = translate.translateRequest[uuid][lang];
3322
+ requestItem.requestFinish++;
3323
+ if(result === 0){
3324
+ requestItem.requestError = 1;
3325
+ if(typeof(info) === 'string' && info.length > 0){
3326
+ if(typeof(requestItem.requestErrorInfo) !== 'string' || requestItem.requestErrorInfo.length < 1){
3327
+ requestItem.requestErrorInfo = info;
3328
+ }
3329
+ }
3330
+ if(typeof(errorResult) === 'number' && errorResult > 0){
3331
+ if(typeof(requestItem.requestErrorResult) !== 'number' || requestItem.requestErrorResult < errorResult){
3332
+ requestItem.requestErrorResult = errorResult;
3333
+ }
3334
+ }
3335
+ }
3336
+ if(requestItem.requestFinish >= requestItem.requestTotal){
3337
+ if(requestItem.requestError === 1){
3338
+ requestItem.result = requestItem.requestErrorResult > 0 ? requestItem.requestErrorResult : 2;
3339
+ }else{
3340
+ requestItem.result = 1;
3341
+ }
3342
+ requestItem.executeFinish = 1; //1是执行完毕
3343
+ requestItem.stoptime = Math.floor(Date.now() / 1000);
3344
+ var resultFlag = requestItem.requestError === 1 ? 0 : 1;
3345
+ var infoText = requestItem.requestError === 1 ? (requestItem.requestErrorInfo || '') : '';
3346
+ setTimeout(function(){
3347
+ translate.waitingExecute.isAllExecuteFinish(uuid, lang, translate.to, resultFlag, infoText);
3348
+ },5);
3349
+ }
3350
+ };
3351
+
3352
+ for(var splitIndex = 0; splitIndex < splitTextList.length; splitIndex++){
3353
+ let splitTexts = splitTextList[splitIndex];
3354
+ if(typeof(splitTexts) == 'undefined' || splitTexts == null || splitTexts.length < 1){
3355
+ splitRequestFinish(1, '', 0);
3356
+ continue;
3357
+ }
3358
+ let splitHashes = translateHashArray[lang].slice(splitHashIndex, splitHashIndex + splitTexts.length);
3359
+ splitHashIndex = splitHashIndex + splitTexts.length;
3360
+
3361
+ let data = {
3362
+ from:lang,
3363
+ to:translate.to,
3364
+ //lowercase:translate.whole.isEnableAll? '0':'1', //首字母大写
3365
+ //text:JSON.stringify(translateTextArray[lang])
3366
+ text:encodeURIComponent(JSON.stringify(splitTexts))
3367
+ };
3368
+ translate.request.post(url, data, function(responseData, requestData){
3369
+ //console.log(data);
3370
+ //console.log(translateTextArray[data.from]);
3371
+
3372
+ //针对 giteeai 增加了账户余额、账户是否激活的拍的判定,所以增加了 401 这个参数,凡是账户异常的,参数值是 401~499 之间。所以只要不是1都是失败
3373
+ if(responseData.result != 1){
3374
+ splitRequestFinish(0, responseData.info, 2);
3375
+
3376
+ translate.log('=======ERROR START=======');
3377
+ translate.log(translateTextArray[requestData.from]);
3378
+ //console.log(encodeURIComponent(JSON.stringify(translateTextArray[data.from])));
3379
+ translate.log('response : '+responseData.info);
3380
+ translate.log('=======ERROR END =======');
3381
+ //translate.temp_executeFinishNumber++; //记录执行完的次数
3382
+ return;
3383
+ }
3384
+
3385
+ if(typeof(translate.nodeQueue[uuid]) == 'undefined'){
3386
+ translate.log('提示:你很可能多次引入了 translate.js 所以造成了翻译本身的数据错乱,这只是个提示,它还是会给你正常翻译的,但是你最好不要重复引入太多次 translate.js ,正常情况下只需要引入一次 translate.js 就可以了。太多的话很可能会导致你页面卡顿');
3387
+ splitRequestFinish(0, 'translate.nodeQueue not find', 2);
3388
+ return;
3389
+ }
3390
+
3391
+ //console.log('-----待翻译3:----');
3392
+ //console.log(translate.nodeQueue);
3393
+
3394
+ //console.log('response:'+uuid);
3395
+ let task = new translate.renderTask();
3396
+ //遍历 translateHashArray
3397
+ var loopLength = responseData.text.length;
3398
+ if(loopLength > splitHashes.length){
3399
+ loopLength = splitHashes.length;
3400
+ }
3401
+ for(var i=0; i<loopLength; i++){
3402
+ //翻译前的语种,如 english
3403
+ var lang = responseData.from;
3404
+ //翻译后的内容
3405
+ var text = responseData.text[i];
3406
+ //如果text为null,那么这个可能是一次翻译字数太多,为了保持数组长度,拼上的null
3407
+ if(text == null){
3408
+ continue;
3409
+ }
3410
+
3411
+ // v3.0.3 添加,避免像是 JavaScript 被错误翻译为 “JavaScript的” ,然后出现了多个句子中都出现了Javascript时,会出现翻译后文本重复的问题
3412
+ // 这里就是验证一下,翻译后的文本,是否会完全包含翻以前的文本,如果包含了,那么强制将翻译后的文本赋予翻译前的原始文本(也就是不被翻译)
3413
+ if(text.toLowerCase().indexOf(splitTexts[i].toLowerCase()) > -1){
3414
+ //发现了,那么强制赋予翻以前内容
3415
+ text = splitTexts[i];
3416
+ }
3417
+
3418
+
3419
+ //翻译前的hash对应下标
3420
+ var hash = splitHashes[i];
3421
+ var cacheHash = translate.nodeQueue[uuid]['list'][lang][hash]['cacheHash'];
3422
+
3423
+
3424
+
3425
+ //取原始的词,还未经过翻译的,需要进行翻译的词
3426
+ var originalWord = '';
3427
+ try{
3428
+ originalWord = translate.nodeQueue[uuid]['list'][lang][hash]['original'];
3429
+ //console.log('bef:'+translate.nodeQueue[uuid]['list'][lang][hash]['beforeText']);
3430
+ }catch(e){
3431
+ translate.log('uuid:'+uuid+', originalWord:'+originalWord+', lang:'+lang+', hash:'+hash+', text:'+text+', queue:'+translate.nodeQueue[uuid]);
3432
+ translate.log(e);
3433
+ continue;
3434
+ }
3435
+
3436
+ //for(var index = 0; index < translate.nodeQueue[lang][hash].length; index++){
3437
+ for(var node_index = 0; node_index < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; node_index++){
3438
+ //translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue = translate.nodeQueue[lang][hash]['nodes'][node_index].nodeValue.replace(new RegExp(originalWord,'g'), text);
3439
+ //加入任务
3440
+ 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']);
3441
+ }
3442
+ //}
3443
+ /*
3444
+ for(var index = 0; index < translate.nodeQueue[data.from][hash].length; index++){
3445
+ translate.nodeQueue[data.from][hash][index].nodeValue = text;
3446
+ }
3447
+ */
3448
+
3449
+ //将翻译结果以 key:hash value翻译结果的形式缓存
3450
+ translate.storage.set('hash_'+responseData.to+'_'+cacheHash,text);
3451
+ //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
3452
+ if(translate.offline.fullExtract.isUse){
3453
+ translate.offline.fullExtract.set(hash, originalWord, responseData.to, text);
3454
+ }
3455
+ }
3456
+ task.execute(); //执行渲染任务
3457
+ //translate.temp_executeFinishNumber++; //记录执行完的次数
3458
+
3459
+ splitRequestFinish(1, '', 0);
3460
+ }, function(xhr){
3461
+ var info = '';
3462
+ if(typeof(xhr.status) != 'undefined'){
3463
+ if(xhr.status < 1){
3464
+ info = 'Network connection failed. url: '+xhr.requestURL;
3465
+ }else{
3466
+ info = 'HTTP response code : '+xhr.status+', url: '+xhr.requestURL;
3467
+ }
3468
+ }else{
3469
+ info = 'Network connection failed. url: '+xhr.requestURL;
3470
+ }
3471
+ splitRequestFinish(0, info, 3);
3472
+ });
3473
+ }
3474
+ /*** 翻译end ***/
3475
+ }
3441
3476
 
3442
3477
  //钩子
3443
3478
  translate.lifecycle.execute.finally_Trigger({
@@ -8149,7 +8184,7 @@ var translate = {
8149
8184
  */
8150
8185
  data:{},
8151
8186
  //相关API接口方面
8152
- api:{
8187
+ api:{
8153
8188
  /**
8154
8189
  * 翻译接口请求的域名主机 host
8155
8190
  * 格式注意前面要带上协议如 https:// 域名后要加 /
@@ -8159,13 +8194,91 @@ var translate = {
8159
8194
  host:['https://api.translate.zvo.cn/','https://america.api.translate.zvo.cn/'],
8160
8195
  //host的备用接口,格式同host,可以填写多个,只不过这里是数组格式。只有当主 host 无法连通时,才会采用备host来提供访问。如果为空也就是 [] 则是不采用备方案。
8161
8196
  //backupHost:['',''],
8162
- language:'language.json', //获取支持的语种列表接口
8197
+ language:'', //已禁用,使用本地语言列表或自建后端服务
8163
8198
  translate:'translate.json', //翻译接口
8164
8199
  ip:'ip.json', //根据用户当前ip获取其所在地的语种
8165
8200
  connectTest:'connectTest.json', //用于 translate.js 多节点翻译自动检测网络连通情况
8166
- init:'init.json', //获取最新版本号,跟当前版本进行比对,用于提醒版本升级等使用
8167
-
8168
- },
8201
+ init:'init.json', //获取最新版本号,跟当前版本进行比对,用于提醒版本升级等使用
8202
+
8203
+ },
8204
+ /*
8205
+ translate.json 接口单次请求的文本大小控制
8206
+ size: 按 JSON.stringify(array) 的长度进行拆分
8207
+ maxSize: 拆分后的数组最大元素数量,0则不限制
8208
+ */
8209
+ translateTextSplit:{
8210
+ size:20000,
8211
+ maxSize:900,
8212
+ //单条文本达到该长度后单独成组,避免与其它文本拼接,0则使用 size/2
8213
+ singleTextMinSize:0
8214
+ },
8215
+ /*
8216
+ 将翻译文本数组拆分为多个请求,避免一次请求过大导致超时
8217
+ 注意:不会拆分单条文本,避免破坏段落/语义
8218
+ */
8219
+ splitTranslateTextArray:function(textArray){
8220
+ if(typeof(textArray) == 'undefined' || textArray == null){
8221
+ return [];
8222
+ }
8223
+ if(typeof(textArray.length) == 'undefined'){
8224
+ return [textArray];
8225
+ }
8226
+ var size = translate.request.translateTextSplit.size;
8227
+ var maxSize = translate.request.translateTextSplit.maxSize;
8228
+ var singleMinSize = translate.request.translateTextSplit.singleTextMinSize;
8229
+ if(typeof(size) !== 'number' || size <= 0){
8230
+ return [textArray];
8231
+ }
8232
+ if(typeof(singleMinSize) !== 'number' || singleMinSize <= 0){
8233
+ singleMinSize = Math.floor(size / 2);
8234
+ }
8235
+
8236
+ var list = [];
8237
+ var current = [];
8238
+ var currentSize = 2; // "[]"
8239
+ var pushCurrent = function(){
8240
+ if(current.length > 0){
8241
+ list.push(current);
8242
+ current = [];
8243
+ currentSize = 2;
8244
+ }
8245
+ };
8246
+
8247
+ for(var i = 0; i < textArray.length; i++){
8248
+ var item = textArray[i];
8249
+ if(typeof(item) !== 'string'){
8250
+ item = '' + item;
8251
+ }
8252
+
8253
+ var itemJson = JSON.stringify(item);
8254
+ var itemLen = itemJson.length + 2; // 作为单元素数组的长度
8255
+
8256
+ //大文本单独成组,避免与其他文本拼接
8257
+ if(singleMinSize > 0 && itemLen >= singleMinSize){
8258
+ pushCurrent();
8259
+ list.push([item]);
8260
+ continue;
8261
+ }
8262
+
8263
+ var nextSize = current.length === 0 ? (2 + itemJson.length) : (currentSize + 1 + itemJson.length);
8264
+
8265
+ //超过限制或达到数组最大元素数量,先提交当前组
8266
+ if((maxSize && maxSize > 0 && current.length >= maxSize) || nextSize > size){
8267
+ pushCurrent();
8268
+ current.push(item);
8269
+ currentSize = 2 + itemJson.length;
8270
+ }else{
8271
+ current.push(item);
8272
+ currentSize = nextSize;
8273
+ }
8274
+ }
8275
+
8276
+ pushCurrent();
8277
+ if(list.length < 1){
8278
+ list = [textArray];
8279
+ }
8280
+ return list;
8281
+ },
8169
8282
  /*
8170
8283
  v3.18.35.20250920 增加
8171
8284
 
@@ -8896,47 +9009,95 @@ var translate = {
8896
9009
  return;
8897
9010
  }
8898
9011
 
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
- },
9012
+ var url = translate.request.api.translate;
9013
+ //按配置拆分文本数组,避免一次请求过大导致超时
9014
+ var splitTextList = translate.request.splitTranslateTextArray(apiTranslateText);
9015
+ if(typeof(splitTextList) == 'undefined' || splitTextList == null || splitTextList.length < 1){
9016
+ splitTextList = [apiTranslateText];
9017
+ }
9018
+
9019
+ var splitFinishCount = 0;
9020
+ var splitResponseError = false;
9021
+ var splitResponseErrorInfo = '';
9022
+ var splitNetworkError = false;
9023
+ var splitFinish = function(){
9024
+ splitFinishCount++;
9025
+ if(splitFinishCount >= splitTextList.length){
9026
+ if(splitNetworkError){
9027
+ return;
9028
+ }
9029
+ var resultData = {
9030
+ from:from,
9031
+ to: to,
9032
+ text:translateResultArray,
9033
+ result: splitResponseError ? 0 : 1
9034
+ };
9035
+ if(splitResponseError && typeof(splitResponseErrorInfo) === 'string' && splitResponseErrorInfo.length > 0){
9036
+ resultData.info = splitResponseErrorInfo;
9037
+ }
9038
+ func(resultData);
9039
+ }
9040
+ };
9041
+
9042
+ for(var splitIndex = 0; splitIndex < splitTextList.length; splitIndex++){
9043
+ let splitTexts = splitTextList[splitIndex];
9044
+ if(typeof(splitTexts) == 'undefined' || splitTexts == null || splitTexts.length < 1){
9045
+ splitFinish();
9046
+ continue;
9047
+ }
9048
+ let data = {
9049
+ from:from,
9050
+ to: to,
9051
+ text:encodeURIComponent(JSON.stringify(splitTexts))
9052
+ };
9053
+ //console.log(splitTexts);
9054
+ translate.request.post(url, data, function(responseData, requestData){
9055
+ //console.log(responseData);
9056
+ //console.log(data);
9057
+ if(responseData.result != 1){
9058
+ splitResponseError = true;
9059
+ if(typeof(responseData.info) === 'string' && responseData.info.length > 0 && splitResponseErrorInfo.length < 1){
9060
+ splitResponseErrorInfo = responseData.info;
9061
+ }
9062
+ translate.log('=======ERROR START=======');
9063
+ translate.log('from : '+requestData.from);
9064
+ translate.log('to : '+requestData.to);
9065
+ translate.log('translate text array : '+texts);
9066
+ translate.log('response error info: '+responseData.info);
9067
+ translate.log('=======ERROR END =======');
9068
+ //return;
9069
+ }
9070
+
9071
+ if(typeof(responseData.text) == 'undefined' || responseData.text == null){
9072
+ responseData.text = [];
9073
+ }
9074
+ var loopLength = responseData.text.length;
9075
+ if(loopLength > splitTexts.length){
9076
+ loopLength = splitTexts.length;
9077
+ }
9078
+ for(var i = 0; i < loopLength; i++){
9079
+ //将翻译结果以 key:hash value翻译结果的形式缓存
9080
+ var hash = translate.util.hash(splitTexts[i]);
9081
+ translate.storage.set('hash_'+to+'_'+hash, responseData.text[i]);
9082
+ //如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
9083
+ if(translate.offline.fullExtract.isUse){
9084
+ translate.offline.fullExtract.set(hash, splitTexts[i], data.to, responseData.text[i]);
9085
+ }
9086
+
9087
+ //进行组合数据到 translateResultArray
9088
+ translateResultArray[apiTranslateArray[hash]] = responseData.text[i];
9089
+ }
9090
+
9091
+ splitFinish();
9092
+ }, (function(xhr){
9093
+ splitNetworkError = true;
9094
+ if(abnormalFunc && typeof(abnormalFunc) == 'function'){
9095
+ abnormalFunc(xhr);
9096
+ }
9097
+ splitFinish();
9098
+ }));
9099
+ }
9100
+ },
8940
9101
  listener:{
8941
9102
  //是否已经启动过 translate.request.listener.addListener() 开始监听了,开始了则是true,默认没开始则是false
8942
9103
  isStart:false,