Vue中如何使用i18n實(shí)現(xiàn)國(guó)際化

幾種熱門的框架相匹配的國(guó)際化插件工具绽左。如下:

vue + vue-i18n
angular + angular-translate
react + react-intl
jquery + jquery.i18n.property

一悼嫉、國(guó)際化的實(shí)現(xiàn)

1、首先在自己的項(xiàng)目中安裝 vue-i18n依賴包拼窥。這里使用NPM進(jìn)行安裝戏蔑,如果沒有科學(xué)上網(wǎng)請(qǐng)使用CNPM進(jìn)行安裝。
npm install vue-i18n --save-dev
2鲁纠、將i18n引入vue實(shí)例中总棵,在項(xiàng)目中實(shí)現(xiàn)調(diào)用API和模板語法。現(xiàn)在在main.js中引入 vue-i18n改含。

import VueI18n from 'vue-i18n'        //引入vue-i18n

Vue.use(VueI18n);    //通過插件的形式掛載

/*---------基本使用-----------*/
const i18n = new VueI18n({
locale: 'CN',    // 語言標(biāo)識(shí)
messages : {
 en: {
   message: {
     hello: 'hello world'
   }
 },
 cn: {
   message: {
     hello: '你好情龄、世界'
   }
 }
}
})
/*---------使用語言包-----------*/
const i18n = new VueI18n({
 locale: 'zh',    // 語言標(biāo)識(shí)
 //this.$i18n.locale // 通過切換locale的值來實(shí)現(xiàn)語言切換
 messages: {
   'zh': require('./common/lang/zh'),   // 中文語言包
   'en': require('./common/lang/en')    // 英文語言包
 }
})

/* eslint-disable no-new */
new Vue({
el: '#app',
i18n,        //掛載到實(shí)例,一定得在這個(gè)位置捍壤,而不是comonents中
template: '<App/>',
components: {
 App
}
});

上面的代碼正式將 vue-i18n 引入 vue 項(xiàng)目中骤视,創(chuàng)建一個(gè) i18n 實(shí)例對(duì)象,方便全局調(diào)用鹃觉。我們通過 this.$i18n.locale 來進(jìn)行語言的切換专酗。
3、接下來我們就需要新建兩個(gè)js文件(或者josn文件)作為語言包盗扇。


image.png

其中en.js語言包中代碼為:

module.exports = {
 message: {
   login: 'Login',
   Username: 'Username',
   Password: 'Password',
   Captcha: 'Captcha',
   Language: 'Language',
   zh: 'Chinese',
   en: 'English'
 }
}

其中zh.js語言包中代碼為:

module.exports = {
  message: {
    login: '登錄',
    Username: '用戶名',
    Password: '密碼',
    Captcha: '驗(yàn)證碼',
    Language: '語言',
    zh: '中文',
    en: '英文'
  }
}

最后我們只需要通過觸發(fā)事件的形式祷肯,來控制 locale 的值沉填,去調(diào)用對(duì)應(yīng)的語言包就可以實(shí)現(xiàn)國(guó)際化啦。
4佑笋、組件中觸發(fā)事件切換 locale 的值翼闹,從而實(shí)現(xiàn)語言的切換。template代碼:

<div class="lang">
    <el-radio-group v-model="language" size="mini">
        <el-radio v-for="item of lang" :label="item.value" border>{{item.label}}</el-radio>
    </el-radio-group>
</div>

scrpit代碼:

import Vue from 'vue'

  export default {
    mounted() {
      this.$i18n.locale === 'zh' ? this.language = 0 : this.language = 1   //數(shù)據(jù)加載時(shí)判斷當(dāng)前屬于哪種語言允青,為其單選按鈕賦值
    },
    data() {
      return {
        language: 0,
        lang: [{
          label: this.$t('message.zh'),       //模板語法的一種
          value: 0
        }, {
          label: this.$t('message.en'),
          value: 1
        }],
      }
    },
    watch: {    //偵聽器
      language: function (val) {       //偵聽單選按鈕的變化橄碾,從而進(jìn)行切換語言
        val === 0 ? this.$i18n.locale = 'zh' : this.$i18n.locale = 'en';
        Vue.set(this.lang, 0, {label: this.$t('message.zh'), value: 0});
        Vue.set(this.lang, 1, {label: this.$t('message.en'), value: 1})
        /**
        this.lang: [{
          label: this.$t('message.zh'),       //如果不使用Vue.set,也可以使用更新數(shù)據(jù)的方法
          value: 0
        }, {
          label: this.$t('message.en'),
          value: 1
        }]
        **/
      }
    },
  }

注意:由于 JavaScript 的限制颠锉,Vue 不能檢測(cè)當(dāng)前變動(dòng)的數(shù)組法牲,只渲染一次,如果數(shù)據(jù)不更新視圖就不更新的組件琼掠,如果切換語言則需要更新一下數(shù)據(jù)才能切換組件內(nèi)的多語言拒垃。
二、vue-i18n 數(shù)據(jù)渲染的模板語法
模板語法暫時(shí)分為三種:

//vue組件模板的使用
<div>{{$t('message.zh')}}</div>

//vue組件模板數(shù)據(jù)綁定的使用
<input :placeholder="$t('message.zh')"></input>

//vue組件data中賦值的使用
data:{
   msg:this.$t('message.zh');
}

三瓷蛙、Element UI組件庫與vue-i18n的兼容問題
由于項(xiàng)目中使用了Element UI組件庫悼瓮,它里面內(nèi)置的一些文字也是需要國(guó)際化,好在Element UI是有國(guó)際化的支持艰猬。下面將手動(dòng)設(shè)置內(nèi)容貼出來:

import Vue from 'vue'
import ElementUI from 'element-ui'
import VueI18n from 'vue-i18n'
import enLocale from 'element-ui/lib/locale/lang/en'        //引入Element UI的英文包
import zhLocale from 'element-ui/lib/locale/lang/zh-CN'     //引入Element UI的中文包

Vue.use(VueI18n);
Vue.use(ElementUI, {
  i18n: (key, value) => i18n.t(key, value)
}); //兼容i18n 7.x版本設(shè)置

const i18n = new VueI18n({
  locale: 'zh', // 語言標(biāo)識(shí)
  messages: {
    zh: Object.assign(require('@/components/common/lang/zh'), zhLocale),  //這里需要注意一下横堡,是如何導(dǎo)入多個(gè)語言包的
    en: Object.assign(require('@/components/common/lang/en'), enLocale),
  }
});

可以將element-ui國(guó)際化與i18n合并來寫

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import Cookies from 'js-cookie'
import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang
import enLocale from './en'
import zhLocale from './zh'

Vue.use(VueI18n)
//合并
const messages = {
  en: {
    ...enLocale,
    ...elementEnLocale
  },
  zh: {
    ...zhLocale,
    ...elementZhLocale
  }
}
//獲取cookie中存儲(chǔ)的語言,用來直接設(shè)置i18n語言
export function getLanguage() {
  const chooseLanguage = Cookies.get('backend_lang') === 'zh-CN' ? 'zh' : 'en'
  if (chooseLanguage) return chooseLanguage

  // if has not choose language
  const language = (navigator.language || navigator.browserLanguage).toLowerCase()
  const locales = Object.keys(messages)
  for (const locale of locales) {
    if (language.indexOf(locale) > -1) {
      return locale
    }
  }
  return 'en'
}

const i18n = new VueI18n({
  // set locale
  // options: en | zh | es
  locale: getLanguage(), // 默認(rèn)語言
  // set locale messages
  messages
})

export default i18n

main.js中

Vue.use(ElementUI, {
  i18n: (key, value) => i18n.t(key, value)
})//重點(diǎn):為了實(shí)現(xiàn)element插件的多語言切換
//然后掛載在vue實(shí)例上
new Vue({
  el: '#app',
  router,
  store,
  i18n,
  render: h => h(App)
})

四冠桃、路由名稱國(guó)際化
router.js(路由配置文件)

{
                path: 'pending',
                name: 'Pending',
                component: () =>
                    import ('@/views/demand/pending'),
                 meta: {
                    title: 'route.pendingEnquiry',
                    roles: [2]
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末命贴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子食听,更是在濱河造成了極大的恐慌胸蛛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件樱报,死亡現(xiàn)場(chǎng)離奇詭異葬项,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)迹蛤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門民珍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笤受,你說我怎么就攤上這事穷缤。” “怎么了箩兽?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)章喉。 經(jīng)常有香客問我汗贫,道長(zhǎng)身坐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任落包,我火速辦了婚禮部蛇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咐蝇。我一直安慰自己涯鲁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布有序。 她就那樣靜靜地躺著抹腿,像睡著了一般辽聊。 火紅的嫁衣襯著肌膚如雪钮莲。 梳的紋絲不亂的頭發(fā)上贮尉,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天真慢,我揣著相機(jī)與錄音讽营,去河邊找鬼蜗顽。 笑死坞嘀,一個(gè)胖子當(dāng)著我的面吹牛砚哆,可吹牛的內(nèi)容都是我干的缩膝。 我是一名探鬼主播混狠,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疾层!你這毒婦竟也來了将饺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤云芦,失蹤者是張志新(化名)和其女友劉穎俯逾,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舅逸,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桌肴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琉历。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坠七。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旗笔,靈堂內(nèi)的尸體忽然破棺而出彪置,到底是詐尸還是另有隱情,我是刑警寧澤蝇恶,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布拳魁,位于F島的核電站,受9級(jí)特大地震影響撮弧,放射性物質(zhì)發(fā)生泄漏潘懊。R本人自食惡果不足惜姚糊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望授舟。 院中可真熱鬧救恨,春花似錦、人聲如沸释树。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奢啥。三九已至秸仙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扫尺,已是汗流浹背筋栋。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留正驻,地道東北人弊攘。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像姑曙,于是被迫代替她去往敵國(guó)和親襟交。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容