Vue-i18n 在 JS 文件中如何使用

开发 前端
在Vue.js项目中,vue-i18n是一个比较流行的多语言方案。常规用法是在项目入口文件里,将它作为插件引入,然后在 .vue文件或者组件模板里按照 API 来调用就行。插件会自动往组件实例中注入$t方法。

 [[350712]]

在Vue.js项目中,vue-i18n是一个比较流行的多语言方案。常规用法是在项目入口文件里,将它作为插件引入,然后在 .vue文件或者组件模板里按照 API 来调用就行。插件会自动往组件实例中注入$t方法。

  1. const messages = { 
  2.   en: { 
  3.     message: { 
  4.       hello: 'hello world' 
  5.     } 
  6.   }, 
  7.   cn: { 
  8.     message: { 
  9.       hello: '你好世界' 
  10.     } 
  11.   } 
  12.  
  13. // Create VueI18n instance with options 
  14. const i18n = new VueI18n({ 
  15.   locale: 'cn', // set locale 
  16.   messages, // set locale messages 
  17. }) 
  18. new Vue({ i18n }).$mount('#app'
  19.  
  20. //App.vue 
  21. <div id="app"
  22.   <p>{{ $t("message.hello") }}</p> 
  23. </div> 
 

问题来了,如果不在组件模板里怎么办?比如一些工具函数,请求拦截器等跟视图无关的JS代码中如何使用呢?插件的使用场景是在组件内部,也就是能访问到组件实例的地方。对于其他地方的使用方法,官方文档里貌似没有提供直接的 API。摸索了一段时间终于解决,在此记录下。

  1. import VueI18n from 'vue-i18n'
  2. const messages = { 
  3.   en: { 
  4.     message: { 
  5.       hello: 'hello world' 
  6.     } 
  7.   }, 
  8.   cn: { 
  9.     message: { 
  10.       hello: '你好世界' 
  11.     } 
  12.   } 
  13. const i18n = new VueI18n({ 
  14.   locale: 'cn', // set locale 
  15.   messages: messages , // set locale messages 
  16. }); 
  17.  
  18. console.log(i18n.tc('message.hello')) // 你好世界 

搭配 VS Code 插件

随着项目规模的扩大,文本标签会越来越多,手动维护非常麻烦。同时,模板里用"a.b.c"这样的属性字符串来引用文本,在源码层面非常不易阅读。这些问题,都应该由工具来解决。之前想过自己开发一个 VS Code 插件来解决这些问题,没想到早就有人做好了。开源社区就是这么强大,你能想到的,早就有人做了。这个插件就叫 Vue i18n。

Vue i18n

早期版本不怎么好用,本人还提过 PR 修过缺陷。现在比较完善了,功能齐全,操作便捷。可以选中文本一键生成中英文,键名默认是组件路径加随机串,省去了命名的烦恼。还能在编辑器里直接看到对应的中文,鼠标悬浮显示英文。总之比较方便,推荐使用。

前面介绍了vue-i18n在 Vue 组件外部使用的方法,但是对于这个 VS Code 插件有点小问题要解决。插件是根据源码的字符串来匹配,然后在编辑器显示出对应的文本。因此,源码里一定要有 $t('xxx')字样才行。

改成这样就能显示出来了:

看起来没问题,但实际上运行会报错:

运行时异常

这是为什么呢?点击错误信息的调用栈进去看源码,发现原来i18n.tc这个方法是绑定到this(运行时指向VueI18n对象)上去执行的,而这里的代码执行的时候并没有this,所以是undefined。

  1. VueI18n.prototype.tc = function tc (key, choice) { 
  2.     var ref; 
  3.     var values = [], len = arguments.length - 2; 
  4.     while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ]; 
  5.   return (ref = this)._tc.apply(ref, [ key, this.locale, this._getMessages(), null, choice ].concat( values )) 
  6. }; 

所以,这里不能直接拿来调用,需要改变执行上下文。重新封装下这个方法:

  1. import Vue from 'vue'
  2. import VueI18n from 'vue-i18n'
  3. import i18nLabels from '@/i18n'
  4.  
  5. Vue.use(VueI18n); 
  6. export const i18n = new VueI18n({ 
  7.   locale: 'zh', // set locale 
  8.   messages: i18nLabels, // set locale messages 
  9. }); 
  10.  
  11. // 重新封装方法 
  12. export function $t(args) { 
  13.   return i18n.tc.call(i18n, args); 

使用的时候导入这个方法就行了。

本文转载自微信公众号「1024译站」,可以通过以下二维码关注。转载本文请联系1024译站公众号。

 

责任编辑:武晓燕 来源: 1024译站
相关推荐

2017-07-14 10:10:08

Vue.jsMixin

2023-09-05 15:23:06

开发应用鸿蒙

2020-12-03 07:43:03

JS Ajax JavaScript

2015-08-19 09:21:19

国际电话区号代码实践

2021-04-17 18:24:04

Vue.js嵌套路由前端

2019-07-26 14:40:58

Vue.jsSocket.IO前端

2020-09-22 07:35:42

Node.jsVue.js文件压缩

2019-05-05 15:20:32

Linuxiotop磁盘

2010-08-06 13:22:48

FlexCSS

2022-08-30 23:40:32

JavaScrip图表Chart.js

2021-05-08 06:14:28

Vue.js片段开发

2022-09-20 12:21:25

Vue2Vue3$attrs

2023-07-18 07:19:59

2016-12-19 15:35:10

Web开发者jQueryi18n

2022-01-11 17:23:12

配置Node.jsNode

2023-07-28 13:55:40

便捷选项组件

2019-09-24 20:07:30

Linux移动文件 命令

2010-03-22 11:07:18

Python常用模块I

2010-03-15 17:26:58

Python字典

2019-11-22 10:00:53

ICC配置文件Windows 10
点赞
收藏

51CTO技术栈公众号