Files
qiming/qiming-mobile/docs/i18n-progress-report.md

11 KiB
Raw Permalink Blame History

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-CNzh-TWzh-HKen-US
    • bundle 文件 keyzh-cnzh-twzh-hken-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-TWzh-HK 是否需要进一步按地区表达细化词条
  • 后端语言列表与前端标准语言码是否完全一致

这类工作属于语言资源层和接口协同层的持续优化,不会改变当前主链路方案,但会影响后续多地区文案的一致性。

5. 已知边界与风险

5.1 H5 与小程序行为不同

当前策略中:

  • H5 支持动态语言切换
  • 微信小程序仍保持固定简中策略,当前不提供动态切换能力

因此如果后续要扩展小程序语言切换,需要重新评估:

  • 平台能力限制
  • 页面初始化时机
  • tabBar 与页面标题刷新策略

5.2 第三方库不一定支持标准 locale 注入

不是所有第三方库都提供官方多语言入口,当前项目实际采用了三种手段:

  • 外部传入文案
  • 包装适配
  • 直接修改第三方源码

这意味着第三方升级时,需要特别关注:

  • 改动是否被覆盖
  • API 是否变化
  • 已接入的 i18n patch 是否失效

5.3 历史兼容逻辑仍然存在

为降低一次性迁移成本,当前保留了对旧文案传入方式的兼容。这带来两个结果:

  • 优点:旧代码不必一次性全部重构
  • 风险:新同学可能继续误传中文字面量,而不是直接传 key

因此后续应逐步推动“新增代码默认传 key”成为团队共识。

6. 推荐接入规范

后续新增页面、组件或三方库时,建议统一遵循以下规范。

6.1 新增业务文案

  • 优先新增 Mobile.* key
  • 同步补齐 zh-CN.utszh-HK.utszh-TW.utsen-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 的多语言能力已经从“页面零散替换”演进为“统一运行时 + 本地兜底 + 第三方适配”的可维护方案。

从业务价值上看,当前主链路已经具备实际可用的多语言支撑能力;从工程角度看,也已经形成了继续扩展所需的基础结构。剩余工作主要集中在低优先级清理、第三方长尾收口,以及后续团队协作过程中的规范执行。