refactor(i18n): 完善多语言适配与缓存隔离逻辑

1. 扩展支持多语种并对齐后端白名单配置
2. 实现租户/应用/语言三维缓存隔离
3. 加固语言包合并的原型链安全防护
4. 优化语言列表加载逻辑与调试日志
5. 调整uniacid切换与语言更新的事件处理
This commit is contained in:
2026-06-10 14:26:48 +08:00
parent 071db2d70c
commit 2f5f23d21a
3 changed files with 89 additions and 49 deletions

22
App.vue
View File

@@ -11,30 +11,28 @@
mixins: [auth],
onLaunch: async function(options) {
// 方式:支持快应用,从url中query部分获取uniacid,或useragent中获取uniacid
if(options.query.uniacid){
const uniacidChanged = options.query.uniacid && String(uni.getStorageSync('uniacid') || '') !== String(options.query.uniacid);
if (options.query.uniacid) {
uni.setStorageSync('uniacid', options.query.uniacid);
}
// uniacid 显式切换后,主动通知 Lang 清旧租户缓存,避免 boot 期间读到旧值
if (uniacidChanged) {
try { Lang.onUniacidChange(); } catch (e) {}
}
// 首屏强依赖远端翻译覆写(多租户文案强隔离)
// boot() 内部已有 bootTimeout 上限 + 失败静默,这里包 try 防止阻塞首屏
try { await Lang.boot(); } catch (e) { console.warn('[i18n] boot fail', e); }
// 监听远端翻译更新事件(管理后台改了词条后由后端推送 / 主动 reload)
// 注意:lang.js 内 emitUpdated 已经 commit 了 setComponentRefresh,这里
// 只做副作用(navigation title 等),不重复 forceUpdate
uni.$on && uni.$on('lang:updated', (info) => {
// 复用现有 componentRefresh 机制,触发所有引用它的组件 $forceUpdate
// 注意:lang.js 内 emitUpdated 已经 commit 了 setComponentRefresh,
// 这里再调用一次 Lang.refresh() 是为了保证 setNavigationBarTitle
// 这类副作用也被一并触发
if (info && info.lang) {
Lang.refresh();
Lang.refresh(true); // true = 显式推送 emitUpdated(虽然 loadOverrides 内部已发,这里保险起见)
}
});
// 远端不可用 -> 自动落到本地兜底;这里给个静默提示,业务可自行改 UI
uni.$on && uni.$on('lang:fallback', (info) => {
// console.warn('[i18n] remote unavailable, fallback to local', info);
// 不阻塞首屏,不抛错,仅记录
});
// lang:fallback / lang:remote-status 不在 App.vue 监听,留给业务按需订阅
uni.hideTabBar();
// #ifdef MP