i18n-jsautotranslate 3.18.66 → 3.18.71
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/index.js +121 -22
- package/package.json +1 -1
- package/vue/vue3/translateVue3TS.ts +19 -19
package/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var translate = {
|
|
|
14
14
|
* 格式:major.minor.patch.date
|
|
15
15
|
*/
|
|
16
16
|
// AUTO_VERSION_START
|
|
17
|
-
version: '3.18.
|
|
17
|
+
version: '3.18.71.20251010',
|
|
18
18
|
// AUTO_VERSION_END
|
|
19
19
|
/*
|
|
20
20
|
当前使用的版本,默认使用v2. 可使用 setUseVersion2();
|
|
@@ -73,6 +73,11 @@ var translate = {
|
|
|
73
73
|
*/
|
|
74
74
|
languages:'',
|
|
75
75
|
alreadyRender:false, //当前是否已渲染过了 true为是 v2.2增加
|
|
76
|
+
|
|
77
|
+
changeLanguageBeforeLoadOfflineFile: function(path){
|
|
78
|
+
|
|
79
|
+
},
|
|
80
|
+
|
|
76
81
|
selectOnChange:function(event){
|
|
77
82
|
var language = event.target.value;
|
|
78
83
|
translate.changeLanguage(language);
|
|
@@ -950,7 +955,22 @@ var translate = {
|
|
|
950
955
|
},
|
|
951
956
|
},
|
|
952
957
|
|
|
958
|
+
//已转为 offline ,这个是对旧版做兼容
|
|
953
959
|
office:{
|
|
960
|
+
export:function(){
|
|
961
|
+
console.log('请使用最新版本的 translate.offline.export , 而不是 translate.office.export');
|
|
962
|
+
},
|
|
963
|
+
showPanel:function(){
|
|
964
|
+
console.log('请使用最新版本的 translate.offline.showPanel , 而不是 translate.office.export');
|
|
965
|
+
},
|
|
966
|
+
append:function(to, properties){
|
|
967
|
+
translate.offline.append(to, properties);
|
|
968
|
+
},
|
|
969
|
+
fullExtract:{
|
|
970
|
+
isUse:false
|
|
971
|
+
}
|
|
972
|
+
},
|
|
973
|
+
offline:{
|
|
954
974
|
/*
|
|
955
975
|
网页上翻译之后,自动导出当前页面的术语库
|
|
956
976
|
|
|
@@ -996,7 +1016,7 @@ var translate = {
|
|
|
996
1016
|
|
|
997
1017
|
if(text.length > 0){
|
|
998
1018
|
//有内容
|
|
999
|
-
text = 'translate.
|
|
1019
|
+
text = 'translate.offline.append(\''+translate.language.getCurrent()+'\',`'+text+'\n`);';
|
|
1000
1020
|
//console.log(text);
|
|
1001
1021
|
translate.util.loadMsgJs();
|
|
1002
1022
|
msg.popups({
|
|
@@ -1021,7 +1041,7 @@ var translate = {
|
|
|
1021
1041
|
//导出按钮
|
|
1022
1042
|
let button = document.createElement('button');
|
|
1023
1043
|
button.onclick = function() {
|
|
1024
|
-
translate.
|
|
1044
|
+
translate.offline.export();
|
|
1025
1045
|
};
|
|
1026
1046
|
button.innerHTML = '导出配置信息';
|
|
1027
1047
|
button.setAttribute('style', 'margin-left: 72px; margin-top: 30px; margin-bottom: 20px; font-size: 25px; background-color: blue; padding: 15px; padding-top: 3px; padding-bottom: 3px; border-radius: 3px;');
|
|
@@ -1084,7 +1104,7 @@ var translate = {
|
|
|
1084
1104
|
|
|
1085
1105
|
//全部提取能力(整站的离线翻译数据提取)
|
|
1086
1106
|
fullExtract:{
|
|
1087
|
-
/*js translate.
|
|
1107
|
+
/*js translate.offline.fullExtract.set start*/
|
|
1088
1108
|
/*
|
|
1089
1109
|
将翻译的结果加入
|
|
1090
1110
|
hash: 翻译前的文本的hash
|
|
@@ -1106,9 +1126,9 @@ var translate = {
|
|
|
1106
1126
|
obj[toLanguage] = translateText;
|
|
1107
1127
|
await translate.storage.IndexedDB.set('hash_'+hash, obj);
|
|
1108
1128
|
},
|
|
1109
|
-
/*js translate.
|
|
1129
|
+
/*js translate.offline.fullExtract.set end*/
|
|
1110
1130
|
|
|
1111
|
-
/*js translate.
|
|
1131
|
+
/*js translate.offline.fullExtract.export start*/
|
|
1112
1132
|
/*
|
|
1113
1133
|
将存储的数据导出为 txt 文件下载下来
|
|
1114
1134
|
*/
|
|
@@ -1121,7 +1141,7 @@ var translate = {
|
|
|
1121
1141
|
translate.log('error : to param not find, example: "english"');
|
|
1122
1142
|
return;
|
|
1123
1143
|
}
|
|
1124
|
-
var text = 'translate.
|
|
1144
|
+
var text = 'translate.offline.append(\''+to+'\',`';
|
|
1125
1145
|
|
|
1126
1146
|
var data = await translate.storage.IndexedDB.list('hash_*');
|
|
1127
1147
|
for(var i in data){
|
|
@@ -1141,7 +1161,7 @@ var translate = {
|
|
|
1141
1161
|
link.click();
|
|
1142
1162
|
URL.revokeObjectURL(url);
|
|
1143
1163
|
},
|
|
1144
|
-
/*js translate.
|
|
1164
|
+
/*js translate.offline.fullExtract.export end*/
|
|
1145
1165
|
|
|
1146
1166
|
/*
|
|
1147
1167
|
是否启用全部提取的能力
|
|
@@ -2413,7 +2433,7 @@ var translate = {
|
|
|
2413
2433
|
|
|
2414
2434
|
if(all.length > 500){
|
|
2415
2435
|
translate.log('------tip------');
|
|
2416
|
-
translate.log('translate.execute( docs ) 传入的docs.length 过大,超过
|
|
2436
|
+
translate.log('translate.execute( docs ) 传入的docs.length 过大,超过1500,这很不正常,当前 docs.length : '+all.length+' ,如果你感觉真的没问题,请联系作者 http://translate.zvo.cn/43006.html 说明情况,根据你的情况进行分析。 当前只取前1500个元素进行翻译');
|
|
2417
2437
|
}
|
|
2418
2438
|
|
|
2419
2439
|
//初始化 translate.element.tagAttribute ,主要针对 v3.17.10 版本的适配调整,对 translate.element.tagAttribute 的设置做了改变,做旧版本的适配
|
|
@@ -2439,7 +2459,7 @@ var translate = {
|
|
|
2439
2459
|
|
|
2440
2460
|
translate.time.log('开始扫描要翻译区域的元素');
|
|
2441
2461
|
//检索目标内的node元素
|
|
2442
|
-
for(var i = 0; i< all.length & i <
|
|
2462
|
+
for(var i = 0; i< all.length & i < 1500; i++){
|
|
2443
2463
|
var node = all[i];
|
|
2444
2464
|
translate.element.whileNodes(uuid, node);
|
|
2445
2465
|
}
|
|
@@ -3162,8 +3182,8 @@ var translate = {
|
|
|
3162
3182
|
//将翻译结果以 key:hash value翻译结果的形式缓存
|
|
3163
3183
|
translate.storage.set('hash_'+data.to+'_'+cacheHash,text);
|
|
3164
3184
|
//如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
|
|
3165
|
-
if(translate.
|
|
3166
|
-
translate.
|
|
3185
|
+
if(translate.offline.fullExtract.isUse){
|
|
3186
|
+
translate.offline.fullExtract.set(hash, originalWord, data.to, text);
|
|
3167
3187
|
}
|
|
3168
3188
|
}
|
|
3169
3189
|
task.execute(); //执行渲染任务
|
|
@@ -8138,8 +8158,8 @@ var translate = {
|
|
|
8138
8158
|
var hash = translate.util.hash(apiTranslateText[i]);
|
|
8139
8159
|
translate.storage.set('hash_'+to+'_'+hash, resultData.text[i]);
|
|
8140
8160
|
//如果离线翻译启用了全部提取,那么还要存入离线翻译指定存储
|
|
8141
|
-
if(translate.
|
|
8142
|
-
translate.
|
|
8161
|
+
if(translate.offline.fullExtract.isUse){
|
|
8162
|
+
translate.offline.fullExtract.set(hash, apiTranslateText[i], data.to, resultData.text[i]);
|
|
8143
8163
|
}
|
|
8144
8164
|
|
|
8145
8165
|
//进行组合数据到 translateResultArray
|
|
@@ -9315,20 +9335,99 @@ var translate = {
|
|
|
9315
9335
|
|
|
9316
9336
|
obj: js对象
|
|
9317
9337
|
formatSupplementaryCharLength: 对这个js对象进行格式化自动补充字符的长度,比如 2、 4
|
|
9338
|
+
|
|
9339
|
+
2025.10.10 优化传入参数
|
|
9340
|
+
obj:{
|
|
9341
|
+
jsObject: 原本的obj参数, 也就是js对象
|
|
9342
|
+
formatSupplementaryCharLength: 对这个js对象进行格式化自动补充字符的长度,比如 2、 4 ,默认不设置则是4
|
|
9343
|
+
functionBodyHandle: 针对值是function函数类型时,可以自定义对函数体的源码进行处理,它是传入 function 类型的,比如:
|
|
9344
|
+
functionBodyHandle: function(functionBody){
|
|
9345
|
+
functionBody = functionBody+'123';
|
|
9346
|
+
return functionBody;
|
|
9347
|
+
}
|
|
9348
|
+
传入值是函数体的string类型的源码内容
|
|
9349
|
+
返回值是修改过后最新的函数体的string类型的源码内容
|
|
9350
|
+
这是 2025.10.10 新增参数,应对layui的 i18n 全自动翻译函数体中的字符串文本
|
|
9351
|
+
}
|
|
9318
9352
|
*/
|
|
9319
9353
|
objToString:function(obj, formatSupplementaryCharLength){
|
|
9354
|
+
if(typeof(obj) === 'object'){
|
|
9355
|
+
if(typeof(obj.jsObject) === 'object'){
|
|
9356
|
+
//是 2025.10.10 以后的新版本
|
|
9357
|
+
}else{
|
|
9358
|
+
//是 2025.10.10 以前的旧版本
|
|
9359
|
+
var newObj = {
|
|
9360
|
+
jsObject: obj
|
|
9361
|
+
}
|
|
9362
|
+
obj = newObj;
|
|
9363
|
+
}
|
|
9364
|
+
}else{
|
|
9365
|
+
obj = {};
|
|
9366
|
+
}
|
|
9367
|
+
if(typeof(formatSupplementaryCharLength) === 'number'){
|
|
9368
|
+
obj.formatSupplementaryCharLength = formatSupplementaryCharLength;
|
|
9369
|
+
}
|
|
9370
|
+
//未设置,就赋予默认值4
|
|
9371
|
+
if(typeof(obj.formatSupplementaryCharLength) !== 'number'){
|
|
9372
|
+
obj.formatSupplementaryCharLength = 4;
|
|
9373
|
+
}
|
|
9374
|
+
|
|
9320
9375
|
// 自定义replacer函数,将函数转换为字符串
|
|
9321
|
-
|
|
9376
|
+
let jsonStr = JSON.stringify(obj.jsObject, (key, value) => {
|
|
9322
9377
|
if (typeof value === 'function') {
|
|
9323
9378
|
// 将函数转换为其源代码字符串
|
|
9324
|
-
|
|
9379
|
+
var funcString = value.toString();
|
|
9380
|
+
if(typeof(funcString) === 'string' && funcString.length > 0){
|
|
9381
|
+
funcString = funcString.replace(/\n/g, '___TRANSLATEJS_LINE_BREAK___');
|
|
9382
|
+
}
|
|
9383
|
+
return funcString;
|
|
9384
|
+
}else{
|
|
9385
|
+
return value;
|
|
9325
9386
|
}
|
|
9326
|
-
return value;
|
|
9327
|
-
}, formatSupplementaryCharLength);
|
|
9328
9387
|
|
|
9329
|
-
|
|
9330
|
-
|
|
9331
|
-
|
|
9388
|
+
return result;
|
|
9389
|
+
}, obj.formatSupplementaryCharLength);
|
|
9390
|
+
|
|
9391
|
+
|
|
9392
|
+
//对 function 的函数体进行处理
|
|
9393
|
+
// 将转义的\n替换为实际的换行符 -- 20251009 优化,去掉换行符替换,layui 工具中发现这样会将原本文本中的换行符替换掉,而是调整为仅仅针对function方法进行针对替换
|
|
9394
|
+
// 逐行判断,判断其中哪一行的value是function,要将function的字符串格式变为function函数格式
|
|
9395
|
+
if(jsonStr.indexOf('___TRANSLATEJS_LINE_BREAK___') > -1){
|
|
9396
|
+
const lines = jsonStr.split('\n');
|
|
9397
|
+
for(var li = 0; li<lines.length; li++){
|
|
9398
|
+
// 检查当前行是否包含特定标记
|
|
9399
|
+
if (lines[li].includes('___TRANSLATEJS_LINE_BREAK___')) {
|
|
9400
|
+
lines[li] = lines[li].replace(/___TRANSLATEJS_LINE_BREAK___/g, '\n'); //将其替换为原本的换行符
|
|
9401
|
+
|
|
9402
|
+
// 查找值部分(假设格式是 "key": "function...")
|
|
9403
|
+
const valueMatch = lines[li].match(/"[^"]+":\s*"([^"]+)"/);
|
|
9404
|
+
if (valueMatch && valueMatch[1]) {
|
|
9405
|
+
// 替换换行标记为实际换行
|
|
9406
|
+
let functionStr = valueMatch[1].replace(/___TRANSLATEJS_LINE_BREAK___/g, '\n');
|
|
9407
|
+
|
|
9408
|
+
// 将函数字符串转换为实际函数
|
|
9409
|
+
try {
|
|
9410
|
+
// 使用Function构造函数创建函数更安全一些
|
|
9411
|
+
const functionParts = functionStr.match(/function\s*([^\(]*)\(([^)]*)\)\s*\{([\s\S]*)\}/);
|
|
9412
|
+
|
|
9413
|
+
if (functionParts) {
|
|
9414
|
+
var [, name, params, body] = functionParts;
|
|
9415
|
+
if(typeof(obj.functionBodyHandle) === 'function'){
|
|
9416
|
+
body = obj.functionBodyHandle(body);
|
|
9417
|
+
}
|
|
9418
|
+
// 替换原行中的字符串为函数表达式
|
|
9419
|
+
lines[li] = lines[li].replace(`"${valueMatch[1]}"`, `function${name}(${params}){${body}}`);
|
|
9420
|
+
}
|
|
9421
|
+
} catch (e) {
|
|
9422
|
+
console.error('转换函数时出错:', e);
|
|
9423
|
+
}
|
|
9424
|
+
}
|
|
9425
|
+
}
|
|
9426
|
+
}
|
|
9427
|
+
jsonStr = lines.join('\n');
|
|
9428
|
+
}
|
|
9429
|
+
|
|
9430
|
+
return jsonStr;
|
|
9332
9431
|
}
|
|
9333
9432
|
},
|
|
9334
9433
|
/*js dispose end*/
|
|
@@ -10937,7 +11036,7 @@ var nodeuuid = {
|
|
|
10937
11036
|
//延迟触发,方便拦截自定义
|
|
10938
11037
|
setTimeout(function(){
|
|
10939
11038
|
translate.log('------ translate.js ------\nTwo lines of js html automatic translation, page without change, no language configuration file, no API Key, SEO friendly! Open warehouse : https://github.com/xnx3/translate \n两行js实现html全自动翻译。 无需改动页面、无语言配置文件、无API Key、对SEO友好!完全开源,代码仓库:https://gitee.com/mail_osc/translate');
|
|
10940
|
-
},
|
|
11039
|
+
}, 3000);
|
|
10941
11040
|
/*js copyright-notice end*/
|
|
10942
11041
|
|
|
10943
11042
|
//初始化
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "i18n-jsautotranslate",
|
|
3
|
-
"version": "3.18.
|
|
3
|
+
"version": "3.18.71",
|
|
4
4
|
"description": "Two lines of js realize automatic html translation. No need to change the page, no language configuration file, no API key, SEO friendly!",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { nextTick } from 'vue';
|
|
2
2
|
import translate from 'i18n-jsautotranslate'
|
|
3
3
|
|
|
4
|
-
/*
|
|
5
|
-
|
|
6
|
-
因为这个文件没什么需要用户单独设置的,只是整体对vue的适配,所以这个文件后续调好了会放到 npm 上,当前因为下面DOM渲染完毕触发的问题没有精准触发,所以暂时先放到这里进行方便优化调试
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
4
|
//vue3框架的一些单独设置
|
|
12
5
|
translate.vue3 = {
|
|
13
6
|
/*
|
|
@@ -16,8 +9,18 @@ translate.vue3 = {
|
|
|
16
9
|
false则不会再dom渲染完后自动进行翻译,自然也不会显示 select 选择语言
|
|
17
10
|
*/
|
|
18
11
|
isExecute: false,
|
|
12
|
+
/*
|
|
13
|
+
是否在vue入口文件中 调用了 translateJsVueUseModel 插件 app.use(translateJsVueUseModel)
|
|
14
|
+
有则是true,没有则是false
|
|
15
|
+
*/
|
|
16
|
+
isUse: false,
|
|
17
|
+
/*
|
|
18
|
+
用户自定义配置,将在 app.use(translateJsVueUseModel) 时触发这个方法的执行
|
|
19
|
+
*/
|
|
20
|
+
config: function(app){}
|
|
19
21
|
}
|
|
20
|
-
|
|
22
|
+
|
|
23
|
+
//如果 translate.vue3.config 中有 translate.execute() 代码的触发,那么就设置 isExecute 为 true ,同时阻止此次的 translate.execute() 执行,因为此次执行是在vue3的初始化阶段,而不是在dom渲染完毕后触发的,所以这里只是进行一个标记,待 真实 DOM渲染完毕后再来触发。
|
|
21
24
|
translate.lifecycle.execute.trigger.push(function(data){
|
|
22
25
|
if(data.executeTriggerNumber === 1){
|
|
23
26
|
translate.vue3.isExecute = true;
|
|
@@ -25,16 +28,22 @@ translate.lifecycle.execute.trigger.push(function(data){
|
|
|
25
28
|
return false;
|
|
26
29
|
}
|
|
27
30
|
});
|
|
28
|
-
translate.time.log('设置vue3初始化配置 - translate.vue3');
|
|
29
31
|
|
|
30
32
|
//将 translate 参数挂载到 window 上,方便在全局调用
|
|
31
33
|
if(typeof(window.translate) === 'undefined'){
|
|
32
34
|
window.translate = translate;
|
|
33
35
|
}
|
|
34
|
-
translate.time.log('将 translate 参数挂载到 window
|
|
36
|
+
translate.time.log('将 translate 参数挂载到 window 上,方便在全局调用及调试');
|
|
37
|
+
|
|
35
38
|
|
|
36
39
|
const translateJsVueUseModel = {
|
|
37
40
|
install(app) {
|
|
41
|
+
translate.time.log(' app.use(translateJsVueUseModel) ');
|
|
42
|
+
translate.vue3.isUse = true;
|
|
43
|
+
|
|
44
|
+
//触发自定义配置
|
|
45
|
+
translate.vue3.config(app);
|
|
46
|
+
|
|
38
47
|
// 直接监听应用挂载完成
|
|
39
48
|
const originalMount = app.mount;
|
|
40
49
|
app.mount = function(...args) {
|
|
@@ -53,22 +62,13 @@ const translateJsVueUseModel = {
|
|
|
53
62
|
|
|
54
63
|
*/
|
|
55
64
|
|
|
56
|
-
|
|
57
65
|
if(translate.vue3.isExecute){
|
|
58
66
|
translate.time.log('组件渲染完成,触发 translate.execute();');
|
|
59
67
|
|
|
60
68
|
//对vue3的某些第三方组件进行容错处理
|
|
61
69
|
translate.faultTolerance.documentCreateTextNode.use(); //对VUE的某些组件频繁渲染dom进行容错
|
|
62
70
|
translate.time.log('对vue3的某些第三方组件进行容错处理 - translate.faultTolerance.documentCreateTextNode.use();');
|
|
63
|
-
|
|
64
|
-
console.log(translate.getDocuments());
|
|
65
71
|
translate.execute();
|
|
66
|
-
setTimeout(() => {
|
|
67
|
-
translate.execute();
|
|
68
|
-
}, 100);
|
|
69
|
-
setTimeout(() => {
|
|
70
|
-
translate.execute();
|
|
71
|
-
}, 2000);
|
|
72
72
|
}else{
|
|
73
73
|
translate.time.log('组件渲染完成,但未发现translate.execute();存在,不进行翻译');
|
|
74
74
|
}
|