iview-admin多语言切换文字
原因分析:
data里的数据this.
t
(
′
h
o
m
e
u
s
e
r
i
n
c
r
e
m
e
n
t
′
)
在
渲
染
时
已
经
“
定
死
”
了
,
在
切
换
语
言
时
,
并
没
有
对
界
面
里
的
该
数
据
t
h
i
s
.
t('home_user_increment')在渲染时已经“定死”了,在切换语言时,并没有对界面里的该数据this.
t(′homeuserincrement′)在渲染时已经“定死”了,在切换语言时,并没有对界面里的该数据this.t(‘home_user_increment’)进行重新执行更新,显然无法实现语言切换。
解决思路:
针对分析,咱想办法把this.$t(‘home_user_increment’)这玩意儿在触发切换语言后再执行一下,细想了下vue的触发更新,于是思路如下走:
首先想到了watch,但是要考虑到之后界面所有文本都需要切语言的啊!!!你watch不累吗
不对呀,只需要watch lang就可以了,正好language.vue这个多语言组件切换的实现也是用的watch: {lang (lang) {this.$i18n.locale = lang}}我们只需要在这里执行相关更新的代码就应该能行了
好,触发方式ok了,执行怎么样的更新呢?为了满足我们的需求,我们得刷新整个界面的文本
那刷新整个界面的文本 = 刷新整个界面,那我直接刷app.vue这个根组件就行了嘛
我就采用了vue的provide和inject方法,app根组件这用v-if来进行界面重载,不了解provide和inject的走你。
App.vue
language.vue
export default {
name: ‘Language’,
inject: [‘reload’], //接受App那边提供的方法
props: {
lang: String
},
data () {
return {
langList: {
‘zh-TW’: ‘繁体’,
‘zh-CN’: ‘中文’,
‘en-US’: ‘英文’
},
localList: {
‘zh-TW’: ‘中文繁体’,
‘zh-CN’: ‘中文简体’,
‘en-US’: ‘English’
}
}
},
watch: {
lang (lang) {
this.$i18n.locale = lang
console.log(‘reload!!!’)
this.reload() //在触发切换语言后调用,相当于直接调用app里写的reload方法
}
},
最后是在locale/lang文件下的语言包文件
zh-CN.js文件
export default {
…
home_user_increment: ‘新增用户’
}
zh-TW.js文件
export default {
…
home_user_increment: ‘新增用戶’
}
en-US.js文件
export default {
…
home_user_increment: ‘User Increment’
}
最后就都会切换语言了!