我們開發的系統,一般可以不用考慮語言國際化的問題,大多數系統一般是給本國人使用的,而且直接使用中文開發界面會更加迅速 一些,不過框架最好能夠支持國際化的處理,以便在需要的時候,可以花點時間來實現多語言切換的處理,使系統具有更廣泛的受眾用戶。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)--- 樹列表組件的使用
循序漸進VUE+Element 前端應用開發(9)--- 界面語言國際化的處理
循序漸進VUE+Element 前端應用開發(10)--- 基於vue-echarts處理各種圖表展示
循序漸進VUE+Element 前端應用開發(11)--- 圖標的維護和使用
循序漸進VUE+Element 前端應用開發(12)--- 整合ABP框架的前端登錄處理
循序漸進VUE+Element 前端應用開發(13)--- 前端API接口的封裝處理
循序漸進VUE+Element 前端應用開發(14)--- 根據ABP后端接口實現前端界面展示
循序漸進VUE+Element 前端應用開發(15)--- 用戶管理模塊的處理
循序漸進VUE+Element 前端應用開發(16)--- 組織機構和角色管理模塊的處理
循序漸進VUE+Element 前端應用開發(17)--- 菜單管理
循序漸進VUE+Element 前端應用開發(18)--- 功能點管理及權限控制
循序漸進VUE+Element 前端應用開發(19)--- 后端查詢接口和Vue前端的整合
使用代碼生成工具快速生成基於ABP框架的Vue+Element的前端界面
循序漸進VUE+Element 前端應用開發(20)--- 使用組件封裝簡化界面代碼
循序漸進VUE+Element 前端應用開發(21)--- 省市區縣聯動處理的組件使用
循序漸進VUE+Element 前端應用開發(22)--- 簡化main.js處理代碼,抽取過濾器、全局界面函數、組件注冊等處理邏輯到不同的文件中
循序漸進VUE+Element 前端應用開發(23)--- 基於ABP實現前后端的附件上傳,圖片或者附件展示管理
循序漸進VUE+Element 前端應用開發(24)--- 修改密碼的前端界面和ABP后端設置處理
循序漸進VUE+Element 前端應用開發(25)--- 各種界面組件的使用(1)
循序漸進VUE+Element 前端應用開發(26)--- 各種界面組件的使用(2)
循序漸進VUE+Element 前端應用開發(27)--- 數據表的動態表單設計和數據存儲
循序漸進VUE+Element 前端應用開發(28)--- 附件內容的管理
循序漸進VUE+Element 前端應用開發(29)--- 高級查詢條件的界面設計
部署基於.netcore5.0的ABP框架后台Api服務端,以及使用Nginx部署Vue+Element前端應用
循序漸進VUE+Element 前端應用開發(30)--- ABP后端和Vue+Element前端結合的分頁排序處理
循序漸進VUE+Element 前端應用開發(31)--- 系統的日志管理,包括登錄日志、接口訪問日志、實體變化歷史日志
循序漸進VUE+Element 前端應用開發(32)--- 手機短信動態碼登陸處理
循序漸進VUE+Element 前端應用開發(33)--- 郵件參數配置和模板郵件發送處理
使用Vue-TreeSelect組件實現公司-部門-人員級聯下拉列表的處理
使用Vue-TreeSelect組件的時候,用watch變量方式解決彈出編輯對話框界面無法觸發更新的問題