Vue项目中的多语言实现—vue-i18n插件的使用
vue-i18n 国际化 多语言实现
·
Vue项目中的多语言实现—vue-i18n插件的使用
实现的条件(原理)
1、语言标识符
2、中英文对照字典表
3、翻译官 – 根据文字标识符找到对应的语言文字并反返回
示例步骤:
1、声明相关变量
-
语言标识符
lang:'en'/ zh
-
中英文对照表
messages:{ zh:{ morning:'早上好' }, en:{ morning:'Good morning' } }
2、封装函数,充当翻译官 t
t(str){
const curLang = this.messages[this.lang]
return curLang[str] || str
}
3、使用函数,传入文字的标识符 t('morning')
vue-i18n插件实现
npm下载
npm i vue-i18n@8
(最新版本不支持Vue2)
基本使用
-
需要单独一个多语言的实例化文件
src/lang/index.js
-
引入注册并导出实例化插件对象
import Vue form 'vue' import VueI18n from 'vue-i18n' // 注册 Vue.use(VueI18n) // 实例化插件 export default new VueI18n() // 里面传入对象
-
-
在
main.js
中引入自己封装的,并注入到 Vue实例中import i18n from './lang/index' // 注入到 Vue实例中 new Vue({ i18n })
3、i18n的自定义字典表的使用
-
实例化插件的时候传入对象,对象中声明语言标识符以及中英文对照字典表
// src/lang/index.js import Vue from 'vue' // 引入 Vue import VueI18n from 'vue-i18n' // 引入国际化的包 import customZH from './zh' // 引入自定义中文对照包 export default{ route:{users: '用户'...}, navbar:{}...} import elementEN from 'element-ui/lib/locale/lang/en' // 引入饿了么的英文包 import elementZH from 'element-ui/lib/locale/lang/zh-CN' // 引入饿了么的中文包 export default new VueI18n({ locale: localStorage.getItem('lang') || 'zh' // 从 localStorage 中获取语言类型 获取不到就是中文 messages: { en: { ...elementEN, // 将饿了么的英文语言包引入 ...customEN }, zh: { ...elementZH, // 将饿了么的中文语言包引入 ...customZH } } })
-
elementUI的国际化使用
-
注册elementUI的时候注入i18n配置项
// main.js Vue.use(ElementUI,{ i18n:(key,value) => i18n.t(key,value) })
-
-
利用插件提供的 $t 函数,实现中英文切换
$t(route.users)
-
封装独立的 中英文转换组件
componets/lang/index.vue
<template> <el-dropdown trigger="click" @command="changeLanguage"> <!-- 这里必须加一个 div --> <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) { localStorage.setItem('lang', lang) this.$i18n.locale = lang // 设置给本地的 i18n 插件 this.$message.success('切换多语言成功') } } } </script>
-
全局注册
// main.js import Lang from '@/componets/lang/index.vue' Vue.component('Lang',Lang)
-
使用多语言组件
<Lang/>
解决 elementUI 的日期组件中英文切换不能实时更新问题—watch使用
-
声明变量给日历组件绑定
v-if
指令 -
实时侦听语言的变化
watch:{ '$i18n.locale'(val) { // 当语言变化时修改 isShow为false this.isShow = false // Dom渲染之后 isShow 变为 true this.$nextTick(() => { this.isShow = true }) } }
补充
src/components/lang/index.vue
<template>
<el-dropdown trigger="click" @command="changeLanguage">
<!-- 这里必须加一个div -->
<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) {
// lang的值是在下拉选项组件中command属性设置的
// console.log(18, lang)
// console.log(19, this.$i18n)
this.$i18n.locale = lang
}
}
}
</script>
<style scoped>
</style>
src/lang/en.js
export default {
route: {
dashboard: 'Dashboard',
manage: 'manage',
users: 'users',
menus: 'menus',
// permissions: 'permissions',
logs: 'logs',
example: 'example',
table: 'table',
postInfo: 'Job information',
manageSelf: 'Manager self-help',
setting: 'setting',
report: 'report',
employeesAdd: 'add employees',
EditiNfo: 'Edit information',
print: 'print',
form: 'form',
basicForm: 'basic form',
stepForm: 'step form',
advancedList: 'advanced form',
step: 'step',
details: 'details',
BasicsDetails: 'Basic details page',
seniorDetails: 'Advanced details page',
import: 'Import',
'saas-clients': 'Saas-Clients',
'saas-clients-details': 'Saas-Details',
'permissions': 'permissions' // 权限管理
},
navbar: {
search: 'search',
logOut: 'Log Out',
dashboard: 'Dashboard',
github: 'Github',
screenfull: 'screenfull',
theme: 'theme',
lang: 'i18n',
error: 'error log'
},
login: {
title: 'itheima login',
login: 'Log in',
name: 'name',
entryTime: 'entry time',
hireForm: 'hire form',
jobNumber: 'job number',
department: 'department',
managementForm: 'management form',
city: 'city',
turnPositiveTime: 'turn positive time',
password: 'Password',
any: 'any',
thirdparty: 'Third',
thirdpartyTips: 'Can not be simulated on local, so please combine you own business simulation! ! !'
},
tagsView: {
close: 'Close',
closeOthers: 'Close Others',
closeAll: 'Close All',
refresh: 'refresh'
},
table: {
title: 'Title',
search: 'Search',
add: 'add',
addUser: 'addUser',
id: 'ID',
email: 'Email',
phone: 'Phone',
username: 'User',
permissionNew: 'permissionNew',
permissionUser: 'Permission',
imdsAi: 'Advanced interface authorization',
avatar: 'Avatar',
introduction: 'Introduction',
paddword: 'paddWord',
powerCode: 'Permission code',
powerTitle: 'Permission title',
actions: 'Actions',
edit: 'Edit',
delete: 'Delete',
cancel: 'Cancel',
confirm: 'Confirm',
operationType: 'operationType',
operationDate: 'operationDate',
date: 'Date',
operator: 'operator',
results: 'results of enforcement',
describe: 'Pedagogical operation',
save: 'save',
signOut: 'sign out',
submit: 'submit',
reset: 'reset',
know: 'I Know',
return: 'return',
view: 'view'
}
}
src/lang/zh.js
export default {
route: {
dashboard: '首页',
manage: '后台管理',
users: '用户管理',
menus: '菜单管理',
logs: '日志管理',
example: '示例',
table: '数据列表',
// permissions: '权限管理',
// employees: '员工',
// employeesList: '员工管理',
// employeesInfo: '个人信息',
postInfo: '岗位信息',
manageSelf: '经理自助',
setting: '设置',
report: '报表',
employeesAdd: '添加员工',
EditiNfo: '编辑信息',
print: '打印页面',
form: '表单页',
basicForm: '基础表单',
stepForm: '分步表单',
advancedList: '高级表单',
step: '步骤',
details: '详情页',
BasicsDetails: '基础详情页',
seniorDetails: '高级详情页',
import: '导入',
// 权限
'permissions': '权限管理' // 权限管理
},
navbar: {
search: '站内搜索',
logOut: '退出登录',
dashboard: '首页',
github: '项目地址',
screenfull: '全屏',
theme: '换肤',
lang: '多语言',
error: '错误日志'
},
login: {
title: '人力资源管理系统',
login: '登录',
username: '账号',
password: '密码',
any: '随便填',
thirdparty: '第三方登录',
thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!'
},
tagsView: {
close: '关闭',
closeOthers: '关闭其它',
closeAll: '关闭所有',
refresh: '刷新'
},
table: {
title: '请输入用户',
search: '搜索',
add: '添加',
addUser: '新增用户',
id: '序号',
email: '邮箱',
phone: '手机',
name: '姓名',
entryTime: '入职时间',
hireForm: '聘用形式',
jobNumber: '工号',
department: '部门',
managementForm: '管理形式',
city: '工作城市',
turnPositiveTime: '转正时间',
permissionNew: '新增权限组',
permissionUser: '权限组名称',
imdsAi: '高级接口授权',
avatar: '头像',
introduction: '介绍',
paddword: '密码',
powerCode: '权限代码',
powerDistriB: '权限分配',
powerTitle: '权限标题',
powerNav: '主导航',
actions: '操作',
edit: '编辑',
delete: '删除',
cancel: '取 消',
confirm: '确 定',
return: '返回',
operationType: '操作类型',
operationDate: '操作时间',
date: '日期',
submit: '提交',
operator: '操作人',
results: '执行结果',
describe: '描述',
save: '保存',
signOut: '退出',
reset: '重置',
know: '我知道了',
view: '查看'
}
}
src/lang/index.js
// 1、引入插件
import Vue from 'vue'
import VueI18n from 'vue-i18n'
// 引入elementUI的语言表
import elZh from 'element-ui/lib/locale/lang/zh-CN'
import elEn from 'element-ui/lib/locale/lang/en'
// 引入导航的语言包
import comZh from './zh'
import comEn from './en'
// 注册
Vue.use(VueI18n)
// 2、定义中英文语言对照表
const messages = {
zh: {
morning: '早安!',
...elZh,
...comZh
},
en: {
morning: 'good morning!',
...elEn,
...comEn
}
}
// 3、实例化插件
const i18n = new VueI18n({
locale: 'zh', // 当前的语言
messages: messages
})
// 4、导出
export default i18n
更多推荐
已为社区贡献3条内容
所有评论(0)