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

一淫半、前言

項(xiàng)目中需要實(shí)現(xiàn)多語言切換,這時(shí)候接觸到國際化帅矗,前端框架無數(shù)偎肃,其中幾種熱門的框架都有相匹配的國際化插件工具。例如:

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

二浑此、國際化的實(shí)現(xiàn)

這里來對(duì)vue使用vue-i18n這個(gè)插件進(jìn)行國際化功能的實(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)國際化啦。

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 不能檢測當(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)置的一些文字也是需要國際化衰琐,好在Element UI是有國際化的支持。但是Element UI默認(rèn)只兼容vue-i18n的5.x版本际插,而現(xiàn)在vue-i18n的版本已經(jīng)到了7.x,Element UI官方文檔中“國際化”一節(jié)中對(duì)此有具體說明显设。下面將手動(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),
  }
});

注意:關(guān)于導(dǎo)入多個(gè)語言包時(shí)遇到的問題,我是在Element UI 國際化文檔中發(fā)現(xiàn)的解決辦法捕捂。

五瑟枫、路由與面包屑導(dǎo)航國際化的語法問題
在對(duì)面包屑導(dǎo)航進(jìn)行國際化時(shí)不知道如何進(jìn)行。在網(wǎng)上翻閱了一些資料指攒,得到如下代碼慷妙,完美解決問題:
router.js(路由配置文件)

{
  path: '/index',
  name: 'nav.Home',       //直接點(diǎn)出對(duì)應(yīng)的文字
  component: (resolve) => require(['@/components/index'], resolve)
}

Breadcrumb.vue(面包屑導(dǎo)航組件)

<div id="Breadcrumb">
   <el-breadcrumb separator-class="el-icon-arrow-right">
     <el-breadcrumb-item :to="{ path: '/index' }">{{$t('nav.Home')}}</el-breadcrumb-item>
       /*注意{{$t(item.name)}}*/
     <el-breadcrumb-item v-for="item in $route.matched" :to="{ path: item.path}">{{$t(item.name)}}</el-breadcrumb-item>
   </el-breadcrumb>
 </div>

至此,國際化的坑算是踩完了允悦。

文章借鑒自:https://segmentfault.com/a/1190000016445415#item-1-1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膝擂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子隙弛,更是在濱河造成了極大的恐慌架馋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件全闷,死亡現(xiàn)場離奇詭異叉寂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)总珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門屏鳍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人局服,你說我怎么就攤上這事钓瞭。” “怎么了淫奔?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵降淮,是天一觀的道長。 經(jīng)常有香客問我,道長佳鳖,這世上最難降的妖魔是什么霍殴? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮系吩,結(jié)果婚禮上来庭,老公的妹妹穿的比我還像新娘。我一直安慰自己穿挨,他們只是感情好月弛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著科盛,像睡著了一般帽衙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞绵,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天厉萝,我揣著相機(jī)與錄音,去河邊找鬼榨崩。 笑死谴垫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的母蛛。 我是一名探鬼主播翩剪,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彩郊!你這毒婦竟也來了前弯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤秫逝,失蹤者是張志新(化名)和其女友劉穎博杖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筷登,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剃根,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前方。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狈醉。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惠险,靈堂內(nèi)的尸體忽然破棺而出苗傅,到底是詐尸還是另有隱情,我是刑警寧澤班巩,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布渣慕,位于F島的核電站嘶炭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逊桦。R本人自食惡果不足惜眨猎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望强经。 院中可真熱鬧睡陪,春花似錦、人聲如沸匿情。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炬称。三九已至汁果,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玲躯,已是汗流浹背据德。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留府蔗,地道東北人晋控。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓汞窗,卻偏偏與公主長得像姓赤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仲吏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355