主要由如下几个模块组成由 :vue
nuxt.config.js
locales/index.js
locales/zh_CN.json
utils/config.js
nuxt.config.js
module.exports = { // other code ... plugins: [ { src: '~/locales/index.js' } // locales 目录没有放置在 plugins 目录下主要是为了引用 json 文件方便 ], // other code ... }
locales/index.js
从 Nuxt.js 应用国际化(i18n)的示例 变化而来 :
import Cookies from 'js-cookie' import VueI18n from 'vue-i18n' import Vue from 'vue' Vue.use(VueI18n) export default ({ app, store }) => { const data = {} const locale = Cookies.get('hb_lang') || 'en_US' const readDir = ['en_US', 'zh_CN', 'th_TH'] for (let i = 0; i < readDir.length; i++) { data[readDir[i]] = Object.assign({}, require(`./${readDir[i]}.json`)) } // Set i18n instance on app // This way we can use it in middleware and pages asyncData/fetch app.i18n = new VueI18n({ locale, fallbackLocale: locale, // 语言环境中不存在相应massage键时回退到指定语言 messages: data }) }
locales/zh_CN.json
{ "solutions":"解决方案", "global":{ "login":"登陆", "register":"注册", "logout":"注销", "join":"加入", "confirm":"确认", "submit":"提交", "reset":"重置", "all":"所有", "open":"打开", "close":"关闭", "userList": "用户列表" }, "headerNav": { "home": "首页", "users":"用户" }, "login": { "username": "用户名", "password": "密码" }, "footer": { "TermsOfUse": "使用条款", "PrivacyPolicy": "隐私保护" } }
调用方法 : <h1 class="solutions">{{ $t('solutions') }}</h1>
json
utils/config.js
import Cookies from 'js-cookie' const LangKey = 'hb_lang' // 语言 export function getLanguage() { return Cookies.get(LangKey) } export function setLanguage(data) { return Cookies.set(LangKey, data) } export function removeLanguage() { return Cookies.remove(LangKey) }
其中 , 当须要动态切换语言时,调用 setLanguage 方法便可, 例如:segmentfault
import { setLanguage } from '~/utils/config.js' setLanguage('en_US')
以上配置须臾结合 Vue
的 {{}}
进行编辑, 例如上文所提到的 : <h1 class="solutions">{{ $t('solutions') }}</h1>
cookie
假若像下面这样则会致使切换语言时, 没法动态即时更新文案 :app
// 不要这样写, 解决方法在下面 <template> <div> <div class="solutions">{{ solutions }}</div> </div> </template> <script> export default { data() { return { solutions : this.$t('solutions') } } } </script>
解决方法 :async
<template> <div> <div class="solutions">{{ solutions }}</div> </div> </template> <script> export default { watch: { '$store.state.lang'(language) { this.init() } }, data() { return { solutions : this.$t('solutions') } }, created() { this.init() }, methods: { init(){ this.solutions = this.$t('solutions') } }, } </script>