vue.js - 如何在 vuex 商店中存储 $i18n.locale?
问题描述
使用选择列表设置语言(使用 kazupon/vue-i18n 插件):
<select v-model="$i18n.locale" class="nav__lang-switcher">
<option v-for="(lang, i) in langs" :key="`lang${i}`" :value="lang.value">{{ lang.label }}</option>
</select>
但是语言变化并没有持续存在,因为它没有存储在任何地方。
这是改变语言状态的动作:
actions: {
changeLanguage (context) {
context.commit('changeLanguage')
}
}
但是我如何$i18n.language
从 vuex 商店访问?
解决方案
您可以this.$i18n
作为参数传递给操作
actions: {
changeLanguage (context, payload) {
context.commit('changeLanguage')
payload.i18n.locale = payload.lang
}
}
在您的组件中,有一个地方可以更改:
onLanguageChange () {
this.changeLanguage({ lang: this.selectedLang, i18n: this.$i18n })
}
更多思考
您也应该存储lang
在 localStorage 中。如果用户硬刷新页面,我们仍然可以从本地存储加载 lang:
就像是:
const LANG_KEY = 'language'
const initLang = (() => {
let lang = window.localStorage.getItem(LANG_KEY) || window.navigator.language
return lang || 'en'
})()
const state = {
lang: initLang
}
const actions = {
changeLanguage ({ commit }, payload) {
commit('onLangChanged', payload)
}
}
const mutations = {
onLangChanged (state, payload) {
window.localStorage.setItem(LANG_KEY, payload.lang)
payload.i18n.locale = payload.lang
state.lang = payload.lang
}
}
推荐阅读
- jquery - jQuery AJAX 循环点击事件
- c++ - 温纳皮。CreateWindow 中的 TrackPopupMenuEx 等效项
- javascript - 在引导程序中使元素溢出 col
- arrays - 是否可以在 Amazon Pinpoint 模板中添加对象数组作为替换值?
- gitlab-api - 如何将用户添加到受保护的分支?
- javascript - 条形超出 d3 条形图中的图表范围
- command - 在我的世界中对箭头周围的实体执行命令
- parsing - 自上而下递归解析器的语法无效
- powerbi - 如何根据在 DAX 中应用切片器的支出获得前 1 供应商名称?
- python - “从 object_detection 导入 model_lib_v2”时出现分段错误