# Qiming Mobile 多语言接入进度报告 ## 1. 背景 本轮多语言改造的目标,不只是把部分页面文案替换成 `t("...")`,而是建立一套可以持续扩展的接入方案,覆盖以下几类场景: - 业务页面与公共组件的用户可见文案 - 框架组件和原生 `uni.*` API 的提示文案 - 第三方库内部默认文案或运行时提示 - H5 语言切换后的动态刷新与兜底能力 当前项目已经完成一轮较完整的 i18n 基础建设与业务接入,核心主链路已可用,且具备继续扩展的基础。 ## 2. 当前方案总览 ### 2.1 核心运行时 项目以 `utils/i18n.uts` 作为统一多语言运行时,负责以下能力: - 当前语言状态管理:`i18nState.currentLang` - 词典缓存管理:本地缓存语言包与语言列表 - 文案查询:`t(key)`、`translateText(text)` - 模板变量替换:支持 `{name}` 这类占位符 - 初始化加载:应用启动后加载远端语言包 - 语言切换:`setLanguage(lang)` - 用户语言同步:`syncLanguageFromUser(lang)` - H5 tabBar 文案同步:运行时调用 `uni.setTabBarItem` 这意味着项目内新增文案时,优先应接入这一层,而不是在页面里各自维护独立字典。 ### 2.2 语言资源组织 当前语言资源由三层组成: 1. 远端词典 服务端通过 i18n 接口返回当前语言的词典映射,作为首选来源。 2. 本地默认语言文件 作为平台导入与本地兜底来源,主要文件为: - `constants/i18n-locales/zh-CN.uts` - `constants/i18n-locales/zh-HK.uts` - `constants/i18n-locales/zh-TW.uts` - `constants/i18n-locales/en-US.uts` 当前项目已采用“标准语言码 + bundle 文件 key”双层方案: - 标准语言码:`zh-CN`、`zh-TW`、`zh-HK`、`en-US` - bundle 文件 key:`zh-cn`、`zh-tw`、`zh-hk`、`en-us` 其中,运行时统一处理标准语言码归一,本地词包仍按小写文件 key 组织,避免将业务语言码与资源文件命名耦合在一起。 3. 本地字面量映射与兜底层 `constants/i18n.local.constants.uts` 负责: - 把历史遗留的中文字面量映射到 `Mobile.*` key - 在服务端未返回某个词条时,回退到本地默认语言 - 在旧代码仍传原始中文时,尽量兼容显示 ### 2.3 Key 规范 当前项目统一采用 `Mobile.*` 前缀管理业务文案,例如: - `Mobile.Nav.home` - `Mobile.Auth.login` - `Mobile.Chat.skill` - `Mobile.ThirdParty.MpHtml.copyCode` 这套命名已经覆盖导航、登录、聊天、文件预览、权限、第三方组件等主要模块。 ### 2.4 框架组件与业务组件接入方式 当前推荐的接入方式分为两类: 1. 直接传 key 适用于明确是固定文案的标题、按钮、占位符,例如: - `title="Mobile.Nav.agent"` - `placeholder="Mobile.AgentSearch.placeholder"` 2. 组件内部统一走 `translateText()` 适用于公共组件既要兼容 i18n key,也要兼容旧调用方直接传中文或服务端返回文本的场景。 这样做的好处是: - 新代码可以直接传 key - 旧代码不必一次性全部重构 - 切语言时,动态文案仍可重新计算 ### 2.5 第三方库接入方式 项目新增了 `utils/i18n-third-party.uts` 作为第三方语言适配层,当前职责包括: - 维护第三方库当前语言状态 - 对外暴露统一同步入口 `syncThirdPartyLocales(lang)` - 为第三方组件提供适配后的文案对象 目前已经落地的典型模式有: 1. 显式传入文案对象 例如给 `uni-load-more` 提供 `content-text`,避免继续使用组件内部默认语言逻辑。 2. 直接修改第三方组件内部用户可见文案 对一些不支持外部 locale 注入、但业务真实使用到的组件,直接将内部提示接到项目 i18n。 3. 避免循环依赖 第三方适配层不直接依赖运行时 `t()`,而是只依赖语言状态和本地兜底能力,降低循环引用风险。 ## 3. 已完成能力 ### 3.1 基础能力 当前已完成以下基础建设: - i18n 运行时搭建完成 - 语言列表、语言词典、当前语言缓存机制完成 - H5 初始化语言加载接入完成 - H5 语言切换能力接入完成 - 用户登录后语言与后端用户配置同步完成 - H5 tabBar 文案运行时同步完成 - 本地默认语言文件拆分完成 - `zh-TW` / `zh-HK` 默认兜底语言文件已补齐 - i18n 标准语言码已统一为 `zh-CN / zh-TW / zh-HK / en-US` - 本地字面量到 key 的兼容映射完成 ### 3.2 业务主链路覆盖 当前主业务链路已完成较系统的文案接入,包括但不限于: - 首页与 tab 页面 - 登录、验证码、重置密码链路 - 智能体列表与分类页 - 搜索页 - 临时会话页 - 聊天主链路 - 更多信息、相关会话、文件树、文件预览 - H5 webview 扩展页面 - 个人中心与语言切换页 H5 主链路中的标题、按钮、toast、modal、placeholder、loading、空态文案、部分 `alt` 文本都已经纳入统一管理。 微信小程序当前仍采用“固定简中”策略,因此小程序侧的静态中文配置属于当前设计范围,不视为本轮遗漏。 ### 3.3 公共组件与基础组件覆盖 以下类型的组件已完成较多接入: - 导航类组件:如 `custom-nav-bar` - 列表/分页类组件:如 `published-agent-list` - 下拉菜单/标签类组件:如 `menu-dropdown` - 空态和图片描述类组件 - 聊天输入、录音、技能选择等高频组件 这些组件已逐步改成: - 默认值使用 i18n key - 渲染时通过 `translateText()` 兼容旧值与 key - 避免只在初始化时计算一次文案,降低切语言后不刷新的风险 ### 3.4 第三方库接入进度 当前已处理的第三方或框架相关模块包括: - `uni-load-more` - `mp-html` - `uni-ai-x` - `uni-captcha` - `x-tools` - `lime-cascader` 的业务实际调用路径 已完成的接入类型包括: - 复制成功/失败提示 - 加载中/无更多/加载更多文案 - 弹窗标题、按钮、提示文案 - markdown 内部按钮与执行结果相关文案 - 验证码组件 placeholder、标题、错误提示 - 文件或系统工具提示文案 ## 4. 当前进度判断 从当前仓库状态看,可以把进度分为三个层次: ### 4.1 已经完成 - H5 主业务用户可见文案的多语言主链路基本打通 - H5 多语言切换、初始化加载、用户语言同步已具备 - 多数高频公共组件已收口到统一方案 - 多个真实使用中的第三方库已完成接入 ### 4.2 基本完成但仍需维护 - 历史兼容路径仍存在部分“中文字面量 -> key”的桥接逻辑 - 某些组件仍需依赖 `translateText()` 兼容旧调用方式 - 第三方库新增升级后,仍需按既有方案继续补接 ### 4.3 尚未完全收敛的部分 当前仓库里仍可能存在以下残留,但优先级较低: - 注释中的中文 - 调试日志中的中文 - `unpackage` 构建产物中的旧文案 - 第三方库 demo / example 页面中的演示文案 - 未被当前业务真正引用的三方组件内部默认文案 另外,`pages.json` 等配置层仍保留部分静态中文默认值。 在当前“小程序固定简中、H5 运行时覆盖”的策略下,这些配置属于平台级默认值,而不是本轮多语言漏接项。 这些内容不会直接阻塞当前业务多语言能力,但会影响后续全仓扫描时的噪音与维护成本。 另外,从语言资源建设角度看,当前已经完成繁中默认资源补齐,但后续仍需要继续关注: - `zh-TW` 与 `zh-HK` 是否需要进一步按地区表达细化词条 - 后端语言列表与前端标准语言码是否完全一致 这类工作属于语言资源层和接口协同层的持续优化,不会改变当前主链路方案,但会影响后续多地区文案的一致性。 ## 5. 已知边界与风险 ### 5.1 H5 与小程序行为不同 当前策略中: - H5 支持动态语言切换 - 微信小程序仍保持固定简中策略,当前不提供动态切换能力 因此如果后续要扩展小程序语言切换,需要重新评估: - 平台能力限制 - 页面初始化时机 - tabBar 与页面标题刷新策略 ### 5.2 第三方库不一定支持标准 locale 注入 不是所有第三方库都提供官方多语言入口,当前项目实际采用了三种手段: - 外部传入文案 - 包装适配 - 直接修改第三方源码 这意味着第三方升级时,需要特别关注: - 改动是否被覆盖 - API 是否变化 - 已接入的 i18n patch 是否失效 ### 5.3 历史兼容逻辑仍然存在 为降低一次性迁移成本,当前保留了对旧文案传入方式的兼容。这带来两个结果: - 优点:旧代码不必一次性全部重构 - 风险:新同学可能继续误传中文字面量,而不是直接传 key 因此后续应逐步推动“新增代码默认传 key”成为团队共识。 ## 6. 推荐接入规范 后续新增页面、组件或三方库时,建议统一遵循以下规范。 ### 6.1 新增业务文案 - 优先新增 `Mobile.*` key - 同步补齐 `zh-CN.uts`、`zh-HK.uts`、`zh-TW.uts` 与 `en-US.uts` - 若涉及历史兼容,再视情况补 `i18n.local.constants.uts` ### 6.2 公共组件 - 组件 `props` 默认值尽量写 key,不直接写中文 - 渲染时统一走 `translateText()` - 对只允许固定 key 的新组件,可在文档中明确约束,逐步减少兼容负担 ### 6.3 用户提示类 API 以下场景必须优先检查是否已接 i18n: - `uni.showToast` - `uni.showModal` - `uni.showLoading` - `uni.setNavigationBarTitle` - 输入框 `placeholder` - 图片 `alt` ### 6.4 第三方库 新增第三方库接入时,优先按以下顺序评估: 1. 是否支持官方 locale 配置 2. 是否可以通过 props 外部注入文案 3. 是否需要在 `utils/i18n-third-party.uts` 增加适配入口 4. 是否必须 patch 第三方源码 ## 7. 后续建议 基于当前进度,后续建议按以下顺序推进: 1. 补充这份报告对应的维护约定 包括“新增文案必须补双语 key”“新增第三方需评估 locale 入口”等约束。 2. 持续校验标准语言码与 bundle key 的映射关系 重点确保 `zh-CN / zh-TW / zh-HK / en-US` 与本地词包 key、后端接口返回值、缓存值保持一致。 3. 持续做低优先级清理 将业务源码中的中文日志、历史 fallback、非核心残留继续收敛,降低全仓扫描噪音。 4. 继续完善第三方审计 对真实业务已使用但尚未完全收口的第三方组件,做按需补接。 5. 结合现有审计能力持续验证 当前已有执行记录文档与多轮扫描结果,后续建议将报告、规则与审计结果保持同步。 ## 8. 结论 截至当前版本,`qiming-mobile` 的多语言能力已经从“页面零散替换”演进为“统一运行时 + 本地兜底 + 第三方适配”的可维护方案。 从业务价值上看,当前主链路已经具备实际可用的多语言支撑能力;从工程角度看,也已经形成了继续扩展所需的基础结构。剩余工作主要集中在低优先级清理、第三方长尾收口,以及后续团队协作过程中的规范执行。