问题
在我完善国际化的过程中,发现了一个问题,那就是部分页面或者部分内容没有完全渲染上最新的语言。
分析
- 通过
uni.getlocale()
方法获取当前页面是否已更新语言包
解决方案
问题一
如果你通过分析发现当前页面的语言包已经是你更新上去的语言包,但是页面部分内容并没有重新更新最新的语言包,说明该页面并没有触发重新渲染
1、将你设置的语言存入缓存中(这个的主要作用是为了用户重新打开应用,重新进入语言设置页面,发现设置的选项内容丢失了的情况)
2、在当前页面的onshow
生命周期函数中通过uni.setlocale(缓存中的语言)
重新触发渲染
uni.setLocale(uni.getLocale())
this._i18n.locale = uni.getLocale()
问题二
tabbar的文字并没有重新渲染成最新的语言包
记住:Tabbar在app端是默认使用原生的,层级是最高的
必须在每一个tabbar页面的onshow
函数中使用以下方法
uni.setTabBarItem({
index: 1,
text: this.$t('tabbar.market')
})
记住是必须,否则不生效,作者尝试在app.vue文件中使用,并没有生效!
或者通过uni.$emit的方式,也没有生效!
问题三
进入某个页面之后,重新返回并没有触发语言更新
uniapp开发app,其实本质还是web,并不完全是原生应用,因此你进入A页面——B页面,在B页面更新了语言设置,返回A页面,A页面之前就已经打开过了,自然没办法重新触发语言更新,因此作者一不做二不休,在A页面进入B页面的时候,直接关闭A页面,然后B页面返回的时候做判定直接返回A页面,这样A页面就相当于重新打开,自然就重新设置了语言了
因此,使用redirectTo
代替navigateTo,如果是返回tabbar页面,就使用switchTab