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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gc_i18n",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "gc_i18n": {
5
5
  "appCode": "TEST"
6
6
  },
@@ -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 LangChange from "./components/LangChange.vue";
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 (args && _.has(args, "comment")) {
52
- return _.get(args, "comment");
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.changeLocal = (newLocale) => {
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
- install(app, { router }) {
126
- app.use(this.i18n);
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.component("LangChange", LangChange);
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
  }
@@ -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(`i18n_${appCode}`);
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(`i18n_${appCode}`);
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/styles/viewuiplus.css";
6
- import iview from "view-ui-plus";
5
+ import zh from "view-ui-plus/dist/locale/zh-CN";
7
6
 
8
- const { i18n } = new gc_i18n({
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(iview).use(i18n);
16
+ const app = createApp(App).use(router).use(i18n);
16
17
 
17
18
  app.mount("#app");
@@ -7,9 +7,9 @@ const routes = [
7
7
  component: () => import("../view/Home.vue")
8
8
  },
9
9
  {
10
- path: "/BOOK",
11
- name: "BOOK",
12
- component: () => import("../view/book.vue")
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, changeLocal } = useI18n();
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
- changeLocal(lang);
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
- <!-- <div>
37
+ <div>
37
38
  <div>带路由前缀:</div>
38
- <div>{{ $t("BOOK.KAIHANGSHIJIAN", { comment: "找不到" }) }}</div>
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("KAIHANGSHIJIAN", { comment: "找不到" }) }}</div>
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("BOOK.KAIHANGSHIJIAN", { comment: "找不到" }) }}</div>
53
+ <div>{{ $t("ggbb", "找不到") }}</div>
48
54
  </div>
49
55
  <Page
50
56
  :total="40"
package/src/view/Home.vue CHANGED
@@ -9,4 +9,5 @@ const change = (lang) => {
9
9
 
10
10
  <template>
11
11
  {{ locale }}
12
+ <Language :more="true"></Language>
12
13
  </template>
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>