torchv-translate 1.0.8 → 1.0.9

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.9",
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": {
@@ -3080,6 +3080,19 @@ var translate = {
3080
3080
  var pendingItem = translate.request.pending.get(pendingKey);
3081
3081
  if(pendingItem != null){
3082
3082
  translate.request.pending.add(pendingKey, {uuid:uuid, lang:lang, hash:hash});
3083
+ //加入loading提示
3084
+ if(typeof(translate.progress) === 'object' && typeof(translate.progress.api) === 'object'){
3085
+ if(translate.progress.api.autoStart && !translate.progress.api.use){
3086
+ translate.progress.api.startUITip();
3087
+ }
3088
+ if(translate.progress.api.use){
3089
+ var pendingNodes = [];
3090
+ for(var pni = 0; pni < translate.nodeQueue[uuid]['list'][lang][hash]['nodes'].length; pni++){
3091
+ pendingNodes.push(translate.nodeQueue[uuid]['list'][lang][hash]['nodes'][pni].node);
3092
+ }
3093
+ translate.progress.api.applyLoadingByNodes(pendingNodes);
3094
+ }
3095
+ }
3083
3096
  continue;
3084
3097
  }
3085
3098
  //记录本次创建的pending,方便异常情况下清理
@@ -3310,14 +3323,21 @@ var translate = {
3310
3323
  texts: 当前网络请求有哪些文本进行翻译,值为 [text1, text2, ...]
3311
3324
 
3312
3325
  */
3313
- translate.request.data[uuid] = {
3314
- time:Date.now(),
3315
- list:{}
3316
- };
3317
-
3318
-
3319
- //进行掉接口翻译
3320
- for(var lang_index in fanyiLangs){ //一维数组,取语言
3326
+ translate.request.data[uuid] = {
3327
+ time:Date.now(),
3328
+ list:{}
3329
+ };
3330
+
3331
+ //自动启用翻译loading提示
3332
+ if(typeof(translate.progress) === 'object' && typeof(translate.progress.api) === 'object'){
3333
+ if(translate.progress.api.autoStart && !translate.progress.api.use){
3334
+ translate.progress.api.startUITip();
3335
+ }
3336
+ }
3337
+
3338
+
3339
+ //进行掉接口翻译
3340
+ for(var lang_index in fanyiLangs){ //一维数组,取语言
3321
3341
  if (!fanyiLangs.hasOwnProperty(lang_index)) {
3322
3342
  continue;
3323
3343
  }
@@ -3541,6 +3561,7 @@ var translate = {
3541
3561
  }
3542
3562
  //处理等待同一文本的其他节点
3543
3563
  if(pendingItem != null && typeof(pendingItem.waits) === 'object'){
3564
+ var waitLoadingNodes = [];
3544
3565
  for(var wi = 0; wi < pendingItem.waits.length; wi++){
3545
3566
  var waitItem = pendingItem.waits[wi];
3546
3567
  if(waitItem.uuid === uuid && waitItem.lang === lang && waitItem.hash === hash){
@@ -3562,8 +3583,12 @@ var translate = {
3562
3583
  var waitOriginal = waitQueue.original;
3563
3584
  for(var wni = 0; wni < waitQueue.nodes.length; wni++){
3564
3585
  task.add(waitQueue.nodes[wni]['node'], waitOriginal, waitQueue.nodes[wni]['beforeText']+text+waitQueue.nodes[wni]['afterText'], waitQueue.nodes[wni]['attribute']);
3586
+ waitLoadingNodes.push(waitQueue.nodes[wni]['node']);
3565
3587
  }
3566
3588
  }
3589
+ if(waitLoadingNodes.length > 0 && typeof(translate.progress) === 'object' && typeof(translate.progress.api) === 'object' && translate.progress.api.use){
3590
+ translate.progress.api.removeLoadingByNodes(waitLoadingNodes);
3591
+ }
3567
3592
  }
3568
3593
  //}
3569
3594
  /*
@@ -3601,7 +3626,32 @@ var translate = {
3601
3626
  }
3602
3627
  var cacheHash = translate.nodeQueue[uuid]['list'][lang][splitHashes[ph]]['cacheHash'];
3603
3628
  var pendingKey = translate.request.pending.key(lang, translate.to, cacheHash);
3604
- translate.request.pending.take(pendingKey);
3629
+ var pendingItem = translate.request.pending.take(pendingKey);
3630
+ if(pendingItem != null && typeof(pendingItem.waits) === 'object' && typeof(translate.progress) === 'object' && typeof(translate.progress.api) === 'object' && translate.progress.api.use){
3631
+ var waitNodes = [];
3632
+ for(var wi = 0; wi < pendingItem.waits.length; wi++){
3633
+ var waitItem = pendingItem.waits[wi];
3634
+ if(typeof(translate.nodeQueue[waitItem.uuid]) === 'undefined'){
3635
+ continue;
3636
+ }
3637
+ if(typeof(translate.nodeQueue[waitItem.uuid]['list'][waitItem.lang]) === 'undefined'){
3638
+ continue;
3639
+ }
3640
+ if(typeof(translate.nodeQueue[waitItem.uuid]['list'][waitItem.lang][waitItem.hash]) === 'undefined'){
3641
+ continue;
3642
+ }
3643
+ var waitQueue = translate.nodeQueue[waitItem.uuid]['list'][waitItem.lang][waitItem.hash];
3644
+ if(typeof(waitQueue) === 'undefined' || typeof(waitQueue.nodes) === 'undefined'){
3645
+ continue;
3646
+ }
3647
+ for(var wni = 0; wni < waitQueue.nodes.length; wni++){
3648
+ waitNodes.push(waitQueue.nodes[wni]['node']);
3649
+ }
3650
+ }
3651
+ if(waitNodes.length > 0){
3652
+ translate.progress.api.removeLoadingByNodes(waitNodes);
3653
+ }
3654
+ }
3605
3655
  }
3606
3656
  }
3607
3657
  var info = '';
@@ -9529,19 +9579,33 @@ var translate = {
9529
9579
 
9530
9580
  }
9531
9581
  },
9532
- //存储,本地缓存
9533
- storage:{
9534
- /*js translate.storage.IndexedDB start*/
9535
- //对浏览器的 IndexedDB 操作
9536
- IndexedDB:{
9537
- db: null,
9538
- // 初始化数据库
9539
- initDB: function () {
9540
- const self = this;
9541
- return new Promise((resolve, reject) => {
9542
- const DB_NAME = 'translate.js';
9543
- const STORE_NAME = 'kvStore';
9544
- const DB_VERSION = 1;
9582
+ //存储,本地缓存
9583
+ storage:{
9584
+ //是否启用 IndexedDB 作为额外持久化缓存(默认启用)
9585
+ useIndexedDB:true,
9586
+ //IndexedDB 的内存级缓存,避免频繁异步回填
9587
+ indexedDBCache:new Map(),
9588
+ //IndexedDB 读取中的 key,避免重复请求
9589
+ indexedDBCachePending:new Map(),
9590
+ //设置是否启用 IndexedDB 缓存
9591
+ setUseIndexedDB:function(use){
9592
+ translate.storage.useIndexedDB = use ? true : false;
9593
+ },
9594
+ /*js translate.storage.IndexedDB start*/
9595
+ //对浏览器的 IndexedDB 操作
9596
+ IndexedDB:{
9597
+ db: null,
9598
+ // 初始化数据库
9599
+ initDB: function () {
9600
+ const self = this;
9601
+ return new Promise((resolve, reject) => {
9602
+ if(typeof(indexedDB) == 'undefined'){
9603
+ reject('IndexedDB not supported');
9604
+ return;
9605
+ }
9606
+ const DB_NAME = 'translate.js';
9607
+ const STORE_NAME = 'kvStore';
9608
+ const DB_VERSION = 1;
9545
9609
 
9546
9610
  const request = indexedDB.open(DB_NAME, DB_VERSION);
9547
9611
 
@@ -9607,8 +9671,8 @@ var translate = {
9607
9671
  const users = await translate.storage.IndexedDB.list("*us*r*");
9608
9672
  其中传入的key可以模糊搜索,其中的 * 标识另个或多个
9609
9673
  */
9610
- list: async function (key = '') {
9611
- if (!this.db) await this.initDB();
9674
+ list: async function (key = '') {
9675
+ if (!this.db) await this.initDB();
9612
9676
 
9613
9677
  return new Promise((resolve, reject) => {
9614
9678
  const tx = this.db.transaction('kvStore', 'readonly');
@@ -9634,18 +9698,68 @@ var translate = {
9634
9698
 
9635
9699
  request.onerror = () => reject('游标读取失败');
9636
9700
  });
9637
- }
9638
- },
9639
- /*js translate.storage.IndexedDB end*/
9640
-
9641
- set:function(key,value){
9642
- localStorage.setItem(key,value);
9643
- },
9644
- get:function(key){
9645
- return localStorage.getItem(key);
9646
- }
9647
-
9648
- },
9701
+ }
9702
+ },
9703
+ /*js translate.storage.IndexedDB end*/
9704
+
9705
+ set:function(key,value){
9706
+ try{
9707
+ localStorage.setItem(key,value);
9708
+ }catch(e){}
9709
+ if(translate.storage.useIndexedDB && typeof(indexedDB) != 'undefined'){
9710
+ try{
9711
+ if(translate.storage.indexedDBCache instanceof Map){
9712
+ translate.storage.indexedDBCache.set(key, value);
9713
+ }
9714
+ translate.storage.IndexedDB.set(key, value);
9715
+ }catch(e){}
9716
+ }
9717
+ },
9718
+ get:function(key){
9719
+ var value = null;
9720
+ try{
9721
+ value = localStorage.getItem(key);
9722
+ }catch(e){
9723
+ value = null;
9724
+ }
9725
+ if(value != null){
9726
+ return value;
9727
+ }
9728
+
9729
+ //尝试从 IndexedDB 读取并回填(异步)
9730
+ if(translate.storage.useIndexedDB && typeof(indexedDB) != 'undefined'){
9731
+ if(translate.storage.indexedDBCache instanceof Map && translate.storage.indexedDBCache.has(key)){
9732
+ return translate.storage.indexedDBCache.get(key);
9733
+ }
9734
+ if(translate.storage.indexedDBCachePending instanceof Map && translate.storage.indexedDBCachePending.has(key)){
9735
+ return value;
9736
+ }
9737
+ if(translate.storage.indexedDBCachePending instanceof Map){
9738
+ translate.storage.indexedDBCachePending.set(key, 1);
9739
+ }
9740
+ translate.storage.IndexedDB.get(key).then(function(v){
9741
+ if(translate.storage.indexedDBCachePending instanceof Map){
9742
+ translate.storage.indexedDBCachePending.delete(key);
9743
+ }
9744
+ if(typeof(v) == 'undefined' || v == null){
9745
+ return;
9746
+ }
9747
+ try{
9748
+ localStorage.setItem(key, v);
9749
+ }catch(e){}
9750
+ if(translate.storage.indexedDBCache instanceof Map){
9751
+ translate.storage.indexedDBCache.set(key, v);
9752
+ }
9753
+ }).catch(function(){
9754
+ if(translate.storage.indexedDBCachePending instanceof Map){
9755
+ translate.storage.indexedDBCachePending.delete(key);
9756
+ }
9757
+ });
9758
+ }
9759
+ return value;
9760
+ }
9761
+
9762
+ },
9649
9763
  //针对图片进行相关的语种图片替换
9650
9764
  images:{
9651
9765
  /* 要替换的图片队列,数组形态,其中某个数组的:
@@ -10094,12 +10208,13 @@ var translate = {
10094
10208
  /*
10095
10209
  通过文本翻译API进行的
10096
10210
  */
10097
- api:{
10098
- isTip:true,//是否显示ui的提示,true显示,false不显示
10099
- use: false, //默认不使用,translate.progress.api.startUITip(); 可以设置为启用
10100
- setUITip:function(tip){
10101
- translate.progress.api.isTip = tip;
10102
- },
10211
+ api:{
10212
+ isTip:true,//是否显示ui的提示,true显示,false不显示
10213
+ use: false, //默认不使用,translate.progress.api.startUITip(); 可以设置为启用
10214
+ autoStart:true, //是否在触发翻译时自动启用loading
10215
+ setUITip:function(tip){
10216
+ translate.progress.api.isTip = tip;
10217
+ },
10103
10218
  //移除子元素(无限级别)中的所有 class name 的loading 遮罩
10104
10219
  //level 层级,数字,比如第一次调用,传入1, 第一次里面产生的第二次调用,这里就是2
10105
10220
  removeChildClass:function(node, level){
@@ -10138,12 +10253,15 @@ var translate = {
10138
10253
 
10139
10254
 
10140
10255
  */
10141
- startUITip:function(config){
10142
- translate.progress.api.use = true;
10143
-
10144
- if(typeof(config) === 'undefined'){
10145
- config = {};
10146
- }
10256
+ startUITip:function(config){
10257
+ if(translate.progress.api.use){
10258
+ return;
10259
+ }
10260
+ translate.progress.api.use = true;
10261
+
10262
+ if(typeof(config) === 'undefined'){
10263
+ config = {};
10264
+ }
10147
10265
  if(typeof(config.maskLayerMinWidth) !== 'number'){
10148
10266
  config.maskLayerMinWidth = 10;
10149
10267
  }
@@ -10170,10 +10288,10 @@ var translate = {
10170
10288
  document.head.appendChild(style);
10171
10289
  }
10172
10290
 
10173
-
10174
- if(translate.progress.api.isTip){
10175
- //translate.listener.execute.renderStartByApi.push(function(uuid, from, to){
10176
- translate.lifecycle.execute.translateNetworkBefore.push(function(data){
10291
+
10292
+ if(translate.progress.api.isTip){
10293
+ //translate.listener.execute.renderStartByApi.push(function(uuid, from, to){
10294
+ translate.lifecycle.execute.translateNetworkBefore.push(function(data){
10177
10295
  var startTime = new Date().getTime();
10178
10296
 
10179
10297
  //取出当前变动的node,对应的元素
@@ -10231,7 +10349,7 @@ var translate = {
10231
10349
  //console.log('计算+渲染耗时:'+(new Date().getTime() - startTime));
10232
10350
  });
10233
10351
 
10234
- translate.lifecycle.execute.translateNetworkAfter.push(function(data){
10352
+ translate.lifecycle.execute.translateNetworkAfter.push(function(data){
10235
10353
  //取出当前变动的node,对应的元素
10236
10354
  var elements = translate.element.nodeToElement(data.nodes);
10237
10355
 
@@ -10247,12 +10365,48 @@ var translate = {
10247
10365
  }
10248
10366
 
10249
10367
 
10250
- });
10251
-
10252
- }
10253
- }
10254
- }
10255
- },
10368
+ });
10369
+
10370
+ }
10371
+ },
10372
+ //对指定nodes应用loading样式
10373
+ applyLoadingByNodes:function(nodes){
10374
+ if(typeof(nodes) == 'undefined' || nodes == null || nodes.length < 1){
10375
+ return;
10376
+ }
10377
+ var elements = translate.element.nodeToElement(nodes);
10378
+ for(var r = 0; r<elements.length; r++){
10379
+ if(typeof(elements[r].className) !== 'string'){
10380
+ continue;
10381
+ }
10382
+ if(elements[r].className.indexOf('translate_api_in_progress') < 0){
10383
+ elements[r].className = elements[r].className+' translate_api_in_progress';
10384
+ }
10385
+ if(translate.progress.api.isTip && elements[r].className.indexOf('translatejs-text-element-hidden') < 0){
10386
+ elements[r].className = elements[r].className+' translatejs-text-element-hidden';
10387
+ }
10388
+ }
10389
+ },
10390
+ //移除指定nodes的loading样式
10391
+ removeLoadingByNodes:function(nodes){
10392
+ if(typeof(nodes) == 'undefined' || nodes == null || nodes.length < 1){
10393
+ return;
10394
+ }
10395
+ var elements = translate.element.nodeToElement(nodes);
10396
+ for(var r = 0; r<elements.length; r++){
10397
+ if(typeof(elements[r].className) !== 'string'){
10398
+ continue;
10399
+ }
10400
+ if(elements[r].className.indexOf('translate_api_in_progress') > -1){
10401
+ elements[r].className = elements[r].className.replace(/translate_api_in_progress/g, '');
10402
+ }
10403
+ if(elements[r].className.indexOf('translatejs-text-element-hidden') > -1){
10404
+ elements[r].className = elements[r].className.replace(/translatejs-text-element-hidden/g, '');
10405
+ }
10406
+ }
10407
+ }
10408
+ }
10409
+ },
10256
10410
  /*js translate.progress end*/
10257
10411
 
10258
10412
  /*js dispose start*/