基于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
        }
 }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容