vue.js 过滤器中怎么调用 i18n 对象获取相应语言?

定义了一个 filter/index.js 文件,里面 export 出很多 function,如下:


export function parseTime(time, cFormat) {
  //省略逻辑部分
  return time_str;
}

然后在 main 里面注册该过滤器,如下:

import * as filters from './filters'

Object.keys(filters).forEach(key => {
  Vue.filter(key, filters[key])
});

项目多语言是通过vue-i18n实现的,我想要实现一个功能,通过状态编号,配合过滤器,把状态id转换成相应语言的文字描述。

但是现在有一个问题,因为过滤器是一个js文件,没办法this.$t()这些方式来获取vue-i18n对象,该怎么做呢?

阅读 10.9k
5 个回答

思路:
1、分别把多语言都倒入到过滤器里面;
2、在过滤器中可以通过封装的模块获取当前语言,然后根据多语言决定使用哪个语言信息模块对象;

不过这么看来,vue.js 文件可以通过不刷新来切换多语言有点鸡肋了,以为模块化的话就必须有一部分单独提取到.js文件里面,但是.js文件里米娜的内容并不支持这种方式切换。

有人有更好的方法么?

给过滤器传参数,

新手上路,请多包涵
  1. 直接在过滤器的js中引入i18n的实例
// i18n.js
const i18n = new VueI18n({
  locale: 'zh',
  messages
})
export default i18n

// filters.js
import i18n from 'src/i18n/i18n'
然后调用i18n.t
  1. 在a.vue中定义t函数,然后给过滤器传参
methods:{
  t(...params){
    return this.$t.apply(this,params)
  }
},
filters:{
    filteA(t){
        return t('something.a')
    }
}

你这样写不在vue中,需要包起来,直接在main.js的new Vue 赋给一个变量,然后再从变量中获取就可以了
如 main.js中
window.vm= new Vue({
// 单独js 中,
window.vm.$i18n.t('XXX')

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题