vue+Element+vue-i18n實現國際化

我們公司之前老項目開發時候用中文,上線就手動改為英文,十分之麻煩,然后重新做了前后端分離版本的就想著弄個語言切換這樣開發時候我也能方便,上線也不至于一個個修改,本著這樣目的做了國際化處理(中間含遇錯及修改)。
技術棧主要是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, // 語言標識
  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 = {
  //登錄頁面所需數據
  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 = {
  //登錄頁面所需數據
  login: {
    username: "用戶名",
    password: "密碼",
  },
  moreActions: {
    tit: "更多操作",
    closeOther: "關閉其他",
    closeLeft: "關閉左側",
    closeRight: "關閉右側",
    closeAll: "全部關閉",
  },
};

其實也可以寫json,不過json的注釋方式我不喜歡我就用了js,大家根據自己需求來定即可。

  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

出現這種情況是由于vue-cli和i18n版本不匹配導致的,檢查發現此時安裝的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'}
文件查找不到,檢查發現是我vue.config.js多寫了個打包,刪掉后重新運行,錯誤消失。

  1. 接著配置Element 國際化,我這個項目是把Element單獨寫的文件,沒有在入口文件編寫,大家根據個人實際情況編寫即可
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",
});

此時控制臺出現警告??
\color{#5B3B01} {Value\ of\ key\ 'el.xx.xx'\ is\ not\ a \ string\ or\ function\ ! }

warn.png

在i18n配置文件中設置:silentTranslationWarn: true(去除國際化警告),OK,警告消失。

但是上面的那些我們都是配置,如果沒有切換/選擇語言那我們做的這些其實也沒多大意義。沒有操作何來執行呢對吧

<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: {
    // 根據下拉框的中被選中的值切換語言
    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 數據渲染的模板語法:

//vue組件模板的使用
<div>{{$t("moreActions.tit")}}</div>

//vue組件模板數據綁定的使用
<input :placeholder="$t('moreActions.tit')"></input>

//vue組件data中賦值的使用
data:{
   tit:this.$t("moreActions.tit");
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容