vue項目使用vue-i18n和iView切換多語言

效果圖:css

固然,若是使用iview組件,組件也會對應切換語言。vue

這裏,假設已經用vue-cli腳手架建立了項目,熟悉vue-router,並且已經引入了iview UI。ios

第一步:vue-router

咱們在main.js引入vue-i18nvue-cli

import VueI18n from "vue-i18n";

在main.js目錄下新建一個language文件夾,裏面分別新建3個文件en-US.js、zh-CN.js、zh-TW.js文件,來存放不一樣語言的文字。分別加入以下代碼:app

en-US.jsiview

module.exports = {
  venueTemperature: "Venue Temperature",
  venueHumidity: "Venue Humidity",
  outdoorTemperature: "Outdoor Temperature",
  outdoorHumidity: "Outdoor Humidity"
};

zh-CN.jside

module.exports = {
  venueTemperature: "場館溫度",
  venueHumidity: "場館溼度",
  outdoorTemperature: "室外溫度",
  outdoorHumidity: "室外溼度"
};

zh-TW.jsthis

module.exports = {
  venueTemperature: "場館溫度",
  venueHumidity: "場館濕度",
  outdoorTemperature: "室外溫度",
  outdoorHumidity: "室外濕度"
};

第二步:spa

根據iview官網的國際化示例,咱們引入iview的語言包(前3個文件)。

在main.js文件裏面繼續引入本身寫的語言包(後3個)

import zhLocale from "iview/src/locale/lang/zh-CN";
import enLocale from "iview/src/locale/lang/en-US";
import twLocale from "iview/src/locale/lang/zh-TW";

import cn from "./language/zh-CN";
import tw from "./language/zh-TW";
import us from "./language/en-US";

第三步:

繼續在main.js文件裏面使用vue-i18n

Vue.use(VueI18n);
Vue.locale = () => {};

第四步:

把本身寫的語言包和iview的語言包合併,這裏使用Object.assign()。由於在改變咱們本身寫的語言包的時候,也同時要改變iview組件的語言。

message就是合併後的語言包對象,而後傳進VueI18n中,最後在Vue中引用。

這裏還用本地存儲記錄當前選中的語言是哪種。

其中,'zh', 'en', 'tc',是咱們本身定義的key值,locale接收到哪一個就顯示對應哪一種語言。

const messages = {
  zh: Object.assign(cn, zhLocale),
  en: Object.assign(us, enLocale),
  tc: Object.assign(tw, twLocale)
};

// 設置參數,建立 Vuei18n 的實例。
const i18n = new VueI18n({
  locale: localStorage.getItem("language") || "zh", // set locale
  messages // set locale messages
});

new Vue({
  el: "#app",
  router,
  i18n,
  components: { App },
  template: "<App/>"
});

第五步:

在你的組件裏面寫一個select來切換語言

用{{$t(' ')}}來引入對應的值,像這裏咱們定好了「場館溫度」的key值爲venueTemperature,全部就寫:{{$t("venueTemperature")}}

<Menu mode="horizontal">
    <MenuItem name="1">
        <Icon type="ios-paper" />
        {{$t("venueTemperature")}}
    </MenuItem>
    <MenuItem name="2">
        <Icon type="ios-people" />
        {{$t("venueHumidity")}}
    </MenuItem>
    <MenuItem name="3">
        <Icon type="ios-stats" />
        {{$t("outdoorTemperature")}}
    </MenuItem>
    <MenuItem name="4">
        <Icon type="ios-construct" />
        {{$t("outdoorHumidity")}}
    </MenuItem>
    <Select v-model="locale" @on-change="changeLangFn" style="width:100px" placeholder="切換語言">
      <Option v-for="(item,index) in changeLang" :value="item.value" :key="index">{{item.label}}</Option>
    </Select>
</Menu>

第六步:

給select組件賦值,讓它能都記錄選中的是哪種語言

寫一個changeLangFn來更換語言,給 this.$i18n.locale 傳對應的key值(咱們在main.js文件定義的),就會顯示對應的語言。

同時用本地存儲把key值存給language。

export default {
  data() {
    return {
      locale: [],
      changeLang: [
        {
          value: "zh",
          label: "簡體中文"
        },
        {
          value: "en",
          label: "English"
        },
        {
          value: "tc",
          label: "繁體中文"
        }
      ]
    };
  },
  mounted() {
    // this.$i18n.locale 要傳key
    this.locale = this.$i18n.locale;
    this.changeLangFn(this.locale);
  },
  methods: {
    //   切換多語言
    changeLangFn(val) {
      let chan = this.changeLang;
      for (let i in chan) {
        if (chan[i].value === val) {
          this.locale = this.$i18n.locale = chan[i].value;
          localStorage.setItem("language", chan[i].value);
        }
      }
    }
  }
};

在此,就已經OK,若是有引入iview組件,也是有語言切換的。

 

 最後:

main.js文件內容爲:

import Vue from "vue";
import App from "./App";
import router from "./router";


import iView from "iview";
import "iview/dist/styles/iview.css";

import VueI18n from "vue-i18n";
import zhLocale from "iview/src/locale/lang/zh-CN";
import enLocale from "iview/src/locale/lang/en-US";
import twLocale from "iview/src/locale/lang/zh-TW";

import cn from "./language/zh-CN";
import tw from "./language/zh-TW";
import us from "./language/en-US";

Vue.use(iView);
Vue.use(VueI18n);

Vue.locale = () => {};

Vue.config.productionTip = false;

const messages = {
  zh: Object.assign(cn, zhLocale),
  en: Object.assign(us, enLocale),
  tc: Object.assign(tw, twLocale)
};

// 設置參數,建立 Vuei18n 的實例。
const i18n = new VueI18n({
  locale: localStorage.getItem("language") || "zh", // set locale
  messages // set locale messages
});

new Vue({
  el: "#app",
  router,
  i18n,
  components: { App },
  template: "<App/>"
});
View Code

本身寫的組件Header.vue

<template>
  <div class="header_nav">
    <Menu mode="horizontal">
        <MenuItem name="1">
            <Icon type="ios-paper" />
            {{$t("venueTemperature")}}
        </MenuItem>
        <MenuItem name="2">
            <Icon type="ios-people" />
            {{$t("venueHumidity")}}
        </MenuItem>
        <MenuItem name="3">
            <Icon type="ios-stats" />
            {{$t("outdoorTemperature")}}
        </MenuItem>
        <MenuItem name="4">
            <Icon type="ios-construct" />
            {{$t("outdoorHumidity")}}
        </MenuItem>
        <Select v-model="locale" @on-change="changeLangFn" style="width:100px" placeholder="切換語言">
          <Option v-for="(item,index) in changeLang" :value="item.value" :key="index">{{item.label}}</Option>
        </Select>
    </Menu>
  </div>
</template>
<script>
export default {
  data() {
    return {
      locale: [],
      changeLang: [
        {
          value: "zh",
          label: "簡體中文"
        },
        {
          value: "en",
          label: "English"
        },
        {
          value: "tc",
          label: "繁體中文"
        }
      ]
    };
  },
  mounted() {
    // this.$i18n.locale 要傳key
    this.locale = this.$i18n.locale;
    this.changeLangFn(this.locale);
  },
  methods: {
    //   切換多語言
    changeLangFn(val) {
      let chan = this.changeLang;
      for (let i in chan) {
        if (chan[i].value === val) {
          this.locale = this.$i18n.locale = chan[i].value;
          localStorage.setItem("language", chan[i].value);
        }
      }
    }
  }
};
</script>
View Code
相關文章
相關標籤/搜索