uni.setLocale不能实时刷新页面,因仅修改系统locale标识而不联动Vue响应式系统;App端Android强制重启、iOS无响应,H5/小程序不触发$t();须用vue-i18n@9.1.9(legacy:false)+storage持久化+i18n.locale.value更新+uni.reLaunch重建页面。

uni.setLocale 不能让页面实时刷新,App 端会重启、H5 和小程序端不响应 $t(),必须手动触发 i18n 实例更新 + 页面重建 + 原生组件同步。
为什么 uni.setLocale 切换后界面文字不变
因为 uni.setLocale 只改系统级 locale 标识,不联动 Vue 响应式系统,也不触发 $t() 重新求值。iOS 不重启但无响应,Android 会强制销毁 Activity 导致白屏闪退;H5 部分平台有延迟,小程序几乎无效。调用后 uni.getLocale() 返回的是“上次设置值”,不是当前生效语言,不可靠。
Vue3 项目必须用 vue-i18n@9.1.9
新版 vue-i18n@10+ 在 App 端运行会报错 TypeError: i18n.__VUE_I18N_BRIDGE__ is not defined,直接白屏。v9.1.9 是官方验证兼容性最好的版本,且必须启用 Composition API 模式:createI18n({ legacy: false, locale: savedLang })。
漏掉 legacy: false,useI18n() 在子组件里拿不到最新 locale。
切换语言必须三步同步执行
缺一不可,否则出现“按钮还是中文”“TabBar 文字没变”“弹窗文案滞后”等问题:
- 先调用
uni.setStorageSync('lang', 'en-US'),确保冷启动时语言不丢失 - 再设
i18n.locale.value = 'en-US'(注意是.value),让模板中{{ $t('hello') }}和useI18n()立刻响应 - 最后执行
uni.reLaunch({ url: '/pages/index/index' })或uni.redirectTo—— App 端没有其他办法让原生 TabBar、导航栏、uni.showToast按钮等同步更新
TabBar 文案需在 pages.json 中通过 tabBar.list[0].text 动态绑定,或用 uni.setTabBarItem 手动更新;原生组件如 uni.showModal 的按钮文字,必须靠页面重载才能刷新。
onLoad 里别急着用 useI18n()
useI18n() 在 onLoad 生命周期中调用会返回空对象,因为 i18n 实例尚未初始化。正确做法是:在 setup() 中调用,或在 onShow 中加防抖判断后再执行文案更新逻辑。语言包不要塞进一个大 JSON 文件,App 分包加载时容易卡顿甚至白屏;键名避免带空格或特殊字符,否则 $t('user name') 会静默失败不报错。


















