我正在尝试使用sfc方法将v-i18n实施到我的项目中。我无法使其工作。我不会让您对我的项目感到困惑,这就是为什么在v-i18n sfc官方示例中添加了10-15行代码来进行修改的原因。
这很简单地显示了我的问题。
对于那些喜欢的人,请在github上检查这个非常小的问题项目
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')
的修改。
我该如何运作?
答案 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。