torchv-translate 1.0.0

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.
@@ -0,0 +1,139 @@
1
+ <template>
2
+ <div class="LanguageSelect ignore">
3
+ <!-- 使用作用域插槽,将组件内部的数据和方法传递给父组件 -->
4
+ <slot
5
+ :LanguageSelectLanguageList="LanguageSelectLanguageList"
6
+ :LanguageSelectOnChange="LanguageSelectOnChange"
7
+ >
8
+ <!-- 原生 select 实现 -->
9
+ <select
10
+ v-model="language"
11
+ @change="LanguageSelectOnChange"
12
+ class="ignore"
13
+ >
14
+ <option value="" disabled>Please select language</option>
15
+ <option v-for="option in LanguageSelectLanguageList" :key="option.id" :value="option.id">
16
+ {{ option.name }}
17
+ </option>
18
+ </select>
19
+ </slot>
20
+ </div>
21
+ </template>
22
+
23
+ <script setup lang="ts">
24
+ import { ref, onMounted, h } from 'vue';
25
+
26
+ // 定义语言选项类型
27
+ interface LanguageOption {
28
+ id: string;
29
+ name: string;
30
+ }
31
+
32
+ // 选中的语言ID(双向绑定值)
33
+ const language = ref<string | null>(null);
34
+
35
+ // 语言选项列表
36
+ const LanguageSelectLanguageList = ref<LanguageOption[]>([]);
37
+
38
+ // 处理语言选择变化
39
+ const LanguageSelectOnChange = (event: Event) => {
40
+ // 从事件对象中获取选中的值
41
+ const target = event.target as HTMLSelectElement;
42
+ const value = target.value;
43
+
44
+ language.value = value;
45
+ window.translate.selectLanguageTag.selectOnChange({
46
+ target: {
47
+ value: value
48
+ }
49
+ });
50
+ };
51
+
52
+ onMounted(() => {
53
+ // 保留原有的初始化逻辑
54
+ if (typeof (translate) == 'object' && typeof (translate.vue3) == 'object' && typeof (translate.vue3.isUse) == 'boolean' && translate.vue3.isUse == true) {
55
+ // 正常,需要的,需要加载多语言切换Select
56
+ } else {
57
+ // 不需要显示
58
+ return;
59
+ }
60
+
61
+ translate.time.log(translate.vue3.isUse);
62
+
63
+ // 重写渲染语言下拉列表出现时的函数
64
+ translate.selectLanguageTag.render = function () {
65
+ if (translate.selectLanguageTag.alreadyRender) {
66
+ return;
67
+ }
68
+ translate.selectLanguageTag.alreadyRender = true;
69
+
70
+ // 判断如果不显示select选择语言,直接就隐藏掉
71
+ if (!translate.selectLanguageTag.show) {
72
+ return;
73
+ }
74
+
75
+ // 从服务器加载支持的语言库
76
+ if (typeof (translate.request.api.language) == 'string' && translate.request.api.language.length > 0) {
77
+ // 从接口加载语种
78
+ translate.request.post(translate.request.api.language, {}, function (data) {
79
+ if (data.result == 0) {
80
+ console.log('load language list error : ' + data.info);
81
+ return;
82
+ }
83
+ translate.request.api.language = data.list; // 进行缓存
84
+ translate.selectLanguageTag.customUI(data.list);
85
+ }, null);
86
+ } else if (typeof (translate.request.api.language) == 'object') {
87
+ // 无网络环境下,自定义显示语种
88
+ translate.selectLanguageTag.customUI(translate.request.api.language);
89
+ }
90
+
91
+ // 显示切换语言
92
+ const TranslateJsSelectLanguages = document.getElementsByClassName('LanguageSelect');
93
+ for (let li = 0; li < TranslateJsSelectLanguages.length; li++) {
94
+ TranslateJsSelectLanguages[li].style.display = 'block';
95
+ }
96
+ }
97
+
98
+ // 处理语言列表数据
99
+ translate.selectLanguageTag.customUI = function (externalLanguageList) {
100
+ // 整理允许显示的语种
101
+ const allowLanguageList: LanguageOption[] = [];
102
+
103
+ // 判断 selectLanguageTag.languages 中允许使用哪些
104
+ if (translate.selectLanguageTag.languages.length > 0) {
105
+ // 设置了自定义显示的语言
106
+ // 都转小写判断
107
+ const langs_indexof = (',' + translate.selectLanguageTag.languages + ',').toLowerCase();
108
+
109
+ for (let i = 0; i < externalLanguageList.length; i++) {
110
+ if (langs_indexof.indexOf(',' + externalLanguageList[i].id.toLowerCase() + ',') < 0) {
111
+ // 没发现,那不显示这个语种,调出
112
+ continue;
113
+ }
114
+ allowLanguageList.push(externalLanguageList[i]);
115
+ }
116
+
117
+ } else {
118
+ // 显示所有
119
+ allowLanguageList.push(...externalLanguageList);
120
+ }
121
+ // 赋予带渲染到界面的语言列表数据
122
+ LanguageSelectLanguageList.value = allowLanguageList;
123
+
124
+ // 显示上一次切换后的语种
125
+ language.value = translate.language.getCurrent();
126
+ }
127
+
128
+ // 渲染语言下拉列表出现
129
+ translate.selectLanguageTag.refreshRender();
130
+ });
131
+ </script>
132
+
133
+ <style scoped>
134
+ /* 避免被遮挡无法操作,设置z-index较高 */
135
+ .LanguageSelect {
136
+ z-index: 2147483583;
137
+ display: none;
138
+ }
139
+ </style>
@@ -0,0 +1,63 @@
1
+ import {translateJsVueUseModel, translate} from 'torchv-translate/vue/vue3/translateVue3TS.ts'; // 导入 translate 的 VUE3 的 ts 插件
2
+
3
+
4
+ /*
5
+
6
+ translate.js AI 多语言切换模块的自定义配置。
7
+ 如果不想启用,你可以通过以下方式中的任何一种进行禁用
8
+ 1. 直接将所有配置全部注释掉
9
+ 2. 将 /src/main.ts 中的这一行 app.use(translateJsVueUseModel) 注释掉即可。
10
+
11
+ 这些将会在 app.use(translateJsVueUseModel) 时被执行
12
+ */
13
+ translate.vue3.config = function(app){
14
+
15
+ //打印包含具体执行时间的debug日志
16
+ //translate.time.use = true;
17
+ //window.translate.time.printTime = 100;
18
+
19
+
20
+ // 针对翻译动作的性能监控 https://translate.zvo.cn/549733.html
21
+ translate.time.execute.start();
22
+
23
+ // 设置当前切换所支持的语言 http://translate.zvo.cn/4056.html
24
+ window.translate.selectLanguageTag.languages = 'chinese_simplified,english,korean,latin,french,russian';
25
+
26
+ // 设置本地语种(当前网页的语种) ,如果你网页语种很多,比如国际化论坛,哪个国家发言的都有,那这里你可以不用设置,交给 translate.js 自动去识别当前网页语种 http://translate.zvo.cn/4066.html
27
+ window.translate.language.setLocal('chinese_simplified');
28
+
29
+ // 禁用翻译的排队执行。注意,这是私有部署才有的能力,可极大提高视觉上的翻译效果,不需要再排队等待翻译。 http://translate.zvo.cn/391129.html
30
+ // 注意,如果你用开源版本,请不要启用此,不然请求过快,会触发接口风控保护,禁用你的终端
31
+ //translate.waitingExecute.use = false;
32
+
33
+ // 本地语种也进行强制翻译 http://translate.zvo.cn/289574.html
34
+ //translate.language.translateLocal = true;
35
+
36
+ // 翻译时忽略指定的文字不翻译 http://translate.zvo.cn/283381.html
37
+ //translate.ignore.text.push('xxxxx');
38
+
39
+ // 网页打开时自动隐藏文字,翻译完成后显示译文 http://translate.zvo.cn/549731.html
40
+ // 注意,如果不启用本多语言切换能力,这个要注释掉,不然你网页的文本是会被隐藏的
41
+ //window.translate.visual.webPageLoadTranslateBeforeHiddenText({inHeadTip: false});
42
+
43
+ // 启用翻译中的遮罩层 http://translate.zvo.cn/407105.html
44
+ window.translate.progress.api.startUITip();
45
+
46
+ // 设置采用开源免费的 client.edge 无服务端翻译服务通道,无需任何注册接入即可直接使用 http://translate.zvo.cn/4081.html
47
+ translate.service.use('client.edge');
48
+
49
+ // 网页ajax请求触发自动翻译 http://translate.zvo.cn/4086.html
50
+ translate.request.listener.start();
51
+
52
+ // 开启页面元素动态监控,js改变的内容也会被翻译,参考文档: http://translate.zvo.cn/4067.html
53
+ translate.listener.start();
54
+
55
+ // 元素的内容整体翻译能力配置 ,提高翻译的语义 http://translate.zvo.cn/4078.html
56
+ translate.whole.enableAll();
57
+
58
+ //触发翻译执行,有关这个的说明可参考 http://translate.zvo.cn/547814.html
59
+ translate.execute();
60
+ }
61
+
62
+ //导出,其中translateJsVueUseModel为vue插件,translate为js函数
63
+ export { translateJsVueUseModel, translate };
@@ -0,0 +1,93 @@
1
+ import { nextTick } from 'vue';
2
+ import translate from 'torchv-translate'
3
+
4
+ /* 这里不打印 translate.js 的声明 */
5
+ var originalTrasnalteLog = translate.log;
6
+ translate.log = function(obj){
7
+ if(typeof(obj) === 'string' && obj.indexOf('- translate.js -') !== -1){
8
+ //不显示 translate.js 的说明
9
+ }else{
10
+ originalTrasnalteLog(obj);
11
+ }
12
+ }
13
+
14
+ //vue3框架的一些单独设置
15
+ translate.vue3 = {
16
+ /*
17
+ 是否有 translate.execute() 代码的触发
18
+ 有则是true,没有则是false
19
+ false则不会再dom渲染完后自动进行翻译,自然也不会显示 select 选择语言
20
+ */
21
+ isExecute: false,
22
+ /*
23
+ 是否在vue入口文件中 调用了 translateJsVueUseModel 插件 app.use(translateJsVueUseModel)
24
+ 有则是true,没有则是false
25
+ */
26
+ isUse: false,
27
+ /*
28
+ 用户自定义配置,将在 app.use(translateJsVueUseModel) 时触发这个方法的执行
29
+ */
30
+ config: function(app){}
31
+ }
32
+
33
+ //如果 translate.vue3.config 中有 translate.execute() 代码的触发,那么就设置 isExecute 为 true ,同时阻止此次的 translate.execute() 执行,因为此次执行是在vue3的初始化阶段,而不是在dom渲染完毕后触发的,所以这里只是进行一个标记,待 真实 DOM渲染完毕后再来触发。
34
+ translate.lifecycle.execute.trigger.push(function(data){
35
+ if(data.executeTriggerNumber === 1){
36
+ translate.vue3.isExecute = true;
37
+ translate.time.log('打开页面后,第一次触发 translate.execute() - 设置 translate.vue3.isExecute = true;');
38
+ return false;
39
+ }
40
+ });
41
+
42
+ //将 translate 参数挂载到 window 上,方便在全局调用
43
+ if(typeof(window.translate) === 'undefined'){
44
+ window.translate = translate;
45
+ }
46
+ translate.time.log('将 translate 参数挂载到 window 上,方便在全局调用及调试');
47
+
48
+
49
+ const translateJsVueUseModel = {
50
+ install(app) {
51
+ translate.time.log(' app.use(translateJsVueUseModel) ');
52
+ translate.vue3.isUse = true;
53
+
54
+ //触发自定义配置
55
+ translate.vue3.config(app);
56
+
57
+ // 直接监听应用挂载完成
58
+ const originalMount = app.mount;
59
+ app.mount = function(...args) {
60
+ const root = originalMount.apply(this, args);
61
+ // 应用挂载完成后执行
62
+ // 使用双重nextTick确保DOM完全稳定后再执行翻译
63
+ // 第一个nextTick确保初始DOM渲染完成
64
+ nextTick(() => {
65
+ // 第二个nextTick确保可能的异步更新也完成
66
+ nextTick(() => {
67
+
68
+ /*
69
+
70
+ 这里有问题,应该是vue的DOM渲染完毕后触发,但是实际打断点测试,DOM还没有渲染完就触发了,这里还需要跟踪优化
71
+
72
+
73
+ */
74
+
75
+ if(translate.vue3.isExecute){
76
+ translate.time.log('组件渲染完成,触发 translate.execute();');
77
+
78
+ //对vue3的某些第三方组件进行容错处理
79
+ translate.faultTolerance.documentCreateTextNode.use(); //对VUE的某些组件频繁渲染dom进行容错
80
+ translate.time.log('对vue3的某些第三方组件进行容错处理 - translate.faultTolerance.documentCreateTextNode.use();');
81
+ translate.execute();
82
+ }else{
83
+ translate.time.log('组件渲染完成,但未发现translate.execute();存在,不进行翻译');
84
+ }
85
+ });
86
+ });
87
+ return root;
88
+ };
89
+ }
90
+ };
91
+
92
+ //export default translateJsVueUseModel;
93
+ export { translateJsVueUseModel, translate };
package/index.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * torchv-translate
3
+ * 一个开源的网页自动翻译解决方案
4
+ */
5
+
6
+ // 导入核心翻译引擎
7
+ require('./translate.js/translate.js');
8
+
9
+ // 导出 translate 对象供外部使用
10
+ if (typeof module !== 'undefined' && module.exports) {
11
+ module.exports = typeof translate !== 'undefined' ? translate : {};
12
+ }
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "torchv-translate",
3
+ "version": "1.0.0",
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
+ "main": "index.js",
6
+ "scripts": {
7
+ "version": "node dev/update-version.js",
8
+ "postversion": "git push && git push --tags"
9
+ },
10
+ "keywords": [
11
+ "i18n",
12
+ "translatejs",
13
+ "i18n-translatejs"
14
+ ],
15
+ "files": [
16
+ "index.js",
17
+ "translate.js/translate.js",
18
+ "extend/ArcoDesign/Vue3/LanguageSelect.vue",
19
+ "extend/vue/vue3/LanguageSelect.vue",
20
+ "extend/vue/vue3/translateVue3TS.ts",
21
+ "extend/vue/vue3/translate.ts",
22
+ "extend/naiveUI/LanguageSelect.vue"
23
+ ],
24
+ "homepage": "https://github.com/xnx3/translate#readme",
25
+ "bugs": {
26
+ "url": "https://github.com/xnx3/translate/issues"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/xnx3/translate.git"
31
+ },
32
+ "author": "管雷鸣",
33
+ "license": "MIT"
34
+ }