你的 App 已经准备好进入下一个市场。产品团队批准了翻译文案,市场部准备好了发布计划,客服也更新了话术。结果测试发现:结算按钮硬编码成了英文,日期顺序不对,货币分隔符不符合当地习惯,较长的翻译还把主操作按钮挤出了屏幕。发布受阻不只是因为翻译质量,还因为几个月前在代码库里做出的决定。
这种情况正是 App 国际化的实际切入点。国际化(通常简称为 i18n)让产品做好准备,以便在不重写业务逻辑的情况下支持不同语言、地区、书写系统和文化习惯。随后,本地化再把准备好的产品适配到特定市场。
其商业价值在应用经济中显而易见。2026 年对 730,024 个 iOS App Store 应用的快照显示,中位数 App 正好只支持 一种语言,而 68.6% 仅以单一语言发布。估计月收入 $10,000 或以上的 App 支持的语言数量中位数为 五种,以及 50.7% 的最高收入层级 App 会发布五种或更多语言版本。这些数据并不能证明仅靠本地化就能创造收入,但它们表明,在商业野心更大的 App 中,多语言支持要普遍得多。
本指南从心智模型讲到工程模式、平台差异、工作流自动化、测试和迁移。它适用于原生移动产品、Web 应用、Capacitor 混合应用和 Electron 桌面软件。隐私与区域合规也应纳入发布计划,因此,正在应对监管要求的团队可以将本指南与 GDPR 合规清单.
目录
- App 国际化入门:为什么现在至关重要
- App 国际化到底意味着什么
- 国际化应用必备的核心模式
- 移动 Web Capacitor 与 Electron 的平台特定注意事项
- 可扩展的工具库与翻译工作流
- 全球化应用的测试、QA、性能与安全
- 结合 Code 示例与迁移清单完成整合
App 国际化入门:为什么现在至关重要
团队通常在市场发布前几天才发现国际化问题。产品团队要求增加语言选择器,设计团队要调整多个界面,工程团队则发现面向用户的文本分散在组件、校验规则、通知、分析标签和原生配置文件中。日期和数字也有同样的问题。以显示文本形式存储的日期无法安全地重新格式化,而由多个字符串拼接而成的价格在其他区域设置下可能需要不同的排列顺序。
这种滞后的发现会带来三个代价高昂的选择:推迟发布、接受明显的缺陷,或者修改从未设计为按 locale 变化的 code。把 i18n 视为一种架构能力会改变工作流。市场扩张将变成一项涉及资源、展示、测试和发布配置的可控操作,而不是一次重写。
实战规则: 构建应用时,要让新增 locale 只改变资源和展示,而不改变业务规则。
翻译只是全球化准备工作的一部分。 即使句子翻译正确,如果布局无法适应其长度,仍可能破坏界面。即使货币翻译正确,如果底层值以格式化文本存储,仍可能误导用户。当 Web 层和原生层检测到不同的区域设置时,语言选择器也可能导致行为不一致。
后期才发现 i18n 问题会推高运营成本。工程师必须追踪旧组件中的字符串,译者收到不完整的上下文,评审人员要测试仓促的改动,发布团队则需在多个平台包之间协调修复。对于 Capacitor 和 Electron 团队,Live Update 工作流可以缩短这一循环:在平台和发布策略允许的情况下,无需等待新的商店审核,即可交付已批准的本地化资源和界面修复。关键转变在于把本地化变更当作受管理的发布制品,而不是到最后才做一次翻译交接。
接下来的路径很明确:
- 打好基础: 将面向用户的资源与应用逻辑分离,并正确建模对 locale 敏感的值。
- 处理语言行为: 支持复数规则、文本扩展、书写方向、格式化,以及无障碍的语言切换。
- 适配各平台: 考虑 iOS、Android、浏览器、Capacitor WebViews 以及 Electron 打包。
- 让发布持续推进: 打通提取、翻译、审核、测试和部署,让新字符串不必等到项目后期才处理。
- 验证界面: 测试长文本、从右到左布局、locale 组合、回退行为、性能以及更新安全性。
应用国际化是一项发布工程实践。它让后续产品变更保持可本地化,让团队通过合适的交付路径修正语言问题,并涵盖地区隐私工作,例如 GDPR 合规清单.
App 国际化到底意味着什么
先打个房屋的比方。 国际化是在任何人装修房间前就装好的、可灵活调整的布线和管道。 本地化是为特定地区装修和布置这所房子。翻译则是更改标签、说明和标牌上的语言。
先后顺序很重要。如果布线被埋在专为某一种电器设计的墙里,新增电器就会代价高昂。在软件中,硬编码字符串、固定宽度控件、拼接句子和特定区域的业务逻辑会造成同样的限制。
三个术语,三项职责
国际化,或 i18n, 是让应用在不改变核心行为的前提下支持不同语言和地区的设计与开发工作。它包括资源加载、语言区域选择、格式化、文本方向、字体支持和灵活布局。
本地化,或 l10n, 将准备好的应用适配到特定语言区域。这可能包括翻译后的界面文案、地区特定格式、本地术语、符合当地文化的图像,以及针对市场的默认值。
翻译 将内容从一种语言转换为另一种语言。它主要处理含义和措辞,但良好的翻译工作流程还需要上下文、截图、字符限制以及每个字符串出现位置的信息。

一个有用的实现边界是 locale 资源。不要将 Payment failed 直接放在组件中,而是让组件请求诸如 payment.error这样的语义键。英文资源将该键映射为英文文本,而另一个资源将同一键映射为不同的翻译。组件仍然知道它需要一个支付错误。它不需要知道该错误如何措辞。
同样的分离原则也适用于字符串之外。将货币值存储为数值,而不是附带符号的字符串。将时间戳存储为时间戳,而不是已格式化的日期。将 locale 信息传递给格式化器,而不是在业务 code 中嵌入分隔符或月份名称。
为什么基础能降低风险
当资源和格式化规则位于业务逻辑之外时,添加语言就不需要更改购买计算、身份验证流程或数据模型。工程师可以更新资源 bundle,翻译人员可以在翻译管理系统中工作,QA 可以测试生成的界面,而不会破坏无关的行为。
这种分离也有助于明确职责。设计师可以定义支持扩展的组件,翻译人员可以审查上下文,产品经理可以决定支持哪些市场,工程师可以强制执行缺失键和回退规则。每个角色在工作流中都有清晰的定位。
跳过 i18n 的团队往往将每种新语言视为特殊例外。而为 i18n 设计的团队则将语言视为输入。这一转变让全球支持更容易推理。
国际化应用必备的核心模式
良好的 i18n 通过一组可重复的模式变得具体。请在组件、数据和发布层应用这些模式,而不是在单一语言代码库上添加语言切换器。

将字符串提取到资源文件中
这种转换是第一个实际步骤:
修改前:
showToast("Your profile was saved");
修改后:
showToast(t("profile.saved"));
资源文件:
{
"profile": {
"saved": "Your profile was saved"
}
}
使用描述含义的键,而不是英文句子。 profile.saved 如果英文措辞变化,它仍然有用,而基于原句的 key 可能产生误导。当同一个词可能表示不同含义时,请提供翻译上下文,例如 “Present” 是按钮操作还是状态。
一个正确实现国际化的应用会将所有面向用户的字符串,以及日期、数字、货币和符号,外置到 locale 资源或 formatter 中。这 移动端 i18n 工程蓝图 解释了这种分离为何能让团队在不修改业务逻辑的情况下添加语言。
使用 message format 处理语法
这样做不安全:
`${count} items`
硬编码模式假设所有 locale 的复数行为和词序都一致。Unicode CLDR 为日期、时间、时区、数字、货币和复数类别提供了通用的本地化数据层。正如 CLDR 的本地化最佳实践指南所述,不同 locale 的复数规则不同,因此应用需要能感知 locale 的选择,而不是单一固定模式。
ICU 风格的 message 可能如下所示:
{count, plural,
=0 {No items}
one {# item}
other {# items}
}
formatter 会选择正确的分支。请保留整条消息,以便译者在语法需要时重新排列数字和名词。
使用能感知 locale 的 API 格式化值
不要手动拼接日期:
`${day}/${month}/${year}`
使用 formatter:
new Intl.DateTimeFormat(locale, {
dateStyle: "medium"
}).format(date)
同样的原则也适用于数字和货币:
new Intl.NumberFormat(locale, {
style: "currency",
currency: currencyCode
}).format(amount)
Intl、ICU 和基于 CLDR 的库可处理因地区而异的惯例。它们还能让显示逻辑留在它该在的表现层。
为阅读方向和文本扩展而设计
文本在不同语言间的长度变化难以预测。按钮需要灵活的宽度,卡片需要可变的高度,标签也不应限制在单行内。请使用允许内容增长的布局系统,并在翻译人员进行最终审核前,使用长伪翻译(pseudo-translations)测试控件。
RTL(从右至左)支持不仅仅是翻转文本对齐方式。图标、导航顺序、内边距、动画和方向性手势可能都需要镜像处理。请使用逻辑属性,例如 margin-inline-start 在平台支持的情况下,避免使用仅限左侧的规则。图片、字体和嵌入文本也需要检查。能很好渲染一种文字的字体未必能覆盖另一种文字,而包含英文单词的图片可能需要本地化资源,而不是翻译后的覆盖层。
针对界面的具体指南,使用 Capacitor 的团队还可以参考这些 跨平台 UI 和 UX 实践.
移动 Web Capacitor 与 Electron 的平台特定注意事项
核心规则保持一致,但每个运行时提供的语言区域信号和打包约束各不相同。原生应用可以通过平台 API 读取设备偏好;浏览器通过浏览器设置和 JavaScript API 暴露语言偏好;混合应用同时拥有 WebView 和原生外壳,这意味着团队必须决定语言区域设置的权威来源放在哪里。
| 平台 | 语言区域检测 | 格式化方式 | 关键坑点 |
|---|---|---|---|
| iOS | 设备或应用语言设置,支持时行为因应用而异 | Foundation 格式化器与 JavaScript Intl 用于 Web 内容 |
Native 页面和 WebView 页面如果各自维护 locale 状态,就可能出现不一致 |
| Android | 设备与应用语言设置,取决于具体实现 | Android locale API 与 JavaScript Intl 在 Web 内容中 |
资源限定符与 WebView 资源需要明确的回退策略 |
| Web 端 | 浏览器语言偏好、用户选择,或 URL 与账户设置 | JavaScript Intl、基于 ICU 的库以及服务端 locale 处理 |
服务端与客户端的 locale 决策必须一致,以避免渲染不一致 |
| Capacitor | 原生偏好与 WebView 状态 | 原生格式化器、JavaScript Intl以及共享资源 bundle |
JavaScript 热更新可更改本地化内容,而无需修改原生资源 |
| Electron | 操作系统区域设置、应用偏好或账户设置 | JavaScript Intl、Node 端逻辑以及渲染器资源 |
打包的本地化资源必须在生产构建中正确包含并加载 |
原生移动应用
iOS 和 Android 各自提供原生本地化系统,但许多团队也通过 JavaScript 渲染大量 UI。请决定原生层和 Web 层是否共享 locale 代码、翻译键和回退规则。保持 locale 选择显式化,以免用户选择的语言在下次启动时被设备偏好覆盖。
商店元数据值得单独关注。即使应用已本地化,如果标题、副标题和描述仍保持单一语言,仍可能失去可发现性。一项 2023 年针对进入海外市场的美国头部应用的分析 发现 60% 本地化了其 iOS 标题,近 90% 本地化了其产品描述,且 6 成 本地化了其副标题。在 Android 上, 70% 本地化了标题和 89% 本地化了描述。这些属于应用商店展示层面的决策,而不是运行时 UI 决策,所以应放进发布检查清单,而不是假设工程 bundle 会处理它们。
Web 应用
Web 端需要在 URL、服务端渲染、浏览器偏好和账户偏好之间建立稳定的关系。如果服务端渲染英文,而浏览器立即切换为德语,用户可能会看到闪烁或 hydration 不匹配。请确定优先级顺序,持久化用户选择,并确保回退 locale 是确定性的。
当应用包含大量翻译内容时,请懒加载 locale bundle。保持默认体验快速,但确保离线或获取失败时也能渲染安全的回退内容。
Capacitor 与 Electron
Capacitor 应用通常在 iOS、Android 和浏览器之间共享 Web 代码库。这使得共享资源更高效,但原生插件可能仍会暴露平台特定的 locale 行为。WebView 应从单一权威来源接收标准化的 locale,而不是独立地从浏览器和设备设置中猜测。评估这些边界的团队可以查看 Capacitor 如何处理平台差异.
Electron 带来了打包问题。渲染进程在开发环境和打包应用中加载 locale 文件的方式可能不同,因此生产 build 必须确认资源存在、可寻址,并且一起更新。如果 JavaScript bundle 可以接收 Live Updates,就要明确 locale 文件是否属于同一个签名 bundle,以及更新失败时如何回滚。
可扩展的工具库与翻译工作流
翻译库本身不会建立本地化工作流。团队可能使用 i18next、FormatJS 或原生 Intl API,但如果 key 的归属、上下文、审核、交付和回滚不明确,仍可能漏掉一次发布。让每个新字符串都像软件制品一样,走与 code 相同的管控流程。
可扩展的工作流遵循一条清晰的链路:
- 开发者添加一个语义化 key 并附上上下文、截图、变量和必要的字符限制。
- 自动化提取或校验该 key 并发送到翻译管理系统。
- 译者和审核人员使用同一份源文 同时 build 会检查占位符和必需的 locale。
- CI 获取已批准的资源 并将其与应用程序一起打包,或通过已批准的更新通道发送。
- QA 检查已更改的语言环境 而不是从头开始重复每一次语言审查。
- 发布控制管理曝光范围从内部、Beta 或目标用户开始,然后再进行更广泛的推广。

为什么 pipeline 很重要
瓶颈通常在于等待已批准的内容,而不是编写 code。 2026 年开发者 i18n 工作流调查 发现 64% 的受访者将翻译工作流效率列为首要挑战, 78% 表示等待翻译会延迟发布,并且 52% 缺乏除人工抽检之外的系统化翻译 QA。同一份报告指出, 41% 已采用 OTA 系统,并且 28% 计划在 2026 年实施。这些发现把本地化与发布交付联系起来,而不是将其视为独立的内容周期。
CI 应在打包前拦截可预见的错误:
- 缺失 Key: 当源语言 Key 缺少 fallback 时,触发失败或警告。
- 占位符漂移: 验证诸如
{count}之类的变量是否在每条翻译消息中都存在。 - 孤儿 Key: 标记不再出现在应用中的资源。
- 语法错误: 拒绝格式错误的 JSON、ICU 消息或资源文件。
- 语言环境覆盖范围: 报告哪些受支持的语言环境已更改,哪些仍需审查。
有关 CI 集成模式,请参阅 开发者体验工具概览.
把 Live Updates 视为发布工程
对于 Capacitor 和 Electron 团队,本地化修复可以包含在签名的 JavaScript、CSS、文案、配置和资源 bundle 中。像 Capgo 这样的 live-update 平台可以针对特定渠道,仅包含已更改文件的差分更新,展示采用率和失败指标,并提供自动回滚保护。这为纠正误译的标签或布局规则创建了一条发布工程路径,无需等待完整的商店提交,前提是团队定义了其更新策略、审查流程、签名规则和原生兼容性边界。
Live Update 不能替代商店发布。原生字符串、权限、平台 API 以及超出已安装原生运行时的更改仍需要适当的分发路径。它们为兼容的本地化更改提供了一条更快的通道,否则小的内容修复可能需要等待下一个应用版本发布。
全球化应用的测试、QA、性能与安全
国际化测试应在用户发现之前暴露假设。单张翻译截图是不够的,因为故障通常取决于语言环境、数据长度、屏幕尺寸、书写方向和平台的特定组合。

从极端内容开始
伪本地化(Pseudolocalization)通过将普通字符串替换为刻意加长、带重音符号或用标记包围的测试文本,来帮助发现硬编码字符串、被截断的标签、固定高度的卡片以及仅支持英文的控件。请同时测试空状态和有数据状态,因为复数消息和校验错误通常会走不同的布局路径。
RTL(从右至左)测试需要进行完整的导航检查。检查文本对齐、返回按钮、图标、图表、滑动手势、表单字段,以及包含产品 code 的阿拉伯语句子等混合方向内容。不要自动镜像所有图标。方向性图标可能需要镜像,而品牌标志和某些对象图标应保持不变。
自动化 locale 矩阵
围绕支持的“语言+地区”组合构建测试矩阵,而不仅仅是语言名称。同一种语言在不同地区可能有不同的惯例,尤其是在日期、数字、货币、日历和时区方面。
- 功能检查: 确认 locale 选择、持久化、回退、复数分支和错误消息。
- 视觉检查: 截取长字符串、启用 RTL 和窄屏宽度下的关键界面。
- 语言检查: 为审校人员提供上下文、截图、变量和预期操作。
- 回归检查: 测试更新安装、下载中断、离线启动以及回滚行为。
随着本地化资源增加,性能管理至关重要。适时按语言或功能拆分大型 bundle,对非核心语言进行懒加载,并缓存已验证的资源。除非应用具备可靠的兜底机制,否则应避免让首屏依赖缓慢的翻译请求。
安全也应纳入同一轮审查。将语言标识符和用户提供的翻译内容视为输入,验证资源结构,保护翻译管理凭据,并校验远程交付 bundle 的完整性。Live Update 工作流应使用签名制品、受控通道、版本兼容性检查、可观测的故障以及经过测试的回滚路径。设计部署控制的团队也可以参考本指南,了解 多区域部署.
结合 Code 示例与迁移清单完成整合
结账页面展示了迁移顺序的重要性。从用户最常接触的 code 开始,然后将每个假设替换为具备语言感知能力的边界。硬编码的标签、日期、货币、复数消息和固定宽度布局应拆分为独立的迁移任务,并使用兜底语言防止资源缺失导致控件显示空白。
例如,替换现有组件中的货币拼接逻辑。
修改前:
price.textContent = currencySymbol + amount;
修改后:
price.textContent = new Intl.NumberFormat(locale, {
style: "currency",
currency: currencyCode
}).format(amount);
保留 amount 作为原始数值。符号位置、分隔符、小数格式及其他区域细节由格式化程序决定。这样就不会把 locale 规则散落到结账逻辑中。
实用的迁移清单:
- 盘点: 找出面向用户的字符串、已格式化的值、含文本的图片以及 locale 假设。
- 外部化: 将文案移入资源文件,使用语义化 key 和译者上下文。
- 规范化 locale 状态: 定义检测、用户覆盖、持久化和回退行为。
- 替换手动格式化: 使用平台或 JavaScript 中能感知 locale 的格式化程序。
- 加固布局: 测试文本扩展、截断、双向文本、字体和 RTL 镜像。
- 自动化校验: 在 CI 中检查缺失的 key、占位符、资源语法和已变更的 locale。
- 安全发布: 通过应用商店流程或受控的 Live Update 通道发布兼容的本地化变更,并借助签名、分阶段放量、监控和回滚。
选择一个高流量流程(如 onboarding 或 checkout)做第一轮。等它的资源边界和校验 pipeline 跑通后,再把相同的约定应用到整个 App,而不是尝试不受控的重写。
对于 CapacitorJS 和 Electron 团队,Capgo 支持通过签名的 Live Update bundle 发布兼容的 JavaScript、CSS、文案、配置和资源变更。Channels、差异化交付、可观测性和回滚保护可将本地化修复接入现有 CI/CD 工作流,减少每次兼容性修正对应用商店审核的依赖。在扩展到其他 locale 之前,请结合你的部署控制措施评估这条发布路径。