在加载路由之前加载 vue-i18n 消息

Load vue-i18n messages before routes are loaded

我正在尝试使用 vue-i18n 制作可翻译路线。

我希望它的工作方式是 JSON 文件将对特定路由 URL 进行翻译。

例如{ 'home_url': 'Home' } 然后在我的路线中,我会使用这样的东西:

export default [
  { path: i18n.t('home_url'), name: 'home', component: Home }
]

问题是在导入 i18n 消息之前加载了路由。

有什么方法可以延迟路由加载,直到 i18n 准备好?

这是我加载翻译的方式:

import Vue from 'vue'
import store from '~/store'
import VueI18n from 'vue-i18n'
import axios from 'axios'

Vue.use(VueI18n)

const i18n = new VueI18n({
  locale: 'en',
  fallbackLocale: 'en',
  messages: {}
})

/**
 * @param {String} locale
 */
export async function loadMessages (locale) {
  if (Object.keys(i18n.getLocaleMessage(locale)).length === 0) {
    const messages = await import(/* webpackChunkName: "lang-[request]" */ `~/lang/${locale}`)
    i18n.setLocaleMessage(locale, messages)
  }

  if (i18n.locale !== locale) {
    i18n.locale = locale
    axios.defaults.headers.common['Accept-Language'] = locale
    document.querySelector('html').setAttribute('lang', locale)
  }
}

;(async function () {
  await loadMessages(store.getters['lang/locale'])
})()

export default i18n

import(/* webpackChunkName: "lang-[request]" */ `~/lang/${locale}`) 是一个 Webpack 异步导入,所以它会在你的主应用程序脚本加载后加载,而不是同时加载。

我会推荐两种解决方案(选择更适合您的一种):

  1. 删除您的 loadMessages 函数并同步加载所有 Json-s。应用程序包会增长(所有翻译都在里面)但它会在应用程序启动时加载它们。
  2. 延迟路由器创建 (router = new Router(...)),直到加载所有语言环境(loadMessages 完成)。