gc_i18n 1.0.6 → 1.0.8
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/lib/gc_i18n.css +1 -1
- package/lib/gc_i18n.js +1485 -1444
- package/lib/gc_i18n.umd.cjs +12 -12
- package/package.json +1 -1
- package/packages/components/language.vue +93 -0
- package/packages/index.js +30 -25
- package/packages/libs/service.js +2 -2
- package/src/main.js +6 -5
- package/src/router/index.js +3 -3
- package/src/view/{book.vue → BOATNOTICE.vue} +14 -8
- package/src/view/Home.vue +1 -0
- package/vite.config.js +4 -0
- package/packages/components/LangChange.vue +0 -38
package/package.json
CHANGED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import { getLanguages } from "../libs/service";
|
|
3
|
+
import store from "store2";
|
|
4
|
+
import _ from "lodash-es";
|
|
5
|
+
import { useI18n } from "vue-i18n";
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
setup() {
|
|
9
|
+
const { changeLocal, locale } = useI18n();
|
|
10
|
+
return {
|
|
11
|
+
changeLocal,
|
|
12
|
+
locale
|
|
13
|
+
};
|
|
14
|
+
},
|
|
15
|
+
name: "LangChange",
|
|
16
|
+
data() {
|
|
17
|
+
return {
|
|
18
|
+
languages: []
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
props: {
|
|
22
|
+
token: String,
|
|
23
|
+
simple: {
|
|
24
|
+
type: Boolean,
|
|
25
|
+
default: false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
methods: {
|
|
29
|
+
toggle() {
|
|
30
|
+
const langToggle = _.find(
|
|
31
|
+
this.languages,
|
|
32
|
+
(item) => item.code !== this.locale
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
this.changeLocal(langToggle.code);
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
async mounted() {
|
|
39
|
+
this.language = store.get("I18N_LANGUAGE") || navigator.language;
|
|
40
|
+
const res = await getLanguages(this.token);
|
|
41
|
+
if (res && res.result === 0) {
|
|
42
|
+
this.languages = res.retVal;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
</script>
|
|
47
|
+
<template>
|
|
48
|
+
<div
|
|
49
|
+
class="gc_i18n_language"
|
|
50
|
+
v-if="languages && languages.length > 0"
|
|
51
|
+
>
|
|
52
|
+
<div v-if="languages.length === 1">
|
|
53
|
+
<span>{{ languages[0].name }}</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div
|
|
56
|
+
v-else-if="languages.length === 2"
|
|
57
|
+
class="two"
|
|
58
|
+
>
|
|
59
|
+
<span
|
|
60
|
+
class="item"
|
|
61
|
+
v-for="item in languages"
|
|
62
|
+
@click="toggle"
|
|
63
|
+
:class="item.code == locale ? 'active' : 'hide'"
|
|
64
|
+
>{{ item.name }}</span
|
|
65
|
+
>
|
|
66
|
+
</div>
|
|
67
|
+
<Select
|
|
68
|
+
:modelValue="locale"
|
|
69
|
+
@on-change="changeLocal"
|
|
70
|
+
v-else
|
|
71
|
+
>
|
|
72
|
+
<Option
|
|
73
|
+
:value="item.code"
|
|
74
|
+
:label="item.name"
|
|
75
|
+
v-for="item in languages"
|
|
76
|
+
>{{ item.name }}</Option
|
|
77
|
+
>
|
|
78
|
+
</Select>
|
|
79
|
+
</div>
|
|
80
|
+
</template>
|
|
81
|
+
|
|
82
|
+
<style lang="less" scoped>
|
|
83
|
+
.gc_i18n_language {
|
|
84
|
+
.two {
|
|
85
|
+
.item {
|
|
86
|
+
cursor: pointer;
|
|
87
|
+
}
|
|
88
|
+
.hide {
|
|
89
|
+
display: none;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
</style>
|
package/packages/index.js
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import keyboardJS from "keyboardjs";
|
|
2
2
|
import iview from "view-ui-plus";
|
|
3
|
+
import "view-ui-plus/dist/styles/viewuiplus.css";
|
|
3
4
|
import { createApp, nextTick } from "vue";
|
|
4
5
|
import { createI18n } from "vue-i18n";
|
|
5
6
|
import configVue from "./components/config.vue";
|
|
6
|
-
import
|
|
7
|
-
//
|
|
7
|
+
import LanguageTPL from "./components/language.vue";
|
|
8
8
|
import { getTranslate } from "./libs/service";
|
|
9
9
|
import { convertArrayToObject } from "./libs/utils";
|
|
10
10
|
import "./libs/http";
|
|
11
11
|
import _ from "lodash-es";
|
|
12
12
|
import store2 from "store2";
|
|
13
|
+
|
|
13
14
|
export default class I18n {
|
|
14
15
|
constructor(options = {}) {
|
|
15
16
|
const { router, appCode, messages, token } = options;
|
|
16
17
|
this.token = token || store2.get("token");
|
|
17
18
|
this.appCode = appCode;
|
|
18
19
|
this.router = router;
|
|
19
|
-
this.locale = navigator.language || "zh-CN";
|
|
20
|
+
this.locale = store2.get("I18N_LANGUAGE") || navigator.language || "zh-CN";
|
|
20
21
|
this.modalLoad = false;
|
|
21
22
|
this.name = "";
|
|
22
23
|
this.messages = messages || {};
|
|
@@ -35,7 +36,7 @@ export default class I18n {
|
|
|
35
36
|
// 保存原始的 t 方法
|
|
36
37
|
const originalT = this.i18n.global.t;
|
|
37
38
|
// 自定义 t 方法
|
|
38
|
-
this.i18n.global.t = (key, args) => {
|
|
39
|
+
this.i18n.global.t = (key, args, comment) => {
|
|
39
40
|
const routeName = _.toUpper(router?.currentRoute?.value?.name);
|
|
40
41
|
// 使用原始的 t 方法进行翻译
|
|
41
42
|
const originalTranslation = originalT(key);
|
|
@@ -43,13 +44,14 @@ export default class I18n {
|
|
|
43
44
|
if (originalTranslation === key && routeName) {
|
|
44
45
|
const prefixedKey = `${routeName}.${key}`;
|
|
45
46
|
// 同样使用原始的 t 方法进行翻译
|
|
46
|
-
const routeTranslation = originalT(prefixedKey);
|
|
47
|
+
const routeTranslation = originalT(prefixedKey, args);
|
|
47
48
|
|
|
48
49
|
if (routeTranslation !== prefixedKey) {
|
|
49
50
|
return routeTranslation;
|
|
50
51
|
} else {
|
|
51
|
-
if (
|
|
52
|
-
|
|
52
|
+
if (comment) {
|
|
53
|
+
console.log(`找不到"${key}",使用"${comment}"`);
|
|
54
|
+
return comment;
|
|
53
55
|
} else {
|
|
54
56
|
return key;
|
|
55
57
|
}
|
|
@@ -58,7 +60,7 @@ export default class I18n {
|
|
|
58
60
|
return originalTranslation;
|
|
59
61
|
};
|
|
60
62
|
|
|
61
|
-
this.i18n.global.
|
|
63
|
+
this.i18n.global.changeLocale = (newLocale) => {
|
|
62
64
|
this.setLanguage(newLocale || this.locale);
|
|
63
65
|
};
|
|
64
66
|
this.createModal();
|
|
@@ -67,22 +69,9 @@ export default class I18n {
|
|
|
67
69
|
this.configInstance && this.configInstance.closeModal();
|
|
68
70
|
this.name = to.name;
|
|
69
71
|
token && this.setToken(token);
|
|
70
|
-
await this.setLanguage(language);
|
|
72
|
+
await this.setLanguage(language || this.locale);
|
|
71
73
|
next();
|
|
72
74
|
});
|
|
73
|
-
// router.afterEach((to, from) => {
|
|
74
|
-
// nextTick(() => {
|
|
75
|
-
// console.log("this.configInstance", this.configInstance);
|
|
76
|
-
|
|
77
|
-
// if (!this.configInstance) {
|
|
78
|
-
// console.log("to", to, to.name);
|
|
79
|
-
// this.name = to.name;
|
|
80
|
-
// } else {
|
|
81
|
-
// this.configInstance.closeModal();
|
|
82
|
-
// this.configInstance = null;
|
|
83
|
-
// }
|
|
84
|
-
// });
|
|
85
|
-
// });
|
|
86
75
|
keyboardJS.bind("shift > t", (e) => {
|
|
87
76
|
// 打开弹窗
|
|
88
77
|
this.configInstance.openModal({ name: this.name }); // 调用 openModal 方法
|
|
@@ -107,6 +96,7 @@ export default class I18n {
|
|
|
107
96
|
}
|
|
108
97
|
this.locale = language;
|
|
109
98
|
this.i18n.global.locale.value = language;
|
|
99
|
+
store2.set("I18N_LANGUAGE", language);
|
|
110
100
|
resolve(true);
|
|
111
101
|
});
|
|
112
102
|
}
|
|
@@ -122,11 +112,26 @@ export default class I18n {
|
|
|
122
112
|
.use(iview)
|
|
123
113
|
.mount(document.createElement("div")); // 挂载到一个临时的 div
|
|
124
114
|
}
|
|
125
|
-
|
|
126
|
-
|
|
115
|
+
Language() {
|
|
116
|
+
return {
|
|
117
|
+
setup: () => {
|
|
118
|
+
return {
|
|
119
|
+
token: this.token
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
components: {
|
|
123
|
+
LanguageTPL
|
|
124
|
+
},
|
|
125
|
+
template: `<LanguageTPL :token='token'></LanguageTPL>`
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
install(app, opts = {}) {
|
|
127
129
|
app.use(iview, {
|
|
128
130
|
i18n: this.i18n
|
|
129
131
|
});
|
|
130
|
-
app.
|
|
132
|
+
app.config.globalProperties.$t = this.i18n.global.t;
|
|
133
|
+
app.config.globalProperties.$i18n = this.i18n;
|
|
134
|
+
app.component("Language", this.Language());
|
|
135
|
+
app.use(this.i18n);
|
|
131
136
|
}
|
|
132
137
|
}
|
package/packages/libs/service.js
CHANGED
|
@@ -62,7 +62,7 @@ export const saveTranslate = async (data, token) => {
|
|
|
62
62
|
export const getTranslate = async ({ appCode, language = "zh-CN", token }) => {
|
|
63
63
|
return new Promise(async (resolve, reject) => {
|
|
64
64
|
// const appCodeStore = i18nStore.get(appCode);
|
|
65
|
-
const languageStore = store2.namespace(`
|
|
65
|
+
const languageStore = store2.namespace(`I18N_${_.toUpper(appCode)}`);
|
|
66
66
|
const options = {
|
|
67
67
|
appCode,
|
|
68
68
|
language,
|
|
@@ -92,7 +92,7 @@ export const getTranslate = async ({ appCode, language = "zh-CN", token }) => {
|
|
|
92
92
|
lastPullDate: res.lastPullDate,
|
|
93
93
|
translatesDTOs: data
|
|
94
94
|
};
|
|
95
|
-
const languageStore = store2.namespace(`
|
|
95
|
+
const languageStore = store2.namespace(`I18N_${_.toUpper(appCode)}`);
|
|
96
96
|
languageStore.set(language, saveData, ":"); // Only update the specific key
|
|
97
97
|
resolve(data);
|
|
98
98
|
} else {
|
package/src/main.js
CHANGED
|
@@ -2,16 +2,17 @@ import { createApp } from "vue";
|
|
|
2
2
|
import App from "./App.vue";
|
|
3
3
|
import gc_i18n from "../packages/index";
|
|
4
4
|
import router from "./router/index";
|
|
5
|
-
import "view-ui-plus/dist/
|
|
6
|
-
import iview from "view-ui-plus";
|
|
5
|
+
import zh from "view-ui-plus/dist/locale/zh-CN";
|
|
7
6
|
|
|
8
|
-
const
|
|
7
|
+
const i18n = new gc_i18n({
|
|
9
8
|
appCode: "TEST",
|
|
10
9
|
router,
|
|
11
|
-
messages: {
|
|
10
|
+
messages: {
|
|
11
|
+
"zh-CN": zh
|
|
12
|
+
}
|
|
12
13
|
});
|
|
13
14
|
console.log("i18n", i18n);
|
|
14
15
|
|
|
15
|
-
const app = createApp(App).use(router).use(
|
|
16
|
+
const app = createApp(App).use(router).use(i18n);
|
|
16
17
|
|
|
17
18
|
app.mount("#app");
|
package/src/router/index.js
CHANGED
|
@@ -7,9 +7,9 @@ const routes = [
|
|
|
7
7
|
component: () => import("../view/Home.vue")
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
|
-
path: "/
|
|
11
|
-
name: "
|
|
12
|
-
component: () => import("../view/
|
|
10
|
+
path: "/BOATNOTICE",
|
|
11
|
+
name: "BOATNOTICE",
|
|
12
|
+
component: () => import("../view/BOATNOTICE.vue")
|
|
13
13
|
}
|
|
14
14
|
];
|
|
15
15
|
const router = createRouter({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { useI18n } from "vue-i18n";
|
|
3
|
-
const { locale,
|
|
3
|
+
const { locale, changeLocale } = useI18n();
|
|
4
4
|
|
|
5
5
|
defineProps({
|
|
6
6
|
msg: String
|
|
@@ -19,32 +19,38 @@ const langs = [
|
|
|
19
19
|
code: "zh-TW"
|
|
20
20
|
}
|
|
21
21
|
];
|
|
22
|
+
const total = 100;
|
|
22
23
|
const change = (lang) => {
|
|
23
|
-
|
|
24
|
+
changeLocale(lang);
|
|
24
25
|
};
|
|
25
26
|
</script>
|
|
26
27
|
|
|
27
28
|
<template>
|
|
28
29
|
<div>
|
|
29
|
-
{{ locale }}
|
|
30
|
+
<div>当前语言: {{ locale }}</div>
|
|
30
31
|
<Button
|
|
31
32
|
v-for="item in langs"
|
|
32
33
|
:type="item.code === locale ? 'primary' : 'default'"
|
|
33
34
|
@click="change(item.code)"
|
|
34
35
|
>{{ item.label }}</Button
|
|
35
36
|
>
|
|
36
|
-
|
|
37
|
+
<div>
|
|
37
38
|
<div>带路由前缀:</div>
|
|
38
|
-
<div>{{ $t("
|
|
39
|
-
</div>
|
|
39
|
+
<div>{{ $t("BOATNOTICE.DAOCHU", "找不到2") }}</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div>
|
|
43
|
+
<div>有变量的:</div>
|
|
44
|
+
<div>{{ $t("HJ: {0}GT", [total], "合xxx计:{0}条") }}</div>
|
|
45
|
+
</div>
|
|
40
46
|
<div>
|
|
41
47
|
<div>不带前缀:</div>
|
|
42
|
-
<div>{{ $t("
|
|
48
|
+
<div>{{ $t("DAOCHU", "找不到") }}</div>
|
|
43
49
|
<!-- <div>{{ $t("中文{0}", [{ comment: "找不到" }]) }}</div> -->
|
|
44
50
|
</div>
|
|
45
51
|
<div>
|
|
46
52
|
<div>完全找不到的数据:</div>
|
|
47
|
-
<div>{{ $t("
|
|
53
|
+
<div>{{ $t("ggbb", "找不到") }}</div>
|
|
48
54
|
</div>
|
|
49
55
|
<Page
|
|
50
56
|
:total="40"
|
package/src/view/Home.vue
CHANGED
package/vite.config.js
CHANGED
|
@@ -37,6 +37,10 @@ export default defineConfig({
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
outDir: "lib"
|
|
40
|
+
// outDir:
|
|
41
|
+
// "/Users/huqiliang/Documents/lvyun/newipms-front/node_modules/gc_i18n/lib",
|
|
42
|
+
// outDir:
|
|
43
|
+
// "/Users/huqiliang/Documents/lvyun/travel-ship-standard-front/node_modules/gc_i18n/lib"
|
|
40
44
|
},
|
|
41
45
|
plugins: [vue(), vueJsx(), libCss()]
|
|
42
46
|
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { getLanguages } from "../libs/service";
|
|
3
|
-
export default {
|
|
4
|
-
name: "LangChange",
|
|
5
|
-
data() {
|
|
6
|
-
return {
|
|
7
|
-
languages: [],
|
|
8
|
-
language: ""
|
|
9
|
-
};
|
|
10
|
-
},
|
|
11
|
-
props: {
|
|
12
|
-
more: {
|
|
13
|
-
type: Boolean,
|
|
14
|
-
default: false
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
async mounted() {
|
|
18
|
-
this.language = navigator.language || "zh-CN";
|
|
19
|
-
const res = await getLanguages();
|
|
20
|
-
if (res && res.result === 0) {
|
|
21
|
-
this.languages = res.retVal;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
</script>
|
|
26
|
-
<template>
|
|
27
|
-
<div>
|
|
28
|
-
<div v-if="more">
|
|
29
|
-
<span>切换语种</span>
|
|
30
|
-
</div>
|
|
31
|
-
<Select
|
|
32
|
-
v-model="language"
|
|
33
|
-
v-else
|
|
34
|
-
>
|
|
35
|
-
<Option value="zh-CN">中文</Option>
|
|
36
|
-
</Select>
|
|
37
|
-
</div>
|
|
38
|
-
</template>
|