Vue i18n 优化方案
语言包按需加载
动态导入语言包可以减少初始加载时间,使用 import() 动态加载语言文件。在 Vue i18n 配置中,通过异步函数加载语言包:
javascript
const i18n = createI18n({
legacy: false,
locale: 'en', // 默认语言
fallbackLocale: 'en',
messages: { en: {} } // 初始为空或仅包含核心词汇
})
// 动态加载语言包
async function loadLocaleMessages(locale) {
try {
const messages = await import(`./locales/${locale}.json`)
i18n.global.setLocaleMessage(locale, messages.default)
return true
} catch (error) {
console.error('Failed to load locale:', error)
return false
}
}
路由守卫中按需加载目标语言:
javascript
router.beforeEach(async (to) => {
const locale = to.params.lang || localStorage.getItem('lang') || 'en'
if (!i18n.global.availableLocales.includes(locale)) {
await loadLocaleMessages(locale)
}
})
缓存当前语言
使用 localStorage 持久化存储用户选择的语言,避免每次访问重新选择:
javascript
// 设置语言时同步缓存
function setLanguage(locale) {
i18n.global.locale.value = locale
localStorage.setItem('lang', locale)
}
// 初始化时读取缓存
const savedLang = localStorage.getItem('lang')
if (savedLang) {
i18n.global.locale.value = savedLang
}
避免页面刷新失效
通过组合以下方法确保刷新后状态一致:
在应用初始化时恢复语言状态:
javascript
const app = createApp(App)
app.use(i18n)
app.use(router)
// 初始化同步路由与i18n
const initLang = localStorage.getItem('lang') || 'en'
router.push({ params: { lang: initLang } })
i18n.global.locale.value = initLang
使用全局混入自动处理语言切换:
javascript
app.mixin({
created() {
const routeLang = this.$route.params.lang
if (routeLang && this.$i18n.locale !== routeLang) {
this.$i18n.locale = routeLang
}
}
})
附加优化建议
-
使用 Webpack 的魔法注释分割语言包文件:
javascriptconst messages = await import(/* webpackChunkName: "locale-[request]" */ `./locales/${locale}.json`) -
实现语言包版本控制,通过 manifest 文件检查更新
-
对于大型项目,可将语言包拆分为按模块加载
-
添加加载失败时的降级策略,如回退到默认语言或显示占位内容