使用vue-i18n实现多语言

一、前言

1.需求 

Vue工程,需要实现多语言切换功能。

2.vue-i18n插件

npm中对vue-i18n的描述及文档

Internationalization plugin for Vue.js
https://www.npmjs.com/package/vue-i18n

我们将使用这个插件实现多语言。

3.兼容性

支持Vue.js 2.x以上版本

项目结构

二、实战

1.创建各国语言包资源(src/language/创建各个语言包)

zh-CN.js

export default {
    venueTemperature: "场馆温度",
    venueHumidity: "场馆湿度",
    outdoorTemperature: "室外温度",
    outdoorHumidity: "室外湿度",
    muziDigBig: '木子大大',
    childComponent: '子组件的内容'
  };

 zh-Tw.js

export default {
    venueTemperature: "場館溫度",
    venueHumidity: "場館濕度",
    outdoorTemperature: "室外溫度",
    outdoorHumidity: "室外濕度",
    muziDigBig: '朩ふ汏汏'
};

 en-US.js

export default {
    venueTemperature: "Venue Temperature",
    venueHumidity: "Venue Humidity",
    outdoorTemperature: "Outdoor Temperature",
    outdoorHumidity: "Outdoor Humidity",
    muziDigBig: 'Muzi Digbig',
    childComponent: 'The contents of a child component'
  };

2.安装

npm install vue-i18n --save

3.在项目入口文件中main.js中引入vue-i18n

// 引入i18n
import VueI18n from "vue-i18n"
// 这里需要注册使用语言包
Vue.use(VueI18n);
Vue.locale = () => {};

4.在项目入口文件中main.js中引入language的语言包

// 引入自定义的语言包
import cn from "@/language/zh-CN";
import tw from "@/language/zh-TW";
import us from "@/language/en-US";

// 自己写的语言包,并封装成对象
const messages = {
  zh: cn,
  tc: tw,
  en: us
};

5.创建Vue i18n实例(main.js)

// 设置参数,创建 Vuei18n 的实例。需要将他挂载全局的所有组件上
const i18n = new VueI18n({
  // set locale 本地存储记录当前选中的语言是哪一种/默认的是哪种语言
  locale: localStorage.getItem("language") || "zh", 
  messages // set locale messages,在构造器中配置这个语言包
});

6.挂载到Vue的根实例上

new Vue({
  el: '#app',
  router,
  i18n,   //这一步不能少;将这个语言包对象配置给全局组件使用
  components: { App },
  template: '<App/>'
})

7.标记在HTML中

注意:这里是$t

<div>{{$t("venueTemperature")}}</div>

8.组件中的使用

父组件App.vue

<template>
  <div id="app">
    <!-- 用{{$t(' ')}}来引入对应的值 -->
    <div>{{$t("venueTemperature")}}</div>
    <div>{{$t("venueHumidity")}}</div>
    <div>{{$t("outdoorTemperature")}}</div>
    <div>{{$t("outdoorHumidity")}}</div>
    <div>{{$t("muziDigBig")}}</div>
    <div>
      <span>切换语言</span>
      <select v-model="selLocal" placeholder="切换语言">
        <option v-for="(item,index) in changeLang" :value="item.value" :key="index">{{item.name}}</option>
      </select>
    </div>
    <child></child>
  </div>
</template>
<script>
import child from '@/components/child'
export default {
  components: { child},
  data() {
    return {
      selLocal: '',//locale所选择的存储sel语言的选择信息
      changeLang: [
        {name:'简体中文',value:'zh'},
        {name:'English',value:'en'},
        {name:'繁體中文',value:'tc'},
      ]
    }
  },
  mounted() {
    // this.$i18n.locale组件初始化就从组件中本地的localStorage中获取这个默认/语言选项
    this.selLocal = this.$i18n.locale;
  },
  watch: {
    //   切换多语言
    selLocal(newValue){
      let chan = this.changeLang;
      for (let i in chan) {
        if (chan[i].value === newValue) {
          this.selLocal = this.$i18n.locale = chan[i].value;
          localStorage.setItem("language", chan[i].value);
        }
      }
    }
  },
}
</script>

子组件child.vue

<template>
  <div class="hello">
    {{$t("childComponent")}}
  </div>
</template>
<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
    }
  }
}
</script>

效果:

默认中文

切换到英文

切换到繁体中文

三、iview的语言包+自定义语言包

前提:vue-i18和iview库已经在项目中安装好

自定义语言包资源同上

自定义的语言包与iview库提供的语言包进行合并

Object.assign(自定义, iview提供)

主要文件的代码:

main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import iView from 'iview'
import 'iview/dist/styles/iview.css'
// 引入i18n
import VueI18n from "vue-i18n"

引入iview提供的语言包
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.config.productionTip = false

Vue.use(iView);
// 这里需要注册使用语言包
Vue.use(VueI18n);
Vue.locale = () => {};

// 自己写的语言包和iview的语言包合并;这里通过Object.assign(cn, zhLocale)进行合并
const messages = {
  zh: Object.assign(cn, zhLocale),
  en: Object.assign(us, enLocale),
  tc: Object.assign(tw, twLocale)
};

// 设置参数,创建 Vuei18n 的实例。需要将他挂载全局的所有组件上
const i18n = new VueI18n({
  // set locale 本地存储记录当前选中的语言是哪一种/默认哪种语言
  locale: localStorage.getItem("language") || "zh", 
  messages // set locale messages,在构造器中配置这个语言包
});

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  components: { App },
  template: '<App/>',
  i18n,   //这一步不能少;将这个语言包对象配置给全局组件使用
})

组件中使用

<template>
  <div class="hello">
    <Menu mode="horizontal">
        <MenuItem name="1">
            <Icon type="ios-paper" />
            <!-- 用{{$t(' ')}}来引入对应的值 -->
            {{$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>
        <MenuItem name="4">
            <Icon type="ios-construct" />
            {{$t("muziDigBig")}}
        </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 {
  name: 'HelloWorld',
  data () {
    return {
      locale: '',//locale存储sel语言的选择信息
      changeLang: [
        {value: "zh",label: "简体中文"},
        {value: "en",label: "English"},
        {value: "tc",label: "繁體中文"}
      ]
    }
  },
  mounted() {
    // this.$i18n.locale 要传key;this.$i18n.locale组件初始化就从组件中本地的localStorage中获取这个语言选项
    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>
<style scoped>
.hello{
  background-color: pink;
}
</style>

效果:

默认

英文

繁体中文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值