具有值属性的vue-i18n $ t无法翻译

时间:2019-10-13 07:40:24

标签: vue.js vue-i18n

我正在尝试导入.json文件以用作翻译文件。

<template>
    <template v-slot:footer>
      <div>{{ $t('menu.file.new.label', $i18n.locale, locale) }}</div> <--Issue outputs menu.file.new.label
    </template>
</template>

<script>
import locale from '@/locales/modules/messaging.json'

export default {
  data() {
    return {
      locale: locale
    }
  }
}
</script>

messaging.json的语言环境没有任何错误,如果我将以下内容添加到顶部,则可以正常工作

<i18n src="@/locales/modules/messaging.json"></i18n>

并将功能参数更改为排除$i18n.localelocale,并且可以使用。不幸的是,这不是一个选项,因为我想将数据传递给孙子组件。但是,如果我可以将孙子配置为使用他们的祖父母翻译数据也可以。.

我怎么能得到:

  1. 以上工作方式
  2. 或者,使用孙子中的祖父母翻译数据
  3. 或者,根据prop(要导入的翻译文件的位置)在孙子中动态导入翻译数据

谢谢

2 个答案:

答案 0 :(得分:1)

我找到了解决方法

<template>
  <st-age v-bind:menus="menu" v-bind:locale="locale[$i18n.locale].menu">
    <template v-slot:content>message: {{ $route.params }}</template>
    <template v-slot:footer>
      <div>{{ $t('menu.file.label') }}</div>
    </template>
  </st-age>
</template>

<script>
import menu from './menu'
import locale from '@/locales/modules/messaging.json'

export default {
  data() {
    return {
      menu: menu,
      locale: locale
    }
  },
  i18n: {
    messages: locale
  },
  components: {
    'st-age': () => import('@/components/layout/stage/container')
  }
}
</script>

<style>
</style>

locale[$i18n.locale].menu正在传递我实际需要的翻译数据,而不是整个对象(也可以)

在子组件中,我只是将此数据作为道具传递给孙子

在孙子i

 mounted() {
    this.$i18n.setLocaleMessage(this.$i18n.locale, this.locale)
  }

其中this.locale是翻译数据,$t('file')产生我在最初导入的全局翻译数据中设置为en.menu.file的任何内容

答案 1 :(得分:0)

首先,您应该创建一个如下所示的插件:

src / plugins / i18n.js:

import Vue from 'vue';
import VueI18n from 'vue-i18n';

const DEFAULT_LOCALE = 'en';

Vue.use(VueI18n);

const i18n = new VueI18n({
    locale: yourLocale || DEFAULT_LOCALE, // set locale either from localStorage or config
    fallbackLocale: DEFAULT_LOCALE,
    messages: require('messages.json'), // set locale messages
    sharedMessages: require('other.json if exist'),
    silentFallbackWarn: true,
});

export default i18n;

然后从main.js调用它进行全球化:

import i18n from './plugins/i18n.js';
...
new Vue({
    i18n,
    router,
...
    render: h => h(App),
}).$mount('#app');

然后,如果要继续处理自定义消息,则可以使用以下i18n块进行设置:

<script>
data(){
...
}
methods: ...
i18n: {
 messages: require(your json path....)
}
</script>

然后您可以这样称呼它:

$t('test');