效果圖: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/>" });
本身寫的組件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>