vue使用i18n实现国际化的方法详解


Posted in Javascript onSeptember 05, 2019

一、前言

在4k广告机中需要实现多语言切换,这时候接触到国际化,前端框架无数,其中几种热门的框架都有相匹配的国际化插件工具。比如:

  • vue + vue-i18n
  • angular + angular-translate
  • react + react-intl
  • jquery + jquery.i18n.property

在4K广告机项目中使用的前端框架为Vue,故而我们将使用vue-i18n这个插件进行国际化功能的实现。

二、最终实现效果

vue使用i18n实现国际化的方法详解

三、国际化的实现

1、首先在自己的项目中安装 vue-i18n依赖包。这里使用NPM进行安装,如果没有科学上网请使用CNPM进行安装。

npm install vue-i18n --save-dev

2、将i18n引入vue实例中,在项目中实现调用API和模板语法。现在在main.js中引入 vue-i18n。

import VueI18n from 'vue-i18n'  //引入vue-i18n

Vue.use(VueI18n); //通过插件的形式挂载

/*---------基本使用-----------*/
const i18n = new VueI18n({
 locale: 'CN', // 语言标识
 messages : {
 en: {
  message: {
  hello: 'hello world'
  }
 },
 cn: {
  message: {
  hello: '你好、世界'
  }
 }
 }
})
/*---------使用语言包-----------*/
const i18n = new VueI18n({
 locale: 'zh', // 语言标识
 //this.$i18n.locale // 通过切换locale的值来实现语言切换
 messages: {
  'zh': require('./common/lang/zh'), // 中文语言包
  'en': require('./common/lang/en') // 英文语言包
 }
})

/* eslint-disable no-new */
new Vue({
 el: '#app',
 i18n,  //挂载到实例,一定得在这个位置,而不是comonents中
 template: '<App/>',
 components: {
 App
 }
});

上面的代码正式将 vue-i18n 引入 vue 项目中,创建一个 i18n 实例对象,方便全局调用。我们通过 this.$i18n.locale 来进行语言的切换。

3、接下来我们就需要新建两个js文件(或者josn文件)作为语言包。

vue使用i18n实现国际化的方法详解

其中en.js语言包中代码为:

module.exports = {
 message: {
 login: 'Login',
 Username: 'Username',
 Password: 'Password',
 Captcha: 'Captcha',
 Language: 'Language',
 zh: 'Chinese',
 en: 'English'
 }
}

其中zh.js语言包中代码为:

module.exports = {
 message: {
 login: '登录',
 Username: '用户名',
 Password: '密码',
 Captcha: '验证码',
 Language: '语言',
 zh: '中文',
 en: '英文'
 }
}

最后我们只需要通过触发事件的形式,来控制 locale 的值,去调用对应的语言包就可以实现国际化啦。

4、组件中触发事件切换 locale 的值,从而实现语言的切换。template代码:

<div class="lang">
 <el-radio-group v-model="language" size="mini">
  <el-radio v-for="item of lang" :label="item.value" border>{{item.label}}</el-radio>
 </el-radio-group>
</div>

scrpit代码:

import Vue from 'vue'

 export default {
 mounted() {
  this.$i18n.locale === 'zh' ? this.language = 0 : this.language = 1 //数据加载时判断当前属于哪种语言,为其单选按钮赋值
 },
 data() {
  return {
  language: 0,
  lang: [{
   label: this.$t('message.zh'),  //模板语法的一种
   value: 0
  }, {
   label: this.$t('message.en'),
   value: 1
  }],
  }
 },
 watch: { //侦听器
  language: function (val) {  //侦听单选按钮的变化,从而进行切换语言
  val === 0 ? this.$i18n.locale = 'zh' : this.$i18n.locale = 'en';
  Vue.set(this.lang, 0, {label: this.$t('message.zh'), value: 0});
  Vue.set(this.lang, 1, {label: this.$t('message.en'), value: 1})
  /**
  this.lang: [{
   label: this.$t('message.zh'),  //如果不使用Vue.set,也可以使用更新数据的方法
   value: 0
  }, {
   label: this.$t('message.en'),
   value: 1
  }]
  **/
  }
 },
 }

注意:由于 JavaScript 的限制,Vue 不能检测当前变动的数组,只渲染一次,如果数据不更新视图就不更新的组件,如果切换语言则需要更新一下数据才能切换组件内的多语言。

四、vue-i18n 数据渲染的模板语法

模板语法暂时分为三种:

//vue组件模板的使用
<div>{{$t('message.zh')}}</div>

//vue组件模板数据绑定的使用
<input :placeholder="$t('message.zh')"></input>

//vue组件data中赋值的使用
data:{
 msg:this.$t('message.zh');
}

五、Element UI组件库与vue-i18n的兼容问题

由于项目中使用了Element UI组件库,它里面内置的一些文字也是需要国际化,好在Element UI是有国际化的支持。但是Element UI默认只兼容vue-i18n的5.x版本,而现在vue-i18n的版本已经到了7.x,Element UI官方文档中“国际化”一节中对此有具体说明。下面将手动设置内容贴出来:

import Vue from 'vue'
import ElementUI from 'element-ui'
import VueI18n from 'vue-i18n'
import enLocale from 'element-ui/lib/locale/lang/en'  //引入Element UI的英文包
import zhLocale from 'element-ui/lib/locale/lang/zh-CN'  //引入Element UI的中文包

Vue.use(VueI18n);
Vue.use(ElementUI, {
 i18n: (key, value) => i18n.t(key, value)
}); //兼容i18n 7.x版本设置

const i18n = new VueI18n({
 locale: 'zh', // 语言标识
 messages: {
 zh: Object.assign(require('@/components/common/lang/zh'), zhLocale), //这里需要注意一下,是如何导入多个语言包的
 en: Object.assign(require('@/components/common/lang/en'), enLocale),
 }
});

注意:关于导入多个语言包时遇到的问题,我是在Element UI 国际化文档中发现的解决办法。

六、路由与面包屑导航国际化的语法问题

在对面包屑导航进行国际化时不知道如何进行。在网上翻阅了一些资料,得到如下代码,完美解决问题:
router.js(路由配置文件)

{
 path: '/index',
 name: 'nav.Home',  //直接点出对应的文字
 component: (resolve) => require(['@/components/index'], resolve)
}

Breadcrumb.vue(面包屑导航组件)

<div id="Breadcrumb">
 <el-breadcrumb separator-class="el-icon-arrow-right">
  <el-breadcrumb-item :to="{ path: '/index' }">{{$t('nav.Home')}}</el-breadcrumb-item>
  /*注意{{$t(item.name)}}*/
  <el-breadcrumb-item v-for="item in $route.matched" :to="{ path: item.path}">{{$t(item.name)}}</el-breadcrumb-item>
 </el-breadcrumb>
 </div>

七、至此,国际化的坑算是踩完了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
ajax 同步请求和异步请求的差异分析
Jul 04 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 Javascript
自写的jQuery异步加载数据添加事件
May 15 Javascript
详解JavaScript中getFullYear()方法的使用
Jun 10 Javascript
express框架实现基于Websocket建立的简易聊天室
Aug 10 Javascript
JS如何设置元素样式的方法示例
Aug 28 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
Mar 05 Javascript
Layer弹出层动态获取数据的方法
Aug 20 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
Sep 30 Javascript
JS 事件机制完整示例分析
Jan 15 Javascript
js实现轮播图特效
May 28 Javascript
Vue接口封装的完整步骤记录
May 14 Vue.js
vue实现手机号码的校验实例代码(防抖函数的应用场景)
Sep 05 #Javascript
一文看懂如何简单实现节流函数和防抖函数
Sep 05 #Javascript
React路由鉴权的实现方法
Sep 05 #Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
Sep 05 #Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 #Javascript
在layui中layer弹出层点击事件无效的解决方法
Sep 05 #Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 #Javascript
You might like
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
第五节 克隆 [5]
2006/10/09 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
JavaScript 获得选中文本内容的方法
2009/02/15 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
2016/07/18 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
python检测是文件还是目录的方法
2015/07/03 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
python语言中with as的用法使用详解
2018/02/23 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
Python count函数使用方法实例解析
2020/03/23 Python
numpy库reshape用法详解
2020/04/19 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
英国最大的邮寄种子和植物公司:Thompson & Morgan
2017/09/21 全球购物
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
自荐信需注意事项
2014/01/25 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
学校教研活动总结
2014/07/02 职场文书
大学活动总结模板
2014/07/10 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
2014年工商所工作总结
2014/12/09 职场文书
业务员岗位职责范本
2015/04/03 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技