我們公司之前老項目開發(fā)時候用中文嚣艇,上線就手動改為英文并巍,十分之麻煩,然后重新做了前后端分離版本的就想著弄個語言切換這樣開發(fā)時候我也能方便蜕企,上線也不至于一個個修改,本著這樣目的做了國際化處理(中間含遇錯及修改)冠句。
技術(shù)棧主要是vue轻掩,選的語言工具依賴包是vue-i18n
- 首先,安裝vue-I18n
npm install vue-i18n -save
- 接著在vue項目src文件夾下新建一個 i18n 文件夾存放i18n要用的文件
//index.js
import VueI18n from "vue-i18n"; //引入vue-i18n
import enLang from "element-ui/lib/locale/lang/en"; // 英文
import zhLang from "element-ui/lib/locale/lang/zh-CN"; // 中文
import ptLang from "element-ui/lib/locale/lang/pt"; // 葡萄牙語
import Vue from "vue";
Vue.use(VueI18n);
let locale;
localStorage.getItem("lang")
? (locale = localStorage.getItem("lang"))
: (locale = "zh");
const i18n = new VueI18n({
locale, // 語言標(biāo)識
messages: {
zh: Object.assign(require("./lang/zh"), zhLang), // 中文語言包
en: Object.assign(require("./lang/en"), enLang), // 英文語言包
pt: Object.assign(require("./lang/pt"), ptLang), // 葡萄牙語言包
},
});
export default i18n;
//lang/en.js
module.exports = {
//登錄頁面所需數(shù)據(jù)
login: {
username: "username",
password: "password",
},
moreActions: {
tit: "More actions",
closeOther: "Close other",
closeLeft: "Close left",
closeRight: "Close right",
closeAll: "Close all",
},
};
//lang/zh.js
module.exports = {
//登錄頁面所需數(shù)據(jù)
login: {
username: "用戶名",
password: "密碼",
},
moreActions: {
tit: "更多操作",
closeOther: "關(guān)閉其他",
closeLeft: "關(guān)閉左側(cè)",
closeRight: "關(guān)閉右側(cè)",
closeAll: "全部關(guān)閉",
},
};
其實也可以寫json唇牧,不過json的注釋方式我不喜歡我就用了js,大家根據(jù)自己需求來定即可聚唐。
- 然后main.js引入
import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import i18n from "./i18n"; //引入i18n
import "./plugins";
Vue.config.productionTip = false;
new Vue({
router,
i18n,
store,
render: (h) => h(App),
}).$mount("#app");
運行報錯:
出現(xiàn)這種情況是由于vue-cli和i18n版本不匹配導(dǎo)致的丐重,檢查發(fā)現(xiàn)此時安裝的i18n版本為9.1.10
后將其改為8.x,刷新杆查,原先錯誤消失扮惦,又有個新的報錯
文件查找不到,檢查發(fā)現(xiàn)是我vue.config.js多寫了個打包亲桦,刪掉后重新運行崖蜜,錯誤消失。
- 接著配置Element 國際化客峭,我這個項目是把Element單獨寫的文件豫领,沒有在入口文件編寫,大家根據(jù)個人實際情況編寫即可
import Vue from "vue";
import i18n from "../i18n"; //引入i18n
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/display.css";
import "@/styles/element-variables.scss";
Vue.use(ElementUI, {
i18n: (key, value) => i18n.t(key, value),
size: "small",
});
此時控制臺出現(xiàn)警告??
在i18n配置文件中設(shè)置:
silentTranslationWarn: true
(去除國際化警告)舔琅,OK等恐,警告消失。
但是上面的那些我們都是配置搏明,如果沒有切換/選擇語言那我們做的這些其實也沒多大意義鼠锈。沒有操作何來執(zhí)行呢對吧
<template>
<el-dropdown @command="handleCommand">
<span class="el-dropdown-link">
{{ language }}<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="zh">中文</el-dropdown-item>
<el-dropdown-item command="en">English</el-dropdown-item>
<el-dropdown-item command="pt">Portuguese</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
const localeLang = new Map([
["zh", "中文"],
["en", "English"],
["pt", "Portuguese"],
]);
export default {
name: "ChannelSelected",
data() {
return {
language: "",
};
},
methods: {
// 根據(jù)下拉框的中被選中的值切換語言
handleCommand(command) {
this.language = localeLang.get(command);
this.$i18n.locale = command;
window.localStorage.setItem("lang", command);
window.location.reload();
},
},
created() {
this.language = localeLang.get(this.$i18n.locale);
},
};
</script>
<style lang="scss">
.el-dropdown-link {
margin-right: 15px;
&:hover {
cursor: pointer;
}
}
</style>
vue-i18n 數(shù)據(jù)渲染的模板語法:
//vue組件模板的使用
<div>{{$t("moreActions.tit")}}</div>
//vue組件模板數(shù)據(jù)綁定的使用
<input :placeholder="$t('moreActions.tit')"></input>
//vue組件data中賦值的使用
data:{
tit:this.$t("moreActions.tit");
}