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

312 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 的多语言能力已经从“页面零散替换”演进为“统一运行时 + 本地兜底 + 第三方适配”的可维护方案。
从业务价值上看,当前主链路已经具备实际可用的多语言支撑能力;从工程角度看,也已经形成了继续扩展所需的基础结构。剩余工作主要集中在低优先级清理、第三方长尾收口,以及后续团队协作过程中的规范执行。