基于vue+element-ui按需加载全局组件的国际化

1 首先大家安装 vue-i18n

 npm install vue-i18n  --save

2 在 main 文件中

import VueI18n from 'vue-i18n'
Vue.use(VueI18n) // 通过插件的形式挂载

3 现在可以再src目录下创建一个lang文件夹

目录结构
├─src
    ├─lang
        ├─en.js  英文包
        ├─zh.js  中文包
        └─kor.js  韩文包
以zh.js文件举例 其内容如下,其余的像en.js、 kor.js一样 只不过后面的值是其他语言

'use strict';

exports.__esModule = true;
exports.default = {
  el: {
    colorpicker: {
      confirm: '确定',
      clear: '清空'
    },
    datepicker: {
      now: '此刻',
      today: '今天',
      cancel: '取消',
      clear: '清空',
      confirm: '确定',
      selectDate: '选择日期',
      selectTime: '选择时间',
      startDate: '开始日期',
      startTime: '开始时间',
      endDate: '结束日期',
      endTime: '结束时间',
      prevYear: '前一年',
      nextYear: '后一年',
      prevMonth: '上个月',
      nextMonth: '下个月',
      year: '年',
      month1: '1 月',
      month2: '2 月',
      month3: '3 月',
      month4: '4 月',
      month5: '5 月',
      month6: '6 月',
      month7: '7 月',
      month8: '8 月',
      month9: '9 月',
      month10: '10 月',
      month11: '11 月',
      month12: '12 月',
      // week: '周次',
      weeks: {
        sun: '日',
        mon: '一',
        tue: '二',
        wed: '三',
        thu: '四',
        fri: '五',
        sat: '六'
      },
      months: {
        jan: '一月',
        feb: '二月',
        mar: '三月',
        apr: '四月',
        may: '五月',
        jun: '六月',
        jul: '七月',
        aug: '八月',
        sep: '九月',
        oct: '十月',
        nov: '十一月',
        dec: '十二月'
      }
    },
    select: {
      loading: '加载中',
      noMatch: '无匹配数据',
      noData: '无数据',
      placeholder: '请选择'
    },
    cascader: {
      noMatch: '无匹配数据',
      loading: '加载中',
      placeholder: '请选择',
      noData: '暂无数据'
    },
    pagination: {
      goto: '前往',
      pagesize: '条/页',
      total: '共 {total} 条',
      pageClassifier: '页'
    },
    messagebox: {
      title: '提示',
      confirm: '确定',
      cancel: '取消',
      error: '输入的数据不合法!'
    },
    upload: {
      deleteTip: '按 delete 键可删除',
      delete: '删除',
      preview: '查看图片',
      continue: '继续上传'
    },
    table: {
      emptyText: '暂无数据',
      confirmFilter: '筛选',
      resetFilter: '重置',
      clearFilter: '全部',
      sumText: '合计'
    },
    tree: {
      emptyText: '暂无数据'
    },
    transfer: {
      noMatch: '无匹配数据',
      noData: '无数据',
      titles: ['列表 1', '列表 2'],
      filterPlaceholder: '请输入搜索内容',
      noCheckedFormat: '共 {total} 项',
      hasCheckedFormat: '已选 {checked}/{total} 项'
    },
    image: {
      error: '加载失败'
    },
    pageHeader: {
      title: '返回'
    }
  },
  //测试模块
  m: {
    appCode: '软件',
    roleNameLike: '角色',
    roleCodeLike: '角码',
    seach: '查',
    reset: '重置',
    total: '共',
    page: '条',
    menuRole: '菜单角色',
    name: '名称',
    code: '编码',
    createdUser: '创建人',
    createTime: '创建时间',
    roleSource: '来源',
    remark: '备注'
  }
};

举例:

​ 如果我想以上述zh.js 中最后的 remark:‘备注’ 作为变量的话 我可以这么写 this.$t("m.remark")

4 语言包写好了之后 我们再回到 main.js 文件

我们发现 main文件中 引入了这个js,作用是按需注册全局element组件,我们进入这个 '@/libs/element'文件

import '@/libs/element'

我们需要对这个文件 进行简单的修改,因为它将element-ui的语言包写死了

这些注释的地方全部去掉
// // 循环注册全局组件
// components.forEach(item => {
//     Vue.use(item)
// })

// locale.use({
//     el: {
//         ...enLocale.el,这一行是它写死的部分 看了一下他这个文件的use源码,只能写入一个lang默认汉语
//         pagination: {
//             goto: '',
//             pagesize: '',
//             total: '共 {total} 条',
//             pageClassifier: ''
//         }
//     }
// })

同时我们要在 最后一行 ,将这些组件全部暴露出来
export default components

当我们回到 main文件就可以这么引用了

import comps from '@/libs/element'

然后再引入 这个其实是为了实现 element-ui组件的语言切换

import locale from 'element-ui/lib/locale';

然后重点 我们快实例化i18n 也就是要快使用了

引入我们之前准备好的语言包
import enLocale from './lang/en'
import zhLocale from './lang/zh'
import koLang from './lang/kor'

//然后创建,message 然后将语言包和语言名关联起来 结构如下
const messages = {
  en: {
    ...enLocale 
  },
  zh: {
    ...zhLocale 
  },
  ko: {
    ...koLang
  }
}

//我们new 一个 i18n 实例 默认语言 zh 中文 将message方法挂载到实例上
// Create VueI18n instance with options
const i18n = new VueI18n({
  locale: 'zh', // set locale
  messages, // set locale messages
})

//还记得上面引入的comps吗。我们现在开始要注册全局element组件了
comps.forEach(item => {
    Vue.use(item)
})

//这一步是为了实现element组件的多语言切换 想了解更多可以看element-ui/lib/locale 文件里面的源码
locale.i18n((key, value) => i18n.t(key, value))

//最终一步是为了将i18n 挂载到vue 实例上
new Vue({
    router,
    store,
    render: h => h(App),
    i18n
}).$mount('#app')

完成!


5 关于使用

其实前面已经提过了,

我们可以先在 lang文件夹 里面的语言文件写入对应的翻译,

然后变量用 this.$t("m.menuRole") 这样的写法代替

那我们如何切换语言?其实也很简单 如下

 <el-select class="position" @change="handleChange" v-model="lang">
    <el-option :label="'中文简体'" :value="'zh'"></el-option>
    <el-option :label="'English'" :value="'en'"></el-option>
    <el-option :label="'한국어'" :value="'ko'"></el-option>
 </el-select>

 data() {
        return {
            lang: 'zh'
        }
    },
 methods: {
     handleChange() {
            this.$i18n.locale = this.lang
        }
 }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容