vue-i18n 集成 vuex 后不更新语言环境
vue-i18n doesn't update locale after integrating vuex
我还是 Vue 的新手,但我觉得我几乎掌握了它的窍门。我设法创建了一个可以翻译成不同语言的应用程序,其中的内容是从 LANG.json 文件.. 问题是每当我切换到新视图时,它就会变回原来的翻译..
所以我尝试将 Vuex 集成到我的应用程序中,但我似乎无法让它工作..
我相信这是所有相关代码:
src/i18n/index.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import store from './../store'
Vue.use(VueI18n)
export default new VueI18n({
locale: store.state.Language,
messages: {
'en': require('./en.json'),
'cn': require('./cn.json')
}
})
src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const actions = {
changeLanguage: ({ commit }, data) => commit('changeLanguage', data)
}
const mutations = {
changeLanguage (state, data) {
this.state.Language = data
}
}
const getters = {
getLanguage: state => state.Language
}
const state = {
Language: 'en'
}
export default new Vuex.Store({
state,
getters,
actions,
mutations
})
src/main.js
[...]
import store from './store'
import i18n from './i18n'
[...]
new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
})
src/components/randomfile.js
<template>
[...]
<button v-on:click="en">English</button>
<button v-on:click="cn">Chinese</button>
</template>
<script>
export default {
name: 'navFooter',
data () {
return {
}
},
methods: {
en: function () {
console.log('change lang')
this.$store.dispatch('changeLanguage', 'en')
// this.$i18n.locale = 'en'
},
cn: function () {
this.$store.dispatch('changeLanguage', 'cn')
// this.$i18n.locale = 'cn'
}
}
}
</script>
我猜问题要么与这一行有关:locale: store.state.Language
,要么是因为我在发送时做错了什么,因为在我的一个观点中我写了 {{$store.state.Language}}
,它在页面加载时呈现为 en
,但在我单击调用调度方法的按钮后消失。
我用 {{ $t('views.home.title') }}
调用翻译,但我很确定这仍然是集成 vuex(商店)后调用它们的方式,并且翻译确实按应有的方式出现,只是没有单击发送 changeLanguage 的按钮后更新。
如有任何帮助,我们将不胜感激
编辑:实际上,我翻译的方式似乎确实有所不同..将其更改为{{ $t('views.home.title', $store.state.Language) }}
(也许应该是this.$store.state.Language
?)然后翻译又开始工作了..但翻译状态仍然不是持久的(意思是如果我刷新页面或打开一个新的URL,然后它会变回英文翻译...
知道这是为什么吗?
Vuex 存储未持久化。重新加载页面会将其重置。
要保留语言环境,您应该将其存储在本地存储(如 IndexedDB)或后端服务器中。
另一种方法(不持久)是像 /:locale/page
一样将其嵌入 URL。然后你可以从路由器参数中获取语言环境。
$t('views.home.title')
使用来自 this.$i18n.locale
的区域设置并且您不更新 this.$i18n.locale
,然后 $t('views.home.title')
显示初始区域设置的翻译,'en'
.
$t('views.home.title', $store.state.Language)
之所以有效,是因为您自己指定了语言环境,而不是使用 this.$i18n.locale
.
我还是 Vue 的新手,但我觉得我几乎掌握了它的窍门。我设法创建了一个可以翻译成不同语言的应用程序,其中的内容是从 LANG.json 文件.. 问题是每当我切换到新视图时,它就会变回原来的翻译..
所以我尝试将 Vuex 集成到我的应用程序中,但我似乎无法让它工作..
我相信这是所有相关代码:
src/i18n/index.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import store from './../store'
Vue.use(VueI18n)
export default new VueI18n({
locale: store.state.Language,
messages: {
'en': require('./en.json'),
'cn': require('./cn.json')
}
})
src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const actions = {
changeLanguage: ({ commit }, data) => commit('changeLanguage', data)
}
const mutations = {
changeLanguage (state, data) {
this.state.Language = data
}
}
const getters = {
getLanguage: state => state.Language
}
const state = {
Language: 'en'
}
export default new Vuex.Store({
state,
getters,
actions,
mutations
})
src/main.js
[...]
import store from './store'
import i18n from './i18n'
[...]
new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
})
src/components/randomfile.js
<template>
[...]
<button v-on:click="en">English</button>
<button v-on:click="cn">Chinese</button>
</template>
<script>
export default {
name: 'navFooter',
data () {
return {
}
},
methods: {
en: function () {
console.log('change lang')
this.$store.dispatch('changeLanguage', 'en')
// this.$i18n.locale = 'en'
},
cn: function () {
this.$store.dispatch('changeLanguage', 'cn')
// this.$i18n.locale = 'cn'
}
}
}
</script>
我猜问题要么与这一行有关:locale: store.state.Language
,要么是因为我在发送时做错了什么,因为在我的一个观点中我写了 {{$store.state.Language}}
,它在页面加载时呈现为 en
,但在我单击调用调度方法的按钮后消失。
我用 {{ $t('views.home.title') }}
调用翻译,但我很确定这仍然是集成 vuex(商店)后调用它们的方式,并且翻译确实按应有的方式出现,只是没有单击发送 changeLanguage 的按钮后更新。
如有任何帮助,我们将不胜感激
编辑:实际上,我翻译的方式似乎确实有所不同..将其更改为{{ $t('views.home.title', $store.state.Language) }}
(也许应该是this.$store.state.Language
?)然后翻译又开始工作了..但翻译状态仍然不是持久的(意思是如果我刷新页面或打开一个新的URL,然后它会变回英文翻译...
知道这是为什么吗?
Vuex 存储未持久化。重新加载页面会将其重置。
要保留语言环境,您应该将其存储在本地存储(如 IndexedDB)或后端服务器中。
另一种方法(不持久)是像 /:locale/page
一样将其嵌入 URL。然后你可以从路由器参数中获取语言环境。
$t('views.home.title')
使用来自 this.$i18n.locale
的区域设置并且您不更新 this.$i18n.locale
,然后 $t('views.home.title')
显示初始区域设置的翻译,'en'
.
$t('views.home.title', $store.state.Language)
之所以有效,是因为您自己指定了语言环境,而不是使用 this.$i18n.locale
.