javascript - Vue.js 中的国际化使用 vue-i18n 从 API 服务器获取 JSON 对象

标签 javascript vue.js internationalization vuex vue-i18n

现在我正在使用 Vue.js 构建一个支持多种语言的应用程序。 我使用 https://kazupon.github.io/vue-i18n 实现了国际化.

我想将 i18n 中的获取消息部分从项目中的静态 JSON 文件更改为 API 调用结果(axios、ajax、Vuex ...等)。

如何从API服务器获取JSON消息文件并支持动态多语言服务?

有什么想法吗? 提前致谢!

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import EN from '@/COMMON/i18n/en.json'
import KO from '@/COMMON/i18n/ko.json'
import store from '@/COMMON/store/store'

Vue.use(VueI18n)


const i18n = new VueI18n({
    locale: sessionStorage.LANG_CD,
    fallbackLocale: 'ko',
    silentTranslationWarn: true,
    messages: {
        en: EN,
        ko: KO
        // option 1. ko: axios ... some code 
        // option 2. ko: store.getters ... some code
    },
  });

export default {
    i18n
}

最佳答案

请参阅Lazy loading translations .

在文档中,它使用动态导入来导入新的翻译文件。您可以从那里修改为您的 API 调用。

例子:

// i18n-setup.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import axios from 'axios'

Vue.use(VueI18n)

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

const loadedLanguages = []

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

export function loadLanguageAsync (lang) {
  if (loadedLanguages.includes(lang)) {
    if (i18n.locale !== lang) setI18nLanguage(lang)
    return Promise.resolve()
  }
  return axios.get(`/api/lang/${lang}`).then(response => {
    let msgs = response.data
    loadedLanguages.push(lang)
    i18n.setLocaleMessage(lang, msgs.default)
    setI18nLanguage(lang)
  })
}

// router.js
router.beforeEach((to, from, next) => {
  const lang = to.params.lang
  loadLanguageAsync(lang).then(() => next())
})

关于javascript - Vue.js 中的国际化使用 vue-i18n 从 API 服务器获取 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55722512/

相关文章:

javascript - 跨不同范围访问函数

javascript - Ctrl-Z/Y 使浏览器聚焦于最近更改的输入

javascript - “窗口”未在 Vue.js 2 中定义

jquery - 在 vue 2 中单击外部后隐藏元素

vue.js - 属性 'renderChart' 在类型 'LineChartComponent' 上不存在

python - Django 翻译转义 % 符号

javascript - XMLHttpRequest 泄漏

javascript - 在 Java 中将用户输入评估为 JavaScript 时的安全风险

.net - .NET 中文本文件资源的本地化

angularjs - Angular CLI + Webpack + i18n 模块集成