一. 多语言支持

  1. 实现elementUI中英文切换功能,感受中文切换的效果

1. 安装

  1. npm i vue-i18n@8.22.2

2. ElementUI多语言配置

  1. **引入element语言包文件 src/lang/index.js 直接粘贴复制到项目下面**
  1. // 进行多语言支持配置
  2. import Vue from 'vue' // 引入Vue
  3. import VueI18n from 'vue-i18n' // 引入国际化的插件包
  4. import locale from 'element-ui/lib/locale'
  5. import elementEN from 'element-ui/lib/locale/lang/en' // 引入饿了么的英文包
  6. import elementZH from 'element-ui/lib/locale/lang/zh-CN' // 引入饿了么的中文包
  7. Vue.use(VueI18n) // 全局注册国际化包
  8. // 创建国际化插件的实例
  9. const i18n = new VueI18n({
  10. // 指定语言类型 zh表示中文 en表示英文
  11. locale: 'zh',
  12. // 将elementUI语言包加入到插件语言数据里
  13. messages: {
  14. // 英文环境下的语言数据
  15. en: {
  16. ...elementEN
  17. },
  18. // 中文环境下的语言数据
  19. zh: {
  20. ...elementZH
  21. }
  22. }
  23. })
  24. // 配置elementUI 语言转换关系
  25. locale.i18n((key, value) => i18n.t(key, value))
  26. export default i18n


3. 在main.js中挂载i18n的插件

  1. // 省略其他...
  2. import i18n from '@/lang'  //设置一次,在其他项目也可以继续使用
  3. // 加入到根实例配置项中
  4. new Vue({
  5. el: '#app',
  6. router,
  7. store,
  8. i18n, //
  9. render: h => h(App)
  10. })


 4.核心: 手动修改 locale 属性 ,改成zh 或者 en


二. 如何自定义内容多语言配置

  1. 我们通过配置让ElementUI组件库内部支持了多语言配置,那我们自定义的内容部分:也就是没有使用elementUI的部分该如何实现多语言呢?

  1. 引入自定义语言配置文件

  1.    (因为这是做后台管理系统的,所以里面的配置文字跟后台管理匹配)

src/lang/zh.js (中文)

  1. export default {
  2. route: {
  3. dashboard: '首页',
  4. manage: '后台管理',
  5. users: '用户管理',
  6. menus: '菜单管理',
  7. logs: '日志管理',
  8. example: '示例',
  9. table: '数据列表',
  10. // permissions: '权限管理',
  11. // employees: '员工',
  12. // employeesList: '员工管理',
  13. // employeesInfo: '个人信息',
  14. postInfo: '岗位信息',
  15. manageSelf: '经理自助',
  16. setting: '设置',
  17. report: '报表',
  18. employeesAdd: '添加员工',
  19. EditiNfo: '编辑信息',
  20. print: '打印页面',
  21. form: '表单页',
  22. basicForm: '基础表单',
  23. stepForm: '分步表单',
  24. advancedList: '高级表单',
  25. step: '步骤',
  26. details: '详情页',
  27. BasicsDetails: '基础详情页',
  28. seniorDetails: '高级详情页',
  29. import: '导入',
  30. // 注册
  31. register: '人资-注册',
  32. login: '人资-登录',
  33. // 审批
  34. approvals: '审批', // 审批
  35. salaryApproval: '工资审核',
  36. enterApproval: '入职审核',
  37. leaveApproval: '申请请假',
  38. quitApproval: '申请离职',
  39. overtimeApproval: '加班申请',
  40. securitySetting: '审批设置',
  41. // 员工
  42. employees: '员工',
  43. employeesList: '员工列表',
  44. employeesInfo: '个人信息',
  45. employeesAdjust: '调岗',
  46. employeesLeave: '离职',
  47. employeesPrint: '打印',
  48. // 工资
  49. salarys: '工资',
  50. salarysList: '工资列表',
  51. salarysSetting: '工资设置',
  52. salarysDetails: '工资详情',
  53. salarysHistorical: '历史归档',
  54. salarysMonthStatement: '月报表',
  55. // 社保
  56. 'social_securitys': '社保',
  57. socialSecuritys: '社保管理',
  58. socialDetail: '详情',
  59. socialHistorical: '历史归档',
  60. socialMonthStatement: '当月报表',
  61. // 组织架构
  62. departments: '组织架构',
  63. 'departments-import': '引入',
  64. // 公司
  65. settings: '公司设置',
  66. // 考勤
  67. attendances: '考勤',
  68. usersApprovals: '用户审批',
  69. // saas企业
  70. 'saas-clients': '企业',
  71. 'saas-clients-details': '企业详情',
  72. // 权限
  73. 'permissions': '权限管理' // 权限管理
  74. },
  75. navbar: {
  76. search: '站内搜索',
  77. logOut: '退出登录',
  78. dashboard: '首页',
  79. github: '项目地址',
  80. screenfull: '全屏',
  81. theme: '换肤',
  82. lang: '多语言',
  83. error: '错误日志',
  84. companyName: '江苏传智播客教育科技股份有限公司'
  85. },
  86. login: {
  87. title: '人力资源管理系统',
  88. login: '登录',
  89. username: '账号',
  90. password: '密码',
  91. any: '随便填',
  92. thirdparty: '第三方登录',
  93. thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!'
  94. },
  95. tagsView: {
  96. close: '关闭',
  97. closeOthers: '关闭其它',
  98. closeAll: '关闭所有',
  99. refresh: '刷新'
  100. },
  101. table: {
  102. title: '请输入用户',
  103. search: '搜索',
  104. add: '添加',
  105. addUser: '新增用户',
  106. id: '序号',
  107. email: '邮箱',
  108. phone: '手机',
  109. name: '姓名',
  110. entryTime: '入职时间',
  111. hireForm: '聘用形式',
  112. jobNumber: '工号',
  113. department: '部门',
  114. managementForm: '管理形式',
  115. city: '工作城市',
  116. turnPositiveTime: '转正时间',
  117. permissionNew: '新增权限组',
  118. permissionUser: '权限组名称',
  119. imdsAi: '高级接口授权',
  120. avatar: '头像',
  121. introduction: '介绍',
  122. paddword: '密码',
  123. powerCode: '权限代码',
  124. powerDistriB: '权限分配',
  125. powerTitle: '权限标题',
  126. powerNav: '主导航',
  127. actions: '操作',
  128. edit: '编辑',
  129. delete: '删除',
  130. cancel: '取 消',
  131. confirm: '确 定',
  132. return: '返回',
  133. operationType: '操作类型',
  134. operationDate: '操作时间',
  135. date: '日期',
  136. submit: '提交',
  137. operator: '操作人',
  138. results: '执行结果',
  139. describe: '描述',
  140. save: '保存',
  141. signOut: '退出',
  142. reset: '重置',
  143. know: '我知道了',
  144. view: '查看'
  145. }
  146. }

src/lang/en.js (英文)

  1. export default {
  2. route: {
  3. dashboard: 'Dashboard',
  4. manage: 'manage',
  5. users: 'users',
  6. menus: 'menus',
  7. // permissions: 'permissions',
  8. logs: 'logs',
  9. example: 'example',
  10. table: 'table',
  11. postInfo: 'Job information',
  12. manageSelf: 'Manager self-help',
  13. setting: 'setting',
  14. report: 'report',
  15. employeesAdd: 'add employees',
  16. EditiNfo: 'Edit information',
  17. print: 'print',
  18. form: 'form',
  19. basicForm: 'basic form',
  20. stepForm: 'step form',
  21. advancedList: 'advanced form',
  22. step: 'step',
  23. details: 'details',
  24. BasicsDetails: 'Basic details page',
  25. seniorDetails: 'Advanced details page',
  26. import: 'Import',
  27. register: 'HRM-Register',
  28. // 登录
  29. login: 'HRM-Login',
  30. // 审批
  31. approvals: 'Approvals', // 审批
  32. salaryApproval: 'Salary-Approval',
  33. enterApproval: 'Enter-Approval',
  34. leaveApproval: 'Leave-Approval',
  35. quitApproval: 'Quit-Approval',
  36. overtimeApproval: 'Overtime-Approval',
  37. securitySetting: 'Security-Setting',
  38. // 员工
  39. employees: 'Employees',
  40. employeesList: 'Employees-List',
  41. employeesInfo: 'Employees-Info',
  42. employeesAdjust: 'Employees-Adjust',
  43. employeesLeave: 'Employees-Leave',
  44. employeesPrint: 'Employees-Print',
  45. // 工资
  46. salarys: 'salarys',
  47. salarysList: 'Salarys-List',
  48. salarysSetting: 'Salarys-Setting',
  49. salarysDetails: 'Salarys-Details',
  50. salarysHistorical: 'Salarys-Historical',
  51. salarysMonthStatement: 'Salarys-Month',
  52. // 社保
  53. 'social_securitys': 'Social',
  54. socialSecuritys: 'Social-Securitys',
  55. socialDetail: 'Social-Detail',
  56. socialHistorical: 'Social-Historical',
  57. socialMonthStatement: 'Social-Month',
  58. // 组织架构
  59. departments: 'departments',
  60. 'departments-import': 'import',
  61. // 公司
  62. settings: 'Company-Settings',
  63. // 考勤
  64. attendances: 'Attendances',
  65. // 用户审批
  66. usersApprovals: 'Users-Approvals',
  67. // 企业
  68. 'saas-clients': 'Saas-Clients',
  69. 'saas-clients-details': 'Saas-Details',
  70. 'permissions': 'permissions' // 权限管理
  71. },
  72. navbar: {
  73. search: 'search',
  74. logOut: 'Log Out',
  75. dashboard: 'Dashboard',
  76. github: 'Github',
  77. screenfull: 'screenfull',
  78. theme: 'theme',
  79. lang: 'i18n',
  80. error: 'error log',
  81. companyName: 'Jiangsu Chuanzhi podcast Education Technology Co., Ltd'
  82. },
  83. login: {
  84. title: 'itheima login',
  85. login: 'Log in',
  86. name: 'name',
  87. entryTime: 'entry time',
  88. hireForm: 'hire form',
  89. jobNumber: 'job number',
  90. department: 'department',
  91. managementForm: 'management form',
  92. city: 'city',
  93. turnPositiveTime: 'turn positive time',
  94. password: 'Password',
  95. any: 'any',
  96. thirdparty: 'Third',
  97. thirdpartyTips: 'Can not be simulated on local, so please combine you own business simulation! ! !'
  98. },
  99. tagsView: {
  100. close: 'Close',
  101. closeOthers: 'Close Others',
  102. closeAll: 'Close All',
  103. refresh: 'refresh'
  104. },
  105. table: {
  106. title: 'Title',
  107. search: 'Search',
  108. add: 'add',
  109. addUser: 'addUser',
  110. id: 'ID',
  111. email: 'Email',
  112. phone: 'Phone',
  113. username: 'User',
  114. permissionNew: 'permissionNew',
  115. permissionUser: 'Permission',
  116. imdsAi: 'Advanced interface authorization',
  117. avatar: 'Avatar',
  118. introduction: 'Introduction',
  119. paddword: 'paddWord',
  120. powerCode: 'Permission code',
  121. powerTitle: 'Permission title',
  122. actions: 'Actions',
  123. edit: 'Edit',
  124. delete: 'Delete',
  125. cancel: 'Cancel',
  126. confirm: 'Confirm',
  127. operationType: 'operationType',
  128. operationDate: 'operationDate',
  129. date: 'Date',
  130. operator: 'operator',
  131. results: 'results of enforcement',
  132. describe: 'Pedagogical operation',
  133. save: 'save',
  134. signOut: 'sign out',
  135. submit: 'submit',
  136. reset: 'reset',
  137. know: 'I Know',
  138. return: 'return',
  139. view: 'view'
  140. }
  141. }

2. 配置

在上一个小结里面的 src/lang/index.js

  1. import Vue from 'vue'
  2. import VueI18n from 'vue-i18n'
  3. import elementEN from 'element-ui/lib/locale/lang/en'
  4. import elementZH from 'element-ui/lib/locale/lang/zh-CN'
  5. // 引入自定义中文包
  6. + import customZH from './zh'
  7. // 引入自定义英文包
  8. + import customEN from './en'
  9. Vue.use(VueI18n)
  10. // 创建国际化插件的实例
  11. export default new VueI18n({
  12. // 指定语言类型
  13. locale: 'zh',
  14. messages: {
  15. en: {
  16. ...elementEN, // 将饿了么的英文语言包引入
  17. + ...customEN // 将自定义英文包加入
  18. },
  19. zh: {
  20. ...elementZH, // 将饿了么的中文语言包引入
  21. + ...customZH // 将自定义中文包加入
  22. }
  23. }
  24. })

3. 举个例子:

目标:

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21762447/1625492570770-762cc832-70fd-4146-996f-a25bb2faf333.png#clientId=u589f3e93-776c-4&from=paste&height=116&id=u05e35c00&margin=%5Bobject%20Object%5D&name=image.png&originHeight=116&originWidth=469&originalType=binary&ratio=1&size=19889&status=done&style=none&taskId=u22e68bf9-da21-485f-ad86-6ec92e62fbf&width=469)

1. 准备两套翻译文案

在en.js和zh.中分别设置companyName

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/21762447/1625492638707-ba009154-73de-419b-aad2-191ddec22ec5.png#clientId=u589f3e93-776c-4&from=paste&height=388&id=u2bcf57d4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=388&originWidth=569&originalType=binary&ratio=1&size=87458&status=done&style=none&taskId=u705a47fb-a1e1-4b15-aeed-7f218cef086&width=569)

2. 修改模板的渲染

用 $t(‘属性名’) 来生成标题。这里的$t是引入了i18n之后,自动挂载在vue实例上的功能。

  1. <div class="app-breadcrumb">
  2. {{ $t('navbar.companyName') }}
  3. <span class="breadBtn">体验版</span>
  4. </div>

3. 手动将locale进行 en和zh切换查看效果

  1. src/lang/index.js 下面
  1. export default new VueI18n({
  2. // 切换这里试试 en
  3. locale: 'zh'
  4. ...
  5. })

三: 实现动态切换中英文

背景:现在我们虽然已经实现了中英文切换的核心逻辑,但是是死的,不能动态切换

目标:  点击中英文按钮,弹出下拉框,当我们点击中文和en的时候可以实现动态的切换当前的语言

思路: 点击下拉框时把当前选择的语言赋值给this.$i18n.locale属性即可

           image.png

  1.封装多语言组件

     在放置公共组件的位置: src/components/Lang/index.vue

  

  1. <template>
  2. <el-dropdown trigger="click" @command="changeLanguage">
  3. <div>
  4. <svg-icon style="color:#fff;font-size:20px" icon-class="language" />
  5. </div>
  6. <el-dropdown-menu slot="dropdown">
  7. <el-dropdown-item command="zh" :disabled="'zh'=== $i18n.locale ">中文</el-dropdown-item>
  8. <el-dropdown-item command="en" :disabled="'en'=== $i18n.locale ">en</el-dropdown-item>
  9. </el-dropdown-menu>
  10. </el-dropdown>
  11. </template>
  12. <script>
  13. export default {
  14. methods: {
  15. changeLanguage(lang) {
  16. this.$i18n.locale = lang // 设置给本地的i18n插件
  17. this.$message.success('切换多语言成功')
  18. }
  19. }
  20. }
  21. </script>

               
 注意:icon-class=”language” 需要在src\icons\svg\下有一个名为language.svg的文件。

 2.全局注册

       在component/index.js中进行全局组件注册      

  1. import Lang from './Lang'
  2. export default {
  3. // 插件的初始化, 插件给你提供的全局的功能, 都可以在这里配置
  4. install(Vue) {
  5. // 进行组件的全局注册
  6. Vue.component('Lang', Lang)
  7. }
  8. }

       

 3.引入并使用组件

  1. <!-- 语言包 -->
  2. <lang class="right-menu-item" />
  3. <!-- 全屏组件 -->
  4. <screen-full class="right-menu-item" />

  


总结: 

视图代码:{{ $t(‘xx.xxxx’)}}

自动切换:this.$i18n.locale= ‘zh’