|
1 | | -import { useLocalStorage, usePreferredLanguages } from '@vueuse/core'; |
2 | 1 | import type { DropdownOption } from 'tdesign-vue-next'; |
3 | 2 | import en_US from 'tdesign-vue-next/es/locale/en_US'; |
4 | 3 | import zh_CN from 'tdesign-vue-next/es/locale/zh_CN'; |
5 | 4 | import { computed } from 'vue'; |
6 | 5 | import type { I18nOptions } from 'vue-i18n'; |
7 | 6 | import { createI18n } from 'vue-i18n'; |
8 | 7 |
|
9 | | -// 导入语言文件 (JSON 方式) |
10 | | -const langModules = import.meta.glob<{ default: Record<string, unknown> }>('./lang/*.json', { eager: true }); |
11 | | - |
12 | | -// TDesign 组件 locale 映射 |
13 | | -const TDESIGN_LOCALE_MAP: Record<string, Record<string, unknown>> = { |
14 | | - zh_CN, |
15 | | - en_US, |
16 | | -}; |
17 | | - |
18 | 8 | export const localeConfigKey = 'tdesign-starter-locale'; |
19 | 9 |
|
20 | | -// 获取浏览器默认语言环境 |
21 | | -const languages = usePreferredLanguages(); |
| 10 | +const TDESIGN_LOCALE_MAP: Record<string, Record<string, unknown>> = { zh_CN, en_US }; |
22 | 11 |
|
23 | | -// 解析语言模块 |
24 | | -const parseLangModules = () => { |
25 | | - const langCode: string[] = []; |
26 | | - const messages: I18nOptions['messages'] = {}; |
27 | | - const langList: DropdownOption[] = []; |
28 | | - |
29 | | - Object.entries(langModules).forEach(([path, module]) => { |
30 | | - const match = path.match(/\.\/lang\/([^.]+)\.json$/); |
31 | | - if (match) { |
32 | | - const code = match[1]; |
33 | | - langCode.push(code); |
34 | | - // 合并自定义语言包和 TDesign 组件 locale |
35 | | - messages[code] = { |
36 | | - ...module.default, |
37 | | - componentsLocale: TDESIGN_LOCALE_MAP[code], |
38 | | - }; |
39 | | - langList.push({ |
40 | | - content: module.default.lang as string, |
41 | | - value: code, |
42 | | - }); |
43 | | - } |
44 | | - }); |
| 12 | +const langModules = import.meta.glob<{ default: Record<string, unknown> }>('./lang/*.json', { eager: true }); |
45 | 13 |
|
46 | | - return { langCode, messages, langList }; |
47 | | -}; |
| 14 | +const langCode: string[] = []; |
| 15 | +const messages: I18nOptions['messages'] = {}; |
| 16 | +const langList: DropdownOption[] = []; |
48 | 17 |
|
49 | | -const { langCode, messages, langList } = parseLangModules(); |
| 18 | +Object.entries(langModules).forEach(([path, module]) => { |
| 19 | + const code = path.match(/\.\/lang\/([^.]+)\.json$/)?.[1]; |
| 20 | + if (!code) return; |
| 21 | + langCode.push(code); |
| 22 | + messages[code] = { ...module.default, componentsLocale: TDESIGN_LOCALE_MAP[code] }; |
| 23 | + langList.push({ content: module.default.lang as string, value: code }); |
| 24 | +}); |
50 | 25 |
|
51 | 26 | export { langCode }; |
52 | 27 |
|
| 28 | +// 初始化读取(一次性) |
| 29 | +const stored = localStorage.getItem(localeConfigKey); |
| 30 | +const preferred = navigator.languages?.[0]; |
| 31 | +const candidate = (stored || preferred || 'zh_CN').replace(/-/g, '_'); |
| 32 | +const initialLocale = langCode.includes(candidate) ? candidate : 'zh_CN'; |
| 33 | + |
53 | 34 | export const i18n = createI18n({ |
54 | 35 | legacy: false, |
55 | | - locale: (useLocalStorage(localeConfigKey, 'zh_CN').value || languages.value[0] || 'zh_CN').replace(/-/g, '_'), |
| 36 | + locale: initialLocale, |
56 | 37 | fallbackLocale: 'zh_CN', |
57 | 38 | messages, |
58 | 39 | globalInjection: true, |
59 | 40 | }); |
60 | 41 |
|
61 | 42 | export const languageList = computed(() => langList); |
62 | | - |
63 | 43 | export const { t } = i18n.global; |
64 | | - |
65 | 44 | export default i18n; |
0 commit comments