vue+Element+vue-i18n實現(xiàn)國際化

我們公司之前老項目開發(fā)時候用中文嚣艇,上線就手動改為英文并巍,十分之麻煩,然后重新做了前后端分離版本的就想著弄個語言切換這樣開發(fā)時候我也能方便蜕企,上線也不至于一個個修改,本著這樣目的做了國際化處理(中間含遇錯及修改)冠句。
技術(shù)棧主要是vue轻掩,選的語言工具依賴包是vue-i18n

  1. 首先,安裝vue-I18n
npm install vue-i18n -save
  1. 接著在vue項目src文件夾下新建一個 i18n 文件夾存放i18n要用的文件
    i18n.png

    \color{#0580CF} {lang文件夾里存放需要的語言包懦底,index.js文件配置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ù)自己需求來定即可聚唐。

  1. 然后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");

運行報錯:
\color{red} {Uncaught TypeError: Cannot read properties of undefined(reading 'install')}

i18n_error.png

出現(xiàn)這種情況是由于vue-cli和i18n版本不匹配導(dǎo)致的丐重,檢查發(fā)現(xiàn)此時安裝的i18n版本為9.1.10
edition.png

后將其改為8.x,刷新杆查,原先錯誤消失扮惦,又有個新的報錯
\color{red} {no\ such\ file\ or\ directory, open\ '/node\_modules/vue-i18n/dist/vue-i18n.esm-bundler.js'}
文件查找不到,檢查發(fā)現(xiàn)是我vue.config.js多寫了個打包亲桦,刪掉后重新運行崖蜜,錯誤消失。

  1. 接著配置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)警告??
\color{#5B3B01} {Value\ of\ key\ 'el.xx.xx'\ is\ not\ a \ string\ or\ function\ ! }

warn.png

在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");
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闪檬,一起剝皮案震驚了整個濱河市星著,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粗悯,老刑警劉巖虚循,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡横缔,警方通過查閱死者的電腦和手機铺遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茎刚,“玉大人襟锐,你說我怎么就攤上這事√哦В” “怎么了粮坞?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長初狰。 經(jīng)常有香客問我莫杈,道長,這世上最難降的妖魔是什么奢入? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任筝闹,我火速辦了婚禮,結(jié)果婚禮上腥光,老公的妹妹穿的比我還像新娘关顷。我一直安慰自己,他們只是感情好武福,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布解寝。 她就那樣靜靜地躺著,像睡著了一般艘儒。 火紅的嫁衣襯著肌膚如雪聋伦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天界睁,我揣著相機與錄音觉增,去河邊找鬼。 笑死翻斟,一個胖子當(dāng)著我的面吹牛逾礁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播访惜,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼嘹履,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了债热?” 一聲冷哼從身側(cè)響起砾嫉,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窒篱,沒想到半個月后焕刮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舶沿,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年配并,在試婚紗的時候發(fā)現(xiàn)自己被綠了括荡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡溉旋,死狀恐怖畸冲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情观腊,我是刑警寧澤召夹,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站恕沫,受9級特大地震影響监憎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婶溯,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一鲸阔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迄委,春花似錦褐筛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至信轿,卻和暖如春晃痴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背财忽。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工倘核, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人即彪。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓紧唱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親隶校。 傳聞我的和親對象是個殘疾皇子漏益,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容