1. 初始化国际化实例
css
export async function setupI18n(app: App) {
// ... existing code ...
const options = await createI18nOptions();
i18n = createI18n(options);
app.use(i18n);
// ... existing code ...
}
作用:在应用启动时初始化vue-i18n实例并挂载到Vue应用中。
2. 动态加载语言包
css
async function createI18nOptions(): Promise<I18nOptions> {
// ... existing code ...
const locale = localeStore.getLocale;
const defaultLocal = await import(`./lang/${locale}.ts`);
// ... existing code ...
}
关键点:通过import()动态加载对应语言的.ts文件(如
zh-cn.ts
)。
3. 配置语言选项
css
async function createI18nOptions(): Promise<I18nOptions> {
// ... existing code ...
return {
legacy: false,
locale,
fallbackLocale: fallback,
messages: {
[locale]: defaultLocal.default?.message ?? {},
},
availableLocales: availableLocales,
// 其他配置...
};
}
核心配置:
locale:当前语言标识(如zh-CN)。
fallbackLocale:语言回退选项(如en)。
messages:注册语言包的翻译内容。
4. 状态管理(Pinia Store)
css
export const useLocaleStore = defineStore({
// ... existing code ...
actions: {
setLocaleInfo(info: Partial<LocaleSetting>) {
this.localInfo = { ...this.localInfo, ...info };
ls.set(LOCALE_KEY, this.localInfo); // 持久化到localStorage
},
},
});
作用:通过Pinia Store存储并持久化语言配置(如locale和showPicker)。
5. 动态切换语言
css
async function changeLocale(locale: LocaleType) {
// ... existing code ...
if (!loadLocalePool.includes(locale)) {
const langModule = await import(`./lang/${locale}.ts`);
i18n.global.setLocaleMessage(locale, langModule.message);
loadLocalePool.push(locale);
}
// ... existing code ...
}
关键逻辑:
检查语言是否已加载,若未加载则动态导入并注册消息。
更新vue-i18n的locale值以触发视图更新。
6. 配置Element Plus国际化
css
export function useLocale() {
// ... existing code ...
const getElLocale = computed(() => {
return i18n.global.getLocaleMessage(unref(getLocale))?.elLocale ?? ({} as Language);
});
// ... existing code ...
}
作用:从vue-i18n的翻译消息中提取elLocale字段,用于配置Element Plus组件的语言。
7. HTML语言属性同步
css
export function setHtmlPageLang(locale: string) {
document.querySelector('html')?.setAttribute('lang', locale);
}
触发时机:在语言切换时调用,更新标签的lang属性(如lang="zh-CN")。
8. 关键代码总结
8.1 动态加载语言包
css
const langModule = await import(`./lang/${locale}.ts`);
8.2 设置语言
css
(i18n.global.locale as Ref<string>).value = locale;
作用
设置当前语言:告诉vue-i18n实例当前要使用的语言标识(如从zh-CN切换到en)。
响应式更新:通过修改响应式对象的值,触发视图中所有使用$t()的组件重新翻译。
核心知识点
加载语言包:通过import()动态加载语言文件(如
en.ts
)。
设置当前语言:修改i18n.global.locale.value,触发全局语言切换。
8.3 注册Element语言配置
css
export default {
message: {
elLocale: import('element-plus/es/locale/lang/zh-cn'), // 合并Element翻译
},
};
8.4 globalI18n.setLocaleMessage(locale, message);
css
// src/locales/useLocale.ts
async function changeLocale(locale: LocaleType) {
// ...
const { message } = langModule; // 从动态导入的语言包中获取消息
globalI18n.setLocaleMessage(locale, message); // <--- 关键代码
// ...
}
作用
动态注册语言包:向vue-i18n实例中注册指定语言的翻译消息。
使用场景:当切换到未预先加载的语言时(如首次切换到en),需要先通过import()动态加载语言包,再通过此方法注册其翻译内容
核心知识点
setLocaleMessage 是 vue-i18n 提供的方法:
参数:
locale:目标语言标识(如zh-CN或en)。
message:该语言的翻译内容对象(如{ greeting: { hello: "你好" } })。
功能:将语言包的消息合并到vue-i18n的翻译字典中,确保后续调用$t()时能正确翻译
9. 总结
初始化Vue --> 加载Pinia Store
--> 创建i18n实例
--> 动态加载语言包
--> 设置语言选项
--> 持久化语言配置
--> 切换语言时动态更新