vue项目使用vue-i18n和iView切换多语言

效果图:

当然,如果使用iview组件,组件也会对应切换语言。

这里,假设已经用vue-cli脚手架创建了项目,熟悉vue-router,而且已经引入了iview UI。

第一步:

我们在main.js引入vue-i18n

import VueI18n from "vue-i18n";

在main.js目录下新建一个language文件夹,里面分别新建3个文件en-US.js、zh-CN.js、zh-TW.js文件,来存放不同语言的文字。分别加入如下代码:

en-US.js

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

zh-CN.js

module.exports = {
  venueTemperature: "场馆温度",
  venueHumidity: "场馆湿度",
  outdoorTemperature: "室外温度",
  outdoorHumidity: "室外湿度"
};

zh-TW.js

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

第二步:

根据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

 

posted @ 2018-11-22 18:26  正是泽  阅读(5997)  评论(0编辑  收藏  举报