uni.setlocale在app端不可用,因仅设全局标识不触发重渲染,且android强制重启activity、ios静默失败;正确方案是用vue-i18n@9.1.9(legacy: false),配合storage持久化、i18n.locale更新与uni.relaunch页面重建。

App端多语言切换不能靠 uni.setLocale 实时生效——它只改全局标识、不触发重渲染,调用后 $t('hello') 仍返回旧语言文本;持久化也必须手动做,否则重启就回退到默认值。
为什么 uni.setLocale 在 App 端完全不可用
这个 API 名字有误导性:它实际只是设置一个全局 locale 标识,仅影响极少数内置组件(比如 picker 的标题),对 $t()、useI18n()、Vue 响应式系统、原生 TabBar 或导航栏文字都无感。Android 下还会强制重启 Activity,iOS 则静默失败——根本不是为“应用内热切换”设计的。
常见错误现象:
- 点击切换语言后,页面文字不变,弹窗按钮仍是中文
-
uni.getLocale()返回值和实际渲染语言不一致 - 切换后
uni.showToast的“确定”“取消”按钮没变,但自定义文案变了
Vue3 项目必须用 vue-i18n@9.1.9 + legacy: false
装新版 vue-i18n@10+ 会导致 App 端白屏:TypeError: i18n.__VUE_I18N_BRIDGE__ is not defined;而 legacy 模式(legacy: true)在 App 页面重载后,useI18n() 会返回空对象,模板中 {{ $t('key') }} 不响应。
正确初始化方式(写在 main.js 或 app.js 中):
import { createI18n } from 'vue-i18n'
const savedLang = uni.getStorageSync('lang') || 'zh-Hans'
const i18n = createI18n({
legacy: false,
locale: savedLang,
messages: {
'zh-Hans': zhCN,
'en-US': enUS
}
})
关键点:
- 别复用旧实例——每次冷启动都要 new 一个新
i18n - 不要挂到
Vue.prototype上,App 端页面重建后原型链断裂,this.$i18n会是undefined - 避免在
onLoad生命周期里调用useI18n(),此时实例尚未挂载
切换语言必须三步同步:storage → i18n.locale → 页面重载
漏掉任意一环,就会出现“界面上切了,但 TabBar 还是中文”或“退出重进语言丢失”等问题。
Gene6 FTP Server Professional v3.10.0.2 多语言特别版(集成了中文)
实操步骤:
- 先存:调用
uni.setStorageSync('lang', 'en-US'),确保退出重进不丢 - 再设:更新
i18n.locale.value = 'en-US',让$t和useI18n()立刻响应 - 最后 reload:必须用
uni.reLaunch({ url: '/pages/index/index' })强制重建页面栈——App 端没有其他办法让原生 TabBar、导航栏、uni.showModal按钮等同步更新
注意:uni.redirectTo 也可用,但推荐 uni.reLaunch 避免页面栈堆积;别用 uni.navigateTo,它不会清栈也不会重建 i18n 实例。
TabBar、日期格式、原生组件需手动同步
App 端 TabBar 是原生控件,pages.json 中的 tabBar.list[0].text 只读一次,编译后固化;uni.setTabBarItem 只能改单个 item,且需传入对应语言下的文案。
切换后必须显式更新:
uni.setTabBarItem({
index: 0,
text: $t('tab.home')
})
日期/数字格式也要手动传参,因为 App 端 Intl API 不随 locale 自动变:
- 错:
new Date().toLocaleDateString() - 对:
new Date().toLocaleDateString(useI18n().locale.value)
还有容易被忽略的一点:iOS 和 Android 对 uni.getSystemInfoSync().language 返回值不一致(iOS 返回 zh-Hans,Android 返回 zh),直接拿它初始化 i18n 会匹配失败。建议启动时做映射转换,比如把 zh 映射为 zh-Hans。










