如何在一个全新的项目里面使用多语言国际化?
首先,你得知道 i18n 是什么...
i18n (其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改变就能够适应不同的语言和地区的需要。``对程序来说,在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。
i18n 是vue.js里国际化插件。它可以轻松的将一些本地功能集成到你的vue.js应用程序中
1.在项目中安装 i18n 国际化的包
注意:(vue-i18n现在有了一个新版本,对应的api有些不兼容,请还是使用8.22.2这个版本!)
npm i vue-i18n@8.22.2
2. ElementUI多语言配置
首先创建一个创建src/lang/index.js
// 进行多语言支持配置
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' // 引入饿了么的中文包
Vue.use(VueI18n) // 全局注册国际化包
// 创建国际化插件的实例
const i18n = new VueI18n({
// 指定语言类型 zh表示中文 en表示英文
locale: 'zh',
// 将elementUI语言包加入到插件语言数据里
messages: {
// 英文环境下的语言数据
en: {
...elementEN
},
// 中文环境下的语言数据
zh: {
...elementZH
}
}
})
// 配置elementUI 语言转换关系
locale.i18n((key, value) => i18n.t(key, value))
export default i18n
在main.js中引入 i18n的插件
语言包只要放在src下即可,然后语言包在main.js中引入
// 省略其他...
import i18n from '@/lang'
// 加入到根实例配置项中
new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
})
3.在代码中的使用方法
3.1在标签中使用
<div class="title">{{$t(licence.title1)}}</div>
3.2在input的placeholder中使用,其实就是vue中的v-bind
<input type="password" :placeholder="$t(login.password)" maxlength="24" v-model="log_password">
3.3在JS中使用
this.$t('login.clause')
3.4语言切换方法
// 创建国际化插件的实例
export default new VueI18n({
// 指定语言类型
locale: 'zh',
messages: {
en: {
...elementEN, // 将饿了么的英文语言包引入
...customEN // 将自定义英文包加入
},
zh: {
...elementZH, // 将饿了么的中文语言包引入
...customZH // 将自定义中文包加入
}
}
})
封装多语言组件
<template>
<el-dropdown trigger="click" @command="changeLanguage">
<div>
<svg-icon style="color:#fff;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>
export default {
methods: {
changeLanguage(lang) {
this.$i18n.locale = lang // 设置给本地的i18n插件
this.$message.success('切换多语言成功')
}
}
}
</script>
全局注册
在component/index.js中进行全局组件注册
import Lang from './Lang'
export default {
// 插件的初始化, 插件给你提供的全局的功能, 都可以在这里配置
install(Vue) {
// 进行组件的全局注册
Vue.component('Lang', Lang)
}
}
此处我是在Navbar组件中引入使用组件
<lang class="right-menu-item" />
<!-- 全屏组件 -->
<screen-full class="right-menu-item" />
中英文切换原理
当我们引入 VueI8n 语言插件之后,每个组件实例拥有了一个 $t 方法,这个方法可以帮助我们进行语言转换,可以根据帮签到语言类型,使用传入的key去寻找当前key对应的文本,原理基础如图所示:
实现思路
web项目多语言(i18n,即国际化)是比较常见的需求,常规的做法大概有以下几种:
1.每种语言单独开发页面,适用于CMS之类的网站;
2.多语言文本和页面结构分离,运行时动态替换,适用于单页应用(SPA);
3.直接用网页翻译插件,机器翻译。这种效果不太理想,同时也有一些局限性。
各个方案遇到的问题:
1.现在网上比较通用的,就是使用vue-i18n插件。这个插件就是上面第二种方案,用JSON文件管理多语言的文本资源,建立多语言的配置映射表,在vue组件模板里通过键名引用文本。但是管理这些英文键名比较麻烦,命名就很头疼。(VS Code有相关的插件,可以显示出对应的中文);
2.使用Chrome游览器自带的Google翻译功能,首先机翻的效果会打折扣,最关键的是还会影响到功能的使用。由于项目是用Vue.js开发的单页应用,页面内容是用JS动态渲染的。有些对话框内的文字Google翻译就忽略了。另外,Google翻译只处理DOM文本节点,input输入框内的文字(包括placeholder)被忽略了。最严重的问题是,经过Google翻译处理后的DOM元素,失去了vue响应式特性,数据变化后DOM内的文字不会更新了。
鉴于以上情况,和项目的基本情况,此次选择的是第二种方案,语言配置文件和页面结构分离,也方便后期项目的扩展。采用静态翻译,也就是通过多语言配置文件映射。vue-i18n是每种语言准备一个JSON文件,属性名用英文,用命名空间(多层级对象)的方式避免命名冲突。