多语言国际化如何实现(i18n)

264 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

国际化处理

解决方案:

国际化(i18n)处理

vue项目中的多语言支持使用的是vue-i18n

参考: kazupon.github.io/vue-i18n/zh…

目的是实现多语言的(例如:中英文)切换功能

安装国际化包

npm i vue-i18n@8.22.2

注意:

vue-i18n现在有了一个新版本,对应的api有些不兼容,请还是使用8.22.2这个版本!

配置

在src目录下新建lang文件夹

引入语言包

en.js 英语对应 zh.js中文对应

配置文件

import Vue from 'vue'
import VueI18n from 'vue-i18n'
// 引入自定义中文包
import customZH from './zh' 
// 引入自定义英文包
import customEN from './en' 

Vue.use(VueI18n)

// 创建国际化插件的实例
export default new VueI18n({
  
  locale: 'zh',// 指定语言类型
  
  messages: { // 固定写法
    en: {
     ...customEN   // 将自定义英文包加入
    },
    zh: {
     ...customZH   // 将自定义中文包加入
    }
  }
})

在main.js中挂载 i18n的插件

// 省略其他...
import i18n from '@/lang'
// 加入到根实例配置项中
new Vue({
  el: '#app',
  router,
  store,
  i18n,
  render: h => h(App)
})

使用

因为我们把国际化挂载在main.js中所以可以使用this.$t代表国际化插件的使用

就像在main.js中挂载了router所以我么可以使用$router

在.vue中使用: this.$t('key')

在.js中使用: i18n.t('key')

国际化原理

1.在实例化vue中使用this.t(每一个想要国际化的文字都要用this.t(每一个想要国际化的文字都要用this.t)

在.vue中使用: this.$t('key')

在.js中使用: i18n.t('key')

2.根据src/lang/index.js中的语言确定语言类型

找到对应的语言包,找到对应key值的语言,

3.根据参数key值在对应的语言数据中匹配

例子

  • 比如在index.vue中使用了this.$t('table')
  • 然后在/lang/index.js中的语言确定语言类型
  • 如果是英文到en.js中找匹配,table对应table,输出table
table: 'table',
  • 如果当前是需要输出中文到zh中找匹配,table对应数据列表,输出数据列表
table: '数据列表',

ElementUI兼容i18n

element.eleme.cn/#/zh-CN/com…

在lang/index.js中引入ele语言包

import VueI18n from 'vue-i18n'
import Element from 'element-ui'
import elementEN from 'element-ui/lib/locale/lang/en'
import elementZH from 'element-ui/lib/locale/lang/zh-CN'

使用语言包

// 进行多语言支持配置
import Vue from 'vue' // 引入Vue
import VueI18n from 'vue-i18n' // 引入国际化的插件包
+ import locale from 'element-ui/lib/locale'
+ import elementEN from 'element-ui/lib/locale/lang/en' // 引入饿了么的英文包
+ import elementZH from 'element-ui/lib/locale/lang/zh-CN' // 引入饿了么的中文包
// 引入自定义中文包
import customZH from './zh' 
// 引入自定义英文包
import customEN from './en' 
Vue.use(VueI18n) // 全局注册国际化包

// 创建国际化插件的实例
const i18n = new VueI18n({
  // 指定语言类型 zh表示中文  en表示英文
  locale: 'zh',
  // 将elementUI语言包加入到插件语言数据里
  messages: {
    // 英文环境下的语言数据
    en: {
+     ...elementEN,
      ...customZH
    },
    // 中文环境下的语言数据
    zh: {
+     ...elementZH,
      ...customEN
    }
  }
})
// 配置elementUI 语言转换关系
+ locale.i18n((key, value) => i18n.t(key, value))

export default i18n