码迷,mamicode.com
首页 > 编程语言 > 详细

vue 多语言 vue-i18n 按需加载,异步调用

时间:2020-03-04 14:45:22      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:切换   也会   控件   ext   cal   outer   class   nextTick   res   

http://kazupon.github.io/vue-i18n/zh/guide/lazy-loading.html

一次加载所有翻译文件是过度和不必要的。

因为可能一直用中文,那么就不会用到英文的数据,就没必要去加载。只在请求的时候去加载它

1.新建i18n.js

import Vue from vue
import VueI18n from vue-i18n
import zh from @/assets/language/zh
import axios from axios
Vue.use(VueI18n);

export const i18n = new VueI18n({
    locale: zh,
    // messages
    messages: {
        zh:zh.zh
    }
});

const loadedLanguages = [zh]; //当前已经加载完全的语言
//en //jp
//切换的时候,根据语言加载各个国家的语言


function setI18nLanguage(lang){
    i18n.locale = lang;  
   //设置i18n的默认语言
    axios.defaults.headers.common[Accept-Language] = lang; //设置ajax请求的语言
    document.querySelector(html).setAttribute(lang, lang) //设置html的语言
    return lang
}   

export function loadLanguageAsync (lang) {
    if (i18n.locale !== lang) { //如果传入的变量 不等于 i18插件的语言值 (切换过一次,再切换第二次就不会再去加载一遍了)
        if(!loadedLanguages.includes(lang)){ //如果加载的这个语言不包含在默认加载的语言里面
            //就去异步加载它
            return import(`@/assets/language/${lang}`).then(msgs => { //去引入这个值
                i18n.setLocaleMessage(lang, msgs.default[lang]); 
                //设置i18n的语言message切换成这个
                loadedLanguages.push(lang); //本地已经加载的语言 加入 loadedLanguages
                return setI18nLanguage(lang);
                 //返回并且设置
            });

        } //如果传入的语言变量值等于现在i18n控件的默认语言值 //不等于也会去设置
        return Promise.resolve(setI18nLanguage(lang)); //处理一些默认信息
    }
    return Promise.resolve(lang);
}

export default i18n;

2.zh.js. en.js写对应英文的

module.exports = {
        zh: { 
         message: {
            title: 运动品牌,
           
           },
           placeholder: {
            enter: aaaa
           },
           brands: {
              .....自己写
           }
        }
    }

3.main.js 引入

import i18n from i18m.js
Vue.use(VueI18n);
new Vue({
  i18n
});
router.beforeEach((to, from, next) => {
  const lang = to.query.lang||zh;
   loadLanguageAsync(lang).then(() => {next()})
});

拦截to的参数,不能写from

4.多选下拉框

 <select v-model="lang">
        <option v-for="(lang, i) in langs" :key="`Lang${i}`" :value="lang">{{ lang }}</option>
 </select>
data(){
    return {
      langs: [
        zh,en
      ],
      lang: en
    }
  },
  created(){
    const self = this;
    this.$nextTick(()=>{
      setTimeout(function(){
        self.lang = self.$route.query.lang;
      },100);
    });
   
  },
  watch:{
    lang(value){
      this.$router.push({
            path: `/?lang=${value}`
      });
    }
  }

 

 

vue 多语言 vue-i18n 按需加载,异步调用

标签:切换   也会   控件   ext   cal   outer   class   nextTick   res   

原文地址:https://www.cnblogs.com/chenyi4/p/12409074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!