Blame view

Yi.Vben5.Vue3/apps/web-antd/src/locales/index.ts 2.34 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
  import type { Locale } from 'ant-design-vue/es/locale';
  
  import type { App } from 'vue';
  
  import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales';
  
  import { ref } from 'vue';
  
  import {
    $t,
    setupI18n as coreSetup,
    loadLocalesMapFromDir,
  } from '@vben/locales';
  import { preferences } from '@vben/preferences';
  
  import antdEnLocale from 'ant-design-vue/es/locale/en_US';
  import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN';
  import dayjs from 'dayjs';
  
  const antdLocale = ref<Locale>(antdDefaultLocale);
  
  const modules = import.meta.glob('./langs/**/*.json');
  
  const localesMap = loadLocalesMapFromDir(
    /\.\/langs\/([^/]+)\/(.*)\.json$/,
    modules,
  );
  /**
   * 加载应用特有的语言包
   * 这里也可以改造为从服务端获取翻译数据
   * @param lang
   */
  async function loadMessages(lang: SupportedLanguagesType) {
    const [appLocaleMessages] = await Promise.all([
      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
      localesMap[lang]!(),
      loadThirdPartyMessage(lang),
    ]);
    return appLocaleMessages.default;
  }
  
  /**
   * 加载第三方组件库的语言包
   * @param lang
   */
  async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
    await Promise.all([loadAntdLocale(lang), loadDayjsLocale(lang)]);
  }
  
  /**
   * 加载dayjs的语言包
   * @param lang
   */
  async function loadDayjsLocale(lang: SupportedLanguagesType) {
    let locale;
    switch (lang) {
      case 'en-US': {
        locale = await import('dayjs/locale/en');
        break;
      }
      case 'zh-CN': {
        locale = await import('dayjs/locale/zh-cn');
        break;
      }
      // 默认使用英语
      default: {
        locale = await import('dayjs/locale/en');
      }
    }
    if (locale) {
      dayjs.locale(locale);
    } else {
      console.error(`Failed to load dayjs locale for ${lang}`);
    }
  }
  
  /**
   * 加载antd的语言包
   * @param lang
   */
  async function loadAntdLocale(lang: SupportedLanguagesType) {
    switch (lang) {
      case 'en-US': {
        antdLocale.value = antdEnLocale;
        break;
      }
      case 'zh-CN': {
        antdLocale.value = antdDefaultLocale;
        break;
      }
    }
  }
  
  async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
    await coreSetup(app, {
      defaultLocale: preferences.app.locale,
      loadMessages,
      missingWarn: !import.meta.env.PROD,
      ...options,
    });
  }
  
  export { $t, antdLocale, setupI18n };