Vue-i18n单个文件组件不起作用

时间:2019-05-14 07:25:10

标签: vue.js vuejs2 vue-i18n

我正在尝试使用sfc方法将v-i18n实施到我的项目中。我无法使其工作。我不会让您对我的项目感到困惑,这就是为什么在v-i18n sfc官方示例中添加了10-15行代码来进行修改的原因。

这很简单地显示了我的问题。

对于那些喜欢的人,请在github上检查这个非常小的问题项目

  

https://github.com/berkansivri/V-i18n-Question

Component1.vue

<template>
    <p>{{$t('lang')}}</p>
</template>

<i18n>
{
  "en":{
    "lang" : "English"
  },
  "es":{
    "lang": "Espanol"
  }
}
</i18n>

App.vue

<template>
  <div id="app">
    <label for="locale">locale</label>
    <select v-model="locale">
      <option>en</option>
      <option>es</option>
    </select>
    <p>message: {{ $t('hello') }}</p>
    <Comp1></Comp1>
  </div>
</template>

<i18n>
{
  "en": {
    "hello": "hello"
  },
  "es": {
    "hello": "hola"
  }
}
</i18n>

<script>
import Comp1 from './components/component1'
export default {
  components:{
    Comp1
  },
  name: 'App',
  data () { return { locale: 'en' } },
  watch: {
    locale (val) {
      this.$i18n.locale = val
    }
  }
}
</script>

因此,多个组件中有多个<i18n>标签。我只是从App.vue修改了$ i18n.locale,但是它没有在Component1上触发相关的i18n函数$t('lang'),而是对其自身进行了$t('hello')的修改。 我该如何运作?

2 个答案:

答案 0 :(得分:0)

使用vue devtools,您将发现$ i18n单个文件组件中的消息彼此不同,因此它们是不同的对象。

你需要做的是:

i18n.js

import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from '@/lang'

Vue.use(VueI18n)

const i18n = new VueI18n({
  locale: 'cn',
  fallbackLocale: 'en',
  messages
})

export default i18n

App.vue

import i18n from "./i18n.js"
i18n.locale = "en"

答案 1 :(得分:0)

这是单个文件组件的预期行为。如果要更改所有组件的所有语言环境,可以使用:

locale (val) {
  // this.$i18n.locale = val
  this.$root.$i18n.locale = val
}

请参阅此issue