Vue國際化(不刷新頁面篇)

本文介紹Vue如何作國際化,包括 vue-i18n, element ui 等國際化配置,搭配 vuex, localStorage使用,切換語言無需刷新頁面。

前言

項目基於@vue/cli3腳手架搭建,若是你沒有本身的項目框架,建議使用這個腳手架(傳送門)。有了項目框架後,先安裝Vue國際化組件庫vue-i18n,而後看一下項目結構圖:html


i18n文件夾的標準結構就是這樣,能夠照着在本身的項目中建立好對應的文件。i18n/index.js 是國際化入口配置文件。zh-CN/index.js, en-US/index.js 分別爲中文和英文具體的文案文件,接下來挨個分析。vue

工具方法文件

文件位置: src/util.js 

// 設置localStorage
export const setStorage = function(key, obj) {
    let json = JSON.stringify(obj) window.localStorage.setItem(key, json)
} 

// 獲取localStorage
export const getStorage = function(key) {
    const str = window.localStorage.getItem(key) if (!str) {
        return null
    }
    return JSON.parse(str)
}

// 移除localStorage
export const removeStorage = function(key) {
    window.localStorage.removeItem(key)
}

// 獲取瀏覽器默認語言
export const getBrowserLang = function() {
    let browserLang = navigator.language ? navigator.language: navigator.browserLanguage let defaultBrowserLang = ''
    if (browserLang.toLowerCase() === 'cn' || browserLang.toLowerCase() === 'zh' || browserLang.toLowerCase() === 'zh-cn') {
        defaultBrowserLang = 'zh-CN'
    } else {
        defaultBrowserLang = 'en-US'
    }
    return defaultBrowserLang
}複製代碼

vue-i18n組件庫入口文件配置

文件位置: src/i18n/index.js
使用 localStorage存儲用戶選擇的語言,方便用戶下次進來不用再作切換操做。屬性名爲 'lang',值爲 'zh-CN' 'en-US',分別表明中文、英文。

// 引入必要的庫
import Vue from 'vue'
import VueI18n from 'vue-i18n'
// 引入element ui國際化文件
import elen from 'element-ui/lib/locale/lang/en'
import elcn from 'element-ui/lib/locale/lang/zh-CN'

// 引入工具函數
import { getStorage, removeStorage, getBrowserLang } from '@/util'

// 引入項目中須要用到的中英文文案配置js
import enLocale from './en-US'
import cnLocale from './zh-CN'

// 使用vue-i18n庫
Vue.use(VueI18n)

// 獲取當前語言(初始化時localStorage裏沒有存語言,默認爲瀏覽器當前的語言)
const lang = getStorage('lang') || getBrowserLang()

// 組合element ui 和 項目自身的文案文件
const messages = {
    'en-US': {
        ...elen,
        ...enLocale
    },
    'zh-CN': {
        ...elcn,
        ...cnLocale
    }
}
// 建立vueI18n實例並輸出,在main.js中調用
const i18n = new VueI18n({
    locale: lang,
    messages
})

export default i18n複製代碼
文件位置: src/i18n/zh-CN/index.js

export default {  
    login: {    
        username: '用戶名'  
    }
}複製代碼

文件位置: src/i18n/en-US/index.js

export default {  
    login: {    
        username: 'username'  
    }
}複製代碼

舉個例子在登陸頁面組件中,用戶名字段區分中英文。使用 {{ $t('login.username') }} 替換具體的文案便可。另外在js代碼中經過this.$t('login.username')調用。vuex

<el-form-item>
  {{ $t('login.username') }}<el-input v-model="form.username"></el-input>
</el-form-item>複製代碼

main.js 引入 i18n 配置文件

import i18n from './i18n'

new Vue({
    router,
    i18n,
    store,
    render: h = >h(App)
}).$mount('#app')複製代碼

語言切換組件

文件位置: src/views/component/Lang.vue

<template>
  <div>
    <el-dropdown @command="handleSetLang" trigger="click">
      <div class="lang-active">
        <div v-for="(lang, i) in langs" :key="`LangActive${i}`" v-show="lang.key === activeLang">{{ lang.value }}
          <i class="el-icon-arrow-down el-icon--right"></i></div>
      </div>
      <el-dropdown-menu slot="dropdown">
        <el-dropdown-item v-for="(lang, i) in langs" :key="`Lang${i}`" :command="lang.key">
          <span class="text">{{ lang.value }}</span></el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
  import {
    mapGetters,
    mapMutations
  } from 'vuex';

  export default {
    name: 'Lang',
    components: {},
    data() {
      return {
        langs: [{
          key: 'zh-CN',
          value: '中文'
        },
        {
          key: 'en-US',
          value: 'EngLish'
        },
        ],
      }
    },
    computed: {
      ...mapGetters({
        activeLang: 'language'
      })
    },
    created() {},
    mounted() {},
    methods: {
      ...mapMutations(['setLanguage']),
      handleSetLang(lang) {
        // 設置i18n.locale 組件庫會按照上面的配置使用對應的文案文件
        this.$i18n.locale = lang
        // 提交mutations 
        this.setLanguage(lang)
      }
    }
  }</script> 複製代碼

使用element uidropdown 組件,大體效果以下,樣式可自行調整element-ui


點擊下拉菜單,調用 handleSetLang 方法,設置 this.i18n.locale 。若是 handleSetLang 方法裏只寫這句也能夠實現語言切換效果,不過語言狀態沒有保存,刷新頁面會重置到初始語言,這樣確定不是咱們想要的。所以須要結合 localStoragevuex。若是對vuex不熟悉,能夠先去官方文檔學習一下。若是你的項目沒有用到vuex,也能夠只使用 localStorage 經過刷新頁面來更新視圖。代碼以下:json

handleSetLang(lang) {
    // 設置 i18n.locale
    this.$i18n.locale = lang 
    // 使用 localStorage 存儲語言狀態
    setStorage('lang', lang)
    // 刷新頁面更新視圖
    window.location.reload()
}複製代碼

vuex相關配置

文件位置: src/store/index.js 建一個 language 模塊,用來響應式更新語言。

import Vue from 'vue'
import Vuex from 'vuex'
import language from './modules/language'

Vue.use(Vuex) 

export default new Vuex.Store({
    modules: {
        language
    }
})複製代碼

文件位置:src/store/language.js

import {
    getStorage,
    setStorage,
    getBrowserLang
}
from '@/util'

export default {
    state: {
	language: getStorage('lang') || getBrowserLang() // 項目初始化時,默認爲瀏覽器的語言
    },
    getters: {
        language: state = > state.language
    },
    mutations: {
	setLanguage: (state, language) = > {
	    state.language = language 
            setStorage('lang', language)
        },
    }
}複製代碼

總結

使用 vue-i18n 組件庫,在語言切換組件中設置 this.$i18n.locale ,vue-i18n 會根據配置文件使用對應的中英文文案文件。配合 localStorage 和 vuex 作到存儲用戶語言設置並動態更新,無需刷新頁面。瀏覽器

相關文章
相關標籤/搜索