vue3 + i18n 中英文切换

第一步:安装vue-i18n

npm install vue-i18n

第二步:配置语言包及js文件

目录如下:

英文语言包 en.js

// lang/en.js - 英文语言包
export default {
    menu: {      
        库房管理: 'Warehouse Management',
        入库检测: 'Incoming Inspection',       
        设置: 'Settings'
    }
  };
  

中文语言包 zh-CN.js

// lang/zh.js - 中文语言包
export default {
    menu: {       
        库房管理: '库房管理',
        入库检测: '入库检测',       
        设置: '设置'
    }
  };
  

js配置文件(单独设置一个文件,方便其他地方引用,直接配置在main.js中在router中调用有问题未解决)

// 引入插件
import { createI18n } from 'vue-i18n'
// 引入语言包
import zh from './zh-CN'
import en from './en'

// 自动设置多语言 默认选择浏览器系统语言
const navLang       = navigator.language;    //判断当前浏览器使用的语言
const localLang     = (navLang === 'zh-CN' || navLang === 'en-US') ? navLang : false;
let lang            = localStorage.getItem('language') || localLang || 'en-US';    //如果有存,取缓存的语言
// 创建 VueI18n 实例,并为 messages 和 locale 属性赋值
const i18n  = createI18n({
    legacy: false, //解决Not available in legacy mode
    locale: lang, // 设置语言类型
    messages:{
        'zh': zh, // 中文语言包
        'en': en // 英文语言包
    },
    silentTranslationWarn: true,
    globalInjection: true, // 全局注册$t方法
});
localStorage.setItem('language',lang);    //最后缓存当前使用的语言

export default i18n

语言包的配置不尽相同,大家按自己项目中的需求合理配置即可,我的项目中是后台动态获取菜单(非动态路由)

第三步:调用

动态菜单的实现(组件中调用 全局变量 $t

<el-menu
            :default-active="$route.path"
            class="el-menu-vertical-demo"
            :collapse-transition="false"
            :unique-opened=true
            :router="true"
            background-color="#F3F5FA"
          >
            <el-menu-item :index="item.url" class="one-bj" v-for="(item,index) in menuList" @click="judge(item.menuId)">
              <i :class="item.icon"></i>&nbsp;
              <div class="pos">{{$t('menu.'+item.name)}}</div>         
            </el-menu-item>
          </el-menu>

中英文切换按钮:

<button @click="changeLang">{{ language }}</button>

插件import

import i18n from '@/locales'
const { t,locale } =  i18n.global  //解构出t方法
//中英文切换
const route = useRoute()
const changeLang = () => {
  if(language.value == "中文"){
    language.value = "英文"
    locale.value = "zh"
    localStorage.setItem('language','zh'); 
    document.title = t('menu.'+route.meta.title) + '-' + t('menu.'+'风味科学') //设置网页标题  //修改页面标题中英文切换
  }else {
    language.value = "中文"
    locale.value = "en"
    localStorage.setItem('language','en'); 
    document.title = t('menu.'+route.meta.title) + '-' + t('menu.'+'风味科学') //设置网页标题
  }
}

以上为页面中的使用。

在router中的使用,同样需要先引入插件并导入用到的方法

直接路由中使用

 {
              path:'/home',
              name:'home',
              component:() => import('@/views/OverView.vue'),
              meta:{title:t('menu.'+'整体概览'),requireAuth:true}
          },

上述方法页面标题只有在刷新页面的时候会更改中英文,点击中英文切换按钮的时候并不会实时改变

所以我们需要在路由守卫中进行处理,同时配合按钮切换的时候document.title的改变

router.beforeEach((to,from,next)=>{
  const title = ( t('menu.'+to.meta.title) ? t('menu.'+to.meta.title) : "" ) + '-' + t('menu.'+'科学') //设置网页标题
  document.title = title
  const pathArr = ['/home',''] 
  if(pathArr.indexOf(to.path) !== -1){
    if(localStorage.getItem('token')){
      next()
    }else{
      next("/login")
    }
  }else{
    next()
  }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值