index.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { createI18n } from 'vue-i18n';
  2. import pinia from '/@/stores/index';
  3. import { storeToRefs } from 'pinia';
  4. import { useThemeConfig } from '/@/stores/themeConfig';
  5. // 定义语言国际化内容
  6. /**
  7. * 说明:
  8. * 须在 pages 下新建文件夹(建议 `要国际化界面目录` 与 `i18n 目录` 相同,方便查找),
  9. * 注意国际化定义的字段,不要与原有的定义字段相同。
  10. * 1、/src/i18n/lang 下的 ts 为框架的国际化内容
  11. * 2、/src/i18n/pages 下的 ts 为各界面的国际化内容
  12. */
  13. // element plus 自带国际化
  14. import enLocale from 'element-plus/lib/locale/lang/en';
  15. import zhcnLocale from 'element-plus/lib/locale/lang/zh-cn';
  16. import zhtwLocale from 'element-plus/lib/locale/lang/zh-tw';
  17. // 定义变量内容
  18. const messages = {};
  19. const element = { en: enLocale, 'zh-cn': zhcnLocale, 'zh-tw': zhtwLocale };
  20. const itemize = { en: [], 'zh-cn': [], 'zh-tw': [] };
  21. const modules: Record<string, any> = import.meta.glob('./**/*.ts', { eager: true });
  22. // 对自动引入的 modules 进行分类 en、zh-cn、zh-tw
  23. // https://vitejs.cn/vite3-cn/guide/features.html#glob-import
  24. for (const path in modules) {
  25. const key = path.match(/(\S+)\/(\S+).ts/);
  26. if (itemize[key![2]]) itemize[key![2]].push(modules[path].default);
  27. else itemize[key![2]] = modules[path];
  28. }
  29. // 合并数组对象(非标准数组对象,数组中对象的每项 key、value 都不同)
  30. function mergeArrObj<T>(list: T, key: string) {
  31. let obj = {};
  32. list[key].forEach((i: EmptyObjectType) => {
  33. obj = Object.assign({}, obj, i);
  34. });
  35. return obj;
  36. }
  37. // 处理最终格式
  38. for (const key in itemize) {
  39. messages[key] = {
  40. name: key,
  41. el: element[key].el,
  42. message: mergeArrObj(itemize, key),
  43. };
  44. }
  45. // 读取 pinia 默认语言
  46. const stores = useThemeConfig(pinia);
  47. const { themeConfig } = storeToRefs(stores);
  48. // 导出语言国际化
  49. // https://vue-i18n.intlify.dev/guide/essentials/fallback.html#explicit-fallback-with-one-locale
  50. export const i18n = createI18n({
  51. legacy: false,
  52. silentTranslationWarn: true,
  53. missingWarn: false,
  54. silentFallbackWarn: true,
  55. fallbackWarn: false,
  56. locale: themeConfig.value.globalI18n,
  57. fallbackLocale: zhcnLocale.name,
  58. messages,
  59. });