1. 程式人生 > >利用vue-i18n實現多語言切換

利用vue-i18n實現多語言切換

在angular中有ngx-translate解決i18n的需求,vue也具備這樣的能力,利用vue-i18n,我們可以實現多語言的切換,可以輕鬆搞定大部分的需求,包括中英文切換,以及詞條的變更。詞條變更在基線版本真的是經常會遇到的,本人深有體會。不扯淡了,說一下vue-i18n基本的使用方法吧。

安裝vue-i18n

npm install vue-i18n --save

main.js中引用

import VueI18n from 'vue-i18n'

Vue.use(VueI18n)

const i18n = new VueI18n({
	locale: 'zh',
	messages: {
		'zh': require('../static/lang/zh'),
		'en': require('../static/lang/en')
	}
})

new Vue({
    el: '#app',
    router,
    store,
    i18n,
    components: { App },
    template: '<App/>'
  })

當然,我們還要新建兩個詞條檔案static/lang/zh.js和static/lang/en.js

// zh.js
module.exports = {
    helloworld: '你好,世界',
    helloman: '你好,{name}',
    iphones: '蘋果5 | 蘋果6 | 蘋果7'
}
// en.js
module.exports = {
    helloworld: 'hello world',
    helloman: 'hello {name}',
    iphones: 'iphone5 | iphone6 | iphone7'
}

模板中使用詞條

普通詞條

插值表示式中向$t方法傳入詞條的key值就可以了,是不是超級簡單

<div>普通文字:{{$t('helloworld')}}</div>

帶引數詞條

帶引數詞條也有幾種寫法,分別有命名式,列表式,ruby on rail式。

命名式

在詞條中指定命名引數,引數由花括號包裹,如:

// 定義詞條
helloman: 'hello {name}'

模板引用詞條時,$t方法可以接收傳入兩個引數,第一個入參為詞條key值,第二個入參是詞條引數的key-value鍵值對。

// 引用詞條
<div>{{$t('helloman', {name: 'Tom'})}}</div>

列表式

列表式其實與陣列的概念一致。詞條定義時,通過陣列下標鑑別接收的引數。

// 定義詞條
helloman: 'hello {0}'

模板中,則將物件改由陣列傳入

// 引用詞條
<div>{{$t('helloman', [‘Tom’])}}</div>
// 還可以這樣,用array-like object的形式傳入。
<div>{{$t('helloman', {'0': 'Tom'})}}</div>

ruby on rails i18n format

與命名式方法是類似的,定義詞條略有不同

// 定義詞條
helloman: 'hello %{name}'

而模板上引用詞條的方式是一樣的,用key-value的方式傳入。

多元化

一個詞條的key值可以對應多個value資訊,此時可以通過vue-i18n的管道pipe來實現。

例如:

iphones: '{n} iphone5 | iphone6 | iphone7'

這裡定義了三個value,第一個value還是帶引數的。

在模板上的呼叫方式也有了不同,需要用$tc方法來引用詞條。

<div>Pluralization:{{$tc('iphones', 0, {n: '3臺'})}}</div>
// 輸出 Pluralization:3臺 iphone5
<div>Pluralization:{{$tc('iphones', 1)}}</div>
// 輸出 Pluralization:iphone6

語言切換

基本用法

完成了詞條到介面上的渲染,我們還需要做到語言上的實時切換。我們在new VueI18n時傳入了locale的值,作為初始化指定的語言,而切換語言也很簡單,只要改變其值就好。

// 切換成英文
this.$i18n.locale = 'en'

判斷瀏覽器語言和儲存使用者設定

一個常見的需求是:網站語言預設以瀏覽器語言為準,當用戶進行了主動修改時,以使用者的個性化選擇為優先。

其實實現起來也不是那麼難。且看:

獲取瀏覽器語言

首先,我們獲取瀏覽器語言

const NavigatorLang = (navigator.language || navigator.userLanguage).substr(0, 2)

利用vuex管理語言

我們利用vuex來儲存語言。當用戶未做選擇時,儲存的即是瀏覽器語言;當用戶選擇後,我會將所選語言存在localStorage,同時通過commit更新state的狀態。

// vuex配置
const store = new Vuex.Store({
  state: {
    currentLang: localStorage.getItem('UserLang') || NavigatorLang
  },
  mutations: {
    updateLang(state, value) {
      state.currentLang = value
      localStorage.setItem('UserLang', state.currentLang)
    }
  }
})

完成state及mutations的相關設定後,我們接著在 new VueI18n 時傳入存在vuex中的語言。

const i18n = new VueI18n({
  locale: store.state.currentLang,
  messages: {
    'zh': require('../static/lang/zh'),
    'en': require('../static/lang/en')
  }
})

最後 new Vue() 時傳入i18n即可。

在這裡插入圖片描述