1. 程式人生 > >循序漸進VUE+Element 前端應用開發(9)--- 介面語言國際化的處理

循序漸進VUE+Element 前端應用開發(9)--- 介面語言國際化的處理

我們開發的系統,一般可以不用考慮語言國際化的問題,大多數系統一般是給本國人使用的,而且直接使用中文開發介面會更加迅速 一些,不過框架最好能夠支援國際化的處理,以便在需要的時候,可以花點時間來實現多語言切換的處理,使系統具有更廣泛的受眾使用者。VUE+Element 前端應用實現國際化的處理還是非常方便的,一般在Main.js函式裡面引入語言檔案,然後在介面上進行一定的處理,把對應的鍵值轉換為對應語言的語義即可。本篇隨筆介紹在VUE+Element 前端應用中如何實現在介面快速的支援多語言國際化的處理邏輯程式碼。

1、main入口函式支援

Element 元件內部預設使用中文,若希望使用其他語言,則需要進行多語言設定。以英文為例,在 main.js 中:

// 完整引入 Element
import Vue from 'vue'
import ElementUI from 'element-ui'
import locale from 'element-ui/lib/locale/lang/en'

Vue.use(ElementUI, { locale })

由於我們現在是需要處理多語言的切換,那麼,我們在src下面的一個目錄裡面建立一個lang目錄,在其中裡面編輯zh.js和en.js分別代表中英文語言對照資訊,index.js檔案則為引入這兩個檔案的處理關係。

  在index.js裡面,需要設定一個函式,用來獲取Cookie裡面儲存的語言,如果沒有找到,以瀏覽器國際化語言為準,如下程式碼所示。

export function getLanguage() {
  const chooseLanguage = Cookies.get('language')
  if (chooseLanguage) return chooseLanguage

  // 如果沒有選擇語言,那麼使用瀏覽器語言
  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 locales = Object.keys(messages)

是獲取message物件裡面的鍵,如下所示。

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
  }
}

其中message就是一個兩個語言(en/zh)字典下的對照表,包含各自對應鍵值下的內容。

然後整個index.js檔案就是公佈對應的多語言處理介面和屬性。

const i18n = new VueI18n({
  locale: getLanguage(),
  messages
})

export default i18n

然後在main.js函式裡面處理國際化的處理即可

Vue.use(ElementUI, {
  size: Cookies.get('size') || 'medium', // set element-ui default size
  i18n: (key, value) => i18n.t(key, value) })

new Vue({
  el: '#app',
  router,
  store,
  i18n,
  render: h => h(App)
})

有了這些準備,那麼我們在介面上就可以呼叫對應的鍵來獲取對應語言的語義了,

2、介面處理實現

首先,我們編輯一下對應國際化的鍵值內容,例如中文參照如下所示。

  例如對應登入介面上,介面效果如下所示。

  或者

 其中裡面的文字內容,我們都是以國際化處理內容。

如登陸表單裡面的程式碼如下所示。

        <el-form ref="loginForm" :model="loginForm" :rules="rules" class="loginForm">
          <el-form-item prop="username" class="login-item">
            <el-input
              v-model="loginForm.username"
              class="area"
              type="text"
              :placeholder="$t('login.username')"
              prefix-icon="el-icon-user-solid"
              @keyup.enter.native="submitForm('loginForm')"
            />
          </el-form-item>
          <el-form-item prop="password" class="login-item">
            <el-input
              v-model="loginForm.password"
              class="area"
              type="password"
              :placeholder="$t('login.password')"
              prefix-icon="el-icon-lock"
              @keyup.enter.native="submitForm('loginForm')"
            />
          </el-form-item>

          <el-form-item>
            <el-button :loading="loading" type="primary" class="submit_btn" @click="submitForm('loginForm')">{{ $t('login.logIn') }}</el-button>
          </el-form-item>
          <div class="tiparea">
            <span style="margin-right:20px;">{{ $t('login.username') }} : admin</span>
            <span> {{ $t('login.password') }} : {{ $t('login.any') }}</span>
          </div>
        </el-form>

我們多處採用了類似 $t('login.username') 的函式處理方式來動態獲取對應語言的內容即可,其中$t()函式裡面就是對應的語義解析的鍵引數,對應我們lang/zh.js裡面或者lang/en.js裡面的內容即可。

其中多語言切換的時候,單擊圖示就可以切換為其他語言內容了。

  切換英文後介面如下所示

 同樣,其他地方,如果需要切換多語言的國際化處理,也可以使用$t的轉義方式,在頂部導航欄裡面,我們可以設定得到多語言支援的介面。

 中文介面提示如下所示。

 這部分的實現程式碼是在元件模組裡面,一樣可以實現國際化的處理的。

  <template v-if="device!=='mobile'">
    <search id="header-search" class="right-menu-item" />
    <error-log class="errLog-container right-menu-item hover-effect" />
    <el-tooltip :content="$t('navbar.fullscreen')" effect="dark" placement="bottom">
      <screenfull id="screenfull" class="right-menu-item hover-effect" />
    </el-tooltip>
    <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom">
      <size-select id="size-select" class="right-menu-item hover-effect" />
    </el-tooltip>
    <el-tooltip :content="$t('navbar.language')" effect="dark" placement="bottom">
      <lang-select class="right-menu-item hover-effect" />
    </el-tooltip>
  </template>

 

列出以下前面幾篇隨筆的連線,供參考:

循序漸進VUE+Element 前端應用開發(1)--- 開發環境的準備工作

循序漸進VUE+Element 前端應用開發(2)--- Vuex中的API、Store和View的使用

循序漸進VUE+Element 前端應用開發(3)--- 動態選單和路由的關聯處理

循序漸進VUE+Element 前端應用開發(4)--- 獲取後端資料及產品資訊頁面的處理

循序漸進VUE+Element 前端應用開發(5)--- 表格列表頁面的查詢,列表展示和欄位轉義處理

循序漸進VUE+Element 前端應用開發(6)--- 常規Element 介面元件的使用

循序漸進VUE+Element 前端應用開發(7)--- 介紹一些常規的JS處理函式

循序漸進VUE+Element 前端應用開發(8)--- 樹列表元件的