yh-i18n 1.3.0 → 2.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.
Files changed (2) hide show
  1. package/index.js +127 -48
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { reactive, ref, computed } from "vue";
2
2
  import { defineStore } from "pinia";
3
3
  import { createI18n } from "vue-i18n";
4
+ import languageVue from "./language.vue";
4
5
  import axios from "@/libs/api.request";
5
6
 
6
7
  // base
@@ -24,12 +25,18 @@ import el_vi from "element-plus/dist/locale/vi.mjs";
24
25
  import el_tr from "element-plus/dist/locale/tr.mjs";
25
26
 
26
27
  // 自动根据浏览器系统语言设置语言
27
- const navLang = navigator.language;
28
+ const navLang = navigator.language.replace("-", "_");
28
29
  const initlang = localStorage.translateLanguage || navLang || "zh_CN";
29
30
 
30
31
  export let i18n = null;
31
- window.translateReady = !!localStorage.translateReady || false;
32
+ window.translateReady = !!localStorage.translateReady || import.meta.env.DEV;
32
33
  const isDev = window.translateReady;
34
+
35
+ const keySet = new Set();
36
+ Object.keys(zhCNBase).forEach((key) => {
37
+ keySet.add(key);
38
+ });
39
+
33
40
  function addTranslate(key) {
34
41
  if (key.indexOf("vxe") === -1) {
35
42
  try {
@@ -46,10 +53,6 @@ function addTranslate(key) {
46
53
  }
47
54
  }
48
55
  }
49
- const keySet = new Set();
50
- Object.keys(zhCNBase).forEach((key) => {
51
- keySet.add(key);
52
- });
53
56
 
54
57
  export const ct = (key, args) => {
55
58
  if (isDev) {
@@ -65,6 +68,7 @@ export const ct = (key, args) => {
65
68
  }
66
69
  };
67
70
 
71
+ /** i18n 相关的 store */
68
72
  export const useI18nStore = defineStore("i18nStore", () => {
69
73
  const lang = ref(initlang);
70
74
  /**
@@ -155,33 +159,15 @@ export const useI18nStore = defineStore("i18nStore", () => {
155
159
  };
156
160
  });
157
161
 
158
- async function createMessage(list) {
159
- let messages = {};
160
- list.forEach((item) => {
161
- switch (item) {
162
- case "zh_CN":
163
- messages["zh_CN"] = Object.assign(zhCNBase, zhCNVXETable);
164
- break;
165
- case "en_US":
166
- messages["en_US"] = Object.assign(enUSBase, enUSVXETable);
167
- break;
168
- case "th":
169
- messages["th"] = Object.assign(thBase, thVXETable);
170
- break;
171
-
172
- case "vi":
173
- messages["vi"] = Object.assign(viBase, viVXETable);
174
- break;
175
-
176
- case "tr":
177
- messages["tr"] = Object.assign(trBase, trVXETable);
178
- break;
179
-
180
- default:
181
- break;
182
- }
183
- });
162
+ async function getRemoteMessage(list) {
184
163
  try {
164
+ let messages = {
165
+ zh_CN: {},
166
+ en_US: {},
167
+ th: {},
168
+ vi: {},
169
+ tr: {},
170
+ };
185
171
  let {
186
172
  data: { data },
187
173
  } = await axios.request({
@@ -200,31 +186,50 @@ async function createMessage(list) {
200
186
  keySet.add(mKey);
201
187
  }
202
188
  Object.entries(itemObj).forEach(([key, val]) => {
203
- if (list.includes(key)) {
204
- if (!messages[key][mKey]) {
205
- messages[key][mKey] = val;
206
- }
189
+ if (!messages[key][mKey]) {
190
+ messages[key][mKey] = val;
207
191
  }
208
192
  });
209
193
  } catch (err) {
210
- console.error(err);
194
+ if (isDev) {
195
+ console.error(err);
196
+ }
211
197
  }
212
198
  });
199
+ list.forEach((key) => {
200
+ let m = i18n.global.getLocaleMessage(key);
201
+ i18n.global.setLocaleMessage(key, Object.assign(m, messages[key]));
202
+ });
213
203
  } catch (error) {}
214
- return messages;
215
204
  }
216
205
 
217
- /**
218
- *
219
- * @param {import("vue").App} app
220
- * @param {I18nList[]} list
221
- */
222
- export async function initI18n(list) {
223
- let messages = await createMessage(list);
224
- i18n = createI18n({
225
- locale: initlang,
226
- messages,
206
+ function createLocalMessage(list) {
207
+ let messages = {};
208
+ list.forEach((item) => {
209
+ switch (item) {
210
+ case "zh_CN":
211
+ messages["zh_CN"] = Object.assign(zhCNBase, zhCNVXETable);
212
+ break;
213
+ case "en_US":
214
+ messages["en_US"] = Object.assign(enUSBase, enUSVXETable);
215
+ break;
216
+ case "th":
217
+ messages["th"] = Object.assign(thBase, thVXETable);
218
+ break;
219
+
220
+ case "vi":
221
+ messages["vi"] = Object.assign(viBase, viVXETable);
222
+ break;
223
+
224
+ case "tr":
225
+ messages["tr"] = Object.assign(trBase, trVXETable);
226
+ break;
227
+
228
+ default:
229
+ break;
230
+ }
227
231
  });
232
+ return messages;
228
233
  }
229
234
 
230
235
  export function addI18nPage(router) {
@@ -240,3 +245,77 @@ export function addI18nPage(router) {
240
245
  });
241
246
  }
242
247
  }
248
+
249
+ export function cLog(string, isError = false) {
250
+ if (isError) {
251
+ console.error(
252
+ "%cyhI18n:",
253
+ "font-size: 16px;font-weight: bold;color: #61AFEF",
254
+ string
255
+ );
256
+ } else {
257
+ console.log(
258
+ "%cYHI18n",
259
+ "font-size: 18px;font-weight: bold;color: #61AFEF",
260
+ string
261
+ );
262
+ }
263
+ }
264
+
265
+ export const yhI18n = {
266
+ install(app, config) {
267
+ let { list, router, pinia, VXETable } = config;
268
+ if (!list) {
269
+ cLog(
270
+ "请设置 Config.i18nList ,并将其设置到 yhI18n 的 congfig.list 上,否则 国际化插件将失效"
271
+ );
272
+ return false;
273
+ }
274
+ let messages = createLocalMessage(list);
275
+ i18n = createI18n({
276
+ locale: initlang,
277
+ messages,
278
+ });
279
+ app.use(i18n);
280
+ app.config.globalProperties.$T = ct;
281
+
282
+ if (!isDev) {
283
+ cLog(
284
+ "没有开启翻译管理,可以在开发环境或者在控制台运行后面的代码再刷新页面: `localStorage.translateLanguage = '1'`"
285
+ );
286
+ }
287
+ if (router && isDev) {
288
+ addI18nPage(router);
289
+ } else {
290
+ if (!router) {
291
+ cLog("没有传递 router 对象,所以无法将翻译管理页面添加到应用中", true);
292
+ }
293
+ }
294
+
295
+ if (pinia) {
296
+ const i18nStore = useI18nStore(pinia);
297
+ i18nStore.setLocalList(list);
298
+ } else {
299
+ if (!pinia) {
300
+ cLog("没有传递 router 对象,所以无法为国际化插件设置语言列表", true);
301
+ }
302
+ }
303
+ if (VXETable) {
304
+ VXETable.setup({
305
+ i18n: (key, args) => ct(key, args),
306
+ translate: (key, args) => ct(key, args),
307
+ });
308
+ } else {
309
+ if (!pinia) {
310
+ cLog(
311
+ "没有传递 VXETable 对象,所以无法为 SLW 和 VXETable 设置国际化",
312
+ true
313
+ );
314
+ }
315
+ }
316
+
317
+ getRemoteMessage(list);
318
+ },
319
+ };
320
+
321
+ export const Language = languageVue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yh-i18n",
3
- "version": "1.3.0",
3
+ "version": "2.0.0",
4
4
  "description": "对于国际化的封装",
5
5
  "main": "index.js",
6
6
  "scripts": {