要将 Vue3 的多语言支持改为异步按需请求语言文件,你可以使用动态导入语法 (import()
) 来异步加载语言文件。以下是一个示例代码,展示如何按需加载语言文件:
import { createI18n } from 'vue-i18n';
const i18n = createI18n({
legacy: false,
globalInjection: true,
locale: localStorage.getItem('locale') || navigator.language.slice(0, 2),
messages: {},
});
async function loadLanguage(locale) {
try {
const module = await import(`./${locale}.js`);
i18n.setLocaleMessage(locale, module.default);
} catch (error) {
console.error(`Failed to load language file for locale: ${locale}`, error);
}
}
// 初始加载默认语言
loadLanguage(i18n.locale);
// 监听语言变化事件,按需加载语言文件
window.addEventListener('storage', (event) => {
if (event.key === 'locale') {
loadLanguage(event.newValue);
}
});
export default i18n;
在上面的代码中,我们定义了一个 loadLanguage
函数,它使用动态导入语法异步加载指定语言环境的语言文件。函数内部使用 await
关键字等待语言文件加载完成,并使用 i18n.setLocaleMessage
方法将加载的语言文件设置到 i18n
实例中。
在 loadLanguage
函数被调用时,我们传入当前的语言环境(i18n.locale
)作为参数,以加载对应的语言文件。此外,我们还添加了一个监听器来监听 localStorage
的变化事件,当语言环境发生变化时,会触发 loadLanguage
函数重新加载对应的语言文件。
请注意,你需要在项目中的每个语言文件(如 en.js
、zh.js
)中导出对应的翻译内容,例如:
// en.js
export default {
// 英语翻译内容
message: 'Hello, world!',
// ...其他翻译内容
};
// zh.js
export default {
// 中文翻译内容
message: '你好,世界!',
// ...其他翻译内容
};
这样,当语言环境发生变化时,Vue3 的多语言支持会按需请求并加载对应的语言文件,以实现动态的语言切换。
官网给出了示例:
Lazy loading