Skip to content

Commit 9cac0db

Browse files
committed
refactor(i18n): 优化语言加载与切换逻辑
1 parent 9f9cc26 commit 9cac0db

File tree

3 files changed

+28
-46
lines changed

3 files changed

+28
-46
lines changed

src/locales/index.ts

Lines changed: 19 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,44 @@
1-
import { useLocalStorage, usePreferredLanguages } from '@vueuse/core';
21
import type { DropdownOption } from 'tdesign-vue-next';
32
import en_US from 'tdesign-vue-next/es/locale/en_US';
43
import zh_CN from 'tdesign-vue-next/es/locale/zh_CN';
54
import { computed } from 'vue';
65
import type { I18nOptions } from 'vue-i18n';
76
import { createI18n } from 'vue-i18n';
87

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-
188
export const localeConfigKey = 'tdesign-starter-locale';
199

20-
// 获取浏览器默认语言环境
21-
const languages = usePreferredLanguages();
10+
const TDESIGN_LOCALE_MAP: Record<string, Record<string, unknown>> = { zh_CN, en_US };
2211

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 });
4513

46-
return { langCode, messages, langList };
47-
};
14+
const langCode: string[] = [];
15+
const messages: I18nOptions['messages'] = {};
16+
const langList: DropdownOption[] = [];
4817

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+
});
5025

5126
export { langCode };
5227

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+
5334
export const i18n = createI18n({
5435
legacy: false,
55-
locale: (useLocalStorage(localeConfigKey, 'zh_CN').value || languages.value[0] || 'zh_CN').replace(/-/g, '_'),
36+
locale: initialLocale,
5637
fallbackLocale: 'zh_CN',
5738
messages,
5839
globalInjection: true,
5940
});
6041

6142
export const languageList = computed(() => langList);
62-
6343
export const { t } = i18n.global;
64-
6544
export default i18n;

src/locales/useLocale.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,21 @@ import { computed } from 'vue';
44
import { useI18n } from 'vue-i18n';
55

66
import { i18n, langCode, localeConfigKey } from '@/locales/index';
7+
import { useNotificationStore } from '@/store/modules/notification';
78

89
export function useLocale() {
910
const { locale } = useI18n({ useScope: 'global' });
10-
function changeLocale(lang: string) {
11-
// 如果切换的语言不在对应语言文件里则默认为简体中文
11+
const storedLocale = useLocalStorage(localeConfigKey, 'zh_CN');
12+
13+
const changeLocale = (lang: string) => {
1214
if (!langCode.includes(lang)) {
1315
lang = 'zh_CN';
1416
}
15-
1617
locale.value = lang;
17-
useLocalStorage(localeConfigKey, 'zh_CN').value = lang;
18-
}
18+
storedLocale.value = lang;
19+
// 刷新持久化的翻译数据
20+
useNotificationStore().refreshMsgData();
21+
};
1922

2023
const getComponentsLocale = computed(() => {
2124
return i18n.global.getLocaleMessage(locale.value).componentsLocale as GlobalConfigProvider;

src/store/modules/notification.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,5 @@ export const useNotificationStore = defineStore('notification', {
6060
this.msgData = getMsgData();
6161
},
6262
},
63-
persist: true,
63+
persist: false,
6464
});

0 commit comments

Comments
 (0)