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

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}`
      });
    }
  }

 

 

posted on 2020-03-04 13:51  chenyi4  阅读(5016)  评论(0编辑  收藏  举报

导航