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   chenyi4  阅读(5128)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示