vue i18n 国际化-多语言

927 阅读2分钟

vue i18n 国际化-多语言

1.初始化多语言包

多语言切换, 需要用到一个国际化的包 vue-i18n (此示例是 基于element-ui)

yarn add vue-i18n@8.22.2

i18ninternationalization这个单词的缩写,取了首字母i和结尾字母n,中间一用有18个字母,所以组合起来就所写成i18n,这是一个用于给vue国际化的插件, 它可以轻松地将一些本地化功能集成到你的 Vue.js 应用程序中

2.创建语言包对象

语言包对象 最后可能会比较大,属性比较多,所以最好的办法是将其定义成单独的 js 文件,然后再进行整合

src 目录下新建 lang 目录,在其中新建 zh.js(中文) 和 en.js(英文) 文件(想配置几种语言就配置几个js文件,其中的 “建” 需要一一对应)

zh.js

// 1、创建中文语言包对象
 export default{ 
    table: { 
        username: '用户名',    
        email: '邮箱',   
        mobile: '手机'  
     },  
    menus: {    
        home: '首页',    
        download: '下载'  
     },  
    tabs: {  
        info: '商品描述',  
        comment: '评价'  
     } 
    }

en.js

// 2、创建英文语言包对象
    export default {   
    table: {     
        username: 'Username',    
        email: 'Email',    
        mobile: 'Mobile'  
     },  
    menus: {     
        home: 'Home',     
        download: 'DownLoad'  
     },   
    tabs: {  
        info: 'Describe',  
        comment: 'Comment On' 
     }
    }

3.整合语言包文件

我们将整合语言包对象和创建 VueI18n 实例并配置的过程写到一个 js 文件中,然后在 main.js 中导入

这样 main.js 中代码就会简练很多,毕竟 main.js 中只是最后需要一个 VueI18n 的实例即可!

在lang 目录下创建 index.js 代码如下

import Vue from 'vue' // 引入Vue
import VueI18n from 'vue-i18n' // 引入国际化的插件包
import Cookies from 'js-cookie' // 引入cookie包
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) // 全局注册国际化包

// 创建国际化插件的实例
export default new VueI18n({
  // 指定语言类型
  locale: Cookies.get('language') || 'en', // 从cookie中获取语言类型 获取不到就是英文
  // 准备语法的翻译环境
  messages: {
    en: {
      ...elementEN, // 将饿了么的英文语言包引入
      ...customEN // 将饿了么的英文语言包引入
    },
    zh: {
      ...elementZH, // 将饿了么的中文语言包引入
      ...customZH
    }
  }
})

4.在 main.js 中引入

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import i18n from '@/lang'

Vue.config.productionTip = false
 
// 配置ElementUI的中英切换逻辑
Vue.use(ElementUI, {
  i18n: (key, value) => i18n.t(key, value)
})
    
new Vue({
  el: '#app',
  //挂载 i18n
  i18n,
  render: h => h(App)
})

现在我们就可以尝试去测试一下,利用 $t 方法, 使用测试

<div class="home">
    {{ $t('menus.home') }}
    <span>{{ $t('menus.download') }}</span>
</div>

5.切换语言

当前如果切换语言,需要手动修改如下代码中的 locale 的值

// 创建国际化插件的实例
export default new VueI18n({
  // 指定语言类型
  locale: Cookies.get('language') || 'en', // 从cookie中获取语言类型 获取不到就是英文
  // 准备语法的翻译环境
  messages: {
    en: {
      ...elementEN, // 将饿了么的英文语言包引入
      ...customEN // 将饿了么的英文语言包引入
    },
    zh: {
      ...elementZH, // 将饿了么的中文语言包引入
      ...customZH
    }
  }
})

手动修改 en 和 zh, 很显然太麻烦了, 我们可以准备一个下拉菜单, 提供选择语言的功能

步骤:

1). 封装多语言切换的组件

src/components/LangurAge/index.vue

<template>
  <el-dropdown trigger="click" @command="changeLanguage">
    <div>
      <svg-icon style="fill: black;font-size:20px" icon-class="language" />
    </div>
    <el-dropdown-menu slot="dropdown">
      <el-dropdown-item command="zh" :disabled="'zh'=== $i18n.locale ">中文</el-dropdown-item>
      <el-dropdown-item command="en" :disabled="'en'=== $i18n.locale ">en</el-dropdown-item>
    </el-dropdown-menu>
  </el-dropdown>
</template>

<script>
import Cookies from 'js-cookie'
export default {
  methods: {
    changeLanguage(lang) {
      Cookies.set('language', lang) // 切换多语言
      this.$i18n.locale = lang // 设置给本地的i18n插件
      this.$message.success('切换多语言成功')
    }
  }
}
// this.$i18n.locale = '语言字符串'  切语言
</script>

2). 全局注册组件

main.js

// 引入 
import LangurAge from '@/components/LangurAge'
// 注册为全局组件
Vue.component('LangurAge',LangurAge)

3). 使用

<LangurAge />