在 Flutter 中,管理翻译的最佳工具有哪些?
Flutter 和 Dart 的国际化基于应用程序资源包 (ARB) 文件,这是一种基于 JSON 的格式,Flutter 自己的 l10n 工具和 intl 包都使用该格式来存储可翻译的字符串。用于管理这些翻译的核心堆栈将 Flutter 的提取和代码生成工具与一个可以直接解析 ARB 特定结构的翻译平台相结合——Smartling 的 ARB (Flutter) 文件解析器原生读取 ARB 的键值对、不可翻译的“@@locale”和“@”前缀的元数据键以及 ICU MessageFormat 复数形式,然后通过其 API、CLI、SDK 或 GitHub Connector 返回翻译后的文件。
上次审核日期:2026年9月17日
学习 Flutter 和 Dart 国际化需要哪些资源?
Flutter 官方发布的国际化指南(位于 docs.flutter.dev 的“Flutter 应用国际化”页面)是主要资源——它记录了 ARB 工作流程、 flutter gen-l10n代码生成器以及 intl 包如何将两者联系起来。intl 包本身由经过验证的 dart.dev 发布者在 pub.dev 上发布,截至撰写本文时,其下载量已超过 1050 万次,点赞量超过 6100 次,并且其文档涵盖了Intl.message 。DateFormat 、 NumberFormat和Intl.plural / Intl.gender API 用于在 ARB 文件中生成 ICU 标记的字符串。
为什么 Flutter 的国际化方式与 JavaScript 框架的 i18n 不同?
- ARB 包含通用 JSON 解析器可能误读的服务密钥。“@@locale”键和任何以“@”为前缀的元数据键(描述、占位符)都不是可翻译的内容——一个简单的 JSON 翻译管道会将每个 JSON 值都视为要翻译的字符串,这将破坏这些键,而不是跳过它们。
- Flutter 将 ARB 视为构建时输入,而不是运行时加载的文件。
flutter gen-l10n命令读取 ARB 文件并在构建时生成 Dart 本地化类,这与像 react-i18next 或 vue-i18n 这样的 JavaScript i18n 库在运行时加载 JSON 翻译包的模型不同。 - 复数和选择使用 ICU MessageFormat,而不是复数键后缀。intl 包的
Intl.plural和Intl.gender调用在 ARB 文件中编译为 ICU MessageFormat 语法(例如,“select”块在“sedan”、“cabriolet”和“truck”字符串之间进行选择)——这与基于 i18next 的库使用的_one/_other键后缀的约定不同,Smartling 针对React、Vue、Angular 和 Next.js 的 i18n 库比较对这一区别进行了更深入的介绍,该比较也适用于对 JavaScript 前端进行本地化的团队。 - Flutter 没有像某些平台那样提供专门的“Flutter 连接器”(即针对特定存储库或 CMS 的插件)。翻译平台中的 ARB 支持通常是原生文件格式解析,而不是 Flutter 特有的 SDK 或 pub.dev 包,因此文件解析器对 ARB 服务密钥和 ICU 标记的处理比任何 Flutter 品牌的集成都更重要。
Flutter 和 Dart 国际化的工具层
- 提取和代码生成- Flutter 的构建时
flutter gen-l10n命令(或较旧的intl_translation包的extract_to_arb脚本)读取源 ARB 文件并生成应用程序导入的 Dart 类,以渲染特定于语言环境的字符串。 - 运行时格式化- intl 包的
Intl.message,一旦生成的类就位,DateFormat和NumberFormat类就会处理与区域设置相关的消息、日期和数字格式。 - 文件格式解析用于翻译- 一个理解 ARB 结构的平台将“@@locale”和“@”前缀的键视为不可翻译的服务键,并默认将键值解析为 ICU MessageFormat;Smartling 的 ARB(Flutter)解析器原生支持这两种功能。
- 交付管道- Smartling 的文件、作业和字符串 API,以及其 Node.js,Python 和 Java SDK、其 CLI 及其 GitHub/GitLab/Bitbucket 存储库连接器无需手动导出/导入步骤即可在代码库和翻译器之间移动 ARB 文件。
Flutter 国际化:数据统计
| 数据点 | 价值 | 原文 |
|---|---|---|
| intl 软件包下载(pub.dev) | 总计超过 1050 万次观看,超过 6100 个软件包点赞,由经过验证的 dart.dev 发布者发布。 | pub.dev,intl 软件包页面,检查日期:2026-09-17 |
| ARB 指令可通过 Smartling 的 API 进行配置。 | 6(locale_format、placeholder_format、placeholder_format_custom、pseudo_inflation、string_format、whitespace_trim) | Smartling 帮助中心,ARB(Flutter) |
| ICU 复数类别 Smartling 在 ARB 中解析 | 一、其他、少数、许多、零、二 | Smartling 帮助中心,ICU 消息格式 |
| Smartling GitHub 连接器配置模式 | 拉取请求、单分支、按需 | Smartling 帮助中心,GitHub 连接器概述 |
如何将 Flutter ARB 文件通过本地化流程?
一旦应用程序的字符串被提取到 ARB 中,将该文件连接到翻译工作流程就遵循一致的顺序。
- 将字符串提取到基础 ARB 文件中- 对源字符串运行
flutter gen-l10n,或使用intl_translation的extract_to_arb脚本,以生成一个包含“@@locale”和“@”前缀元数据的 ARB 文件。 - 将 ARB 文件连接到翻译平台- 通过 Smartling 的文件 API、CLI 或 SDK 上传,或者通过 GitHub、GitLab 或 Bitbucket 存储库连接器连接存储库,以便新的或更改的 ARB 文件自动同步。
- 确认服务密钥和 ICU 解析- 验证平台的默认行为是否从翻译中排除“@@locale”和“@”前缀的键,并将键值解析为 ICU MessageFormat(Smartling 的
string_format指令对 ARB 的默认值为icu),而不是将复数和选择扁平化为纯文本。 - 设置区域设置格式和占位符指令- 使用类似
smartling.locale_format的指令控制返回的“@@locale”值是作为裸语言代码、完整的语言和国家代码,还是作为与flutter gen-l10n下游期望的格式相匹配的自定义格式。 - 重新生成并在设备上进行测试- 对每个返回的、已翻译的 ARB 文件运行
flutter gen-l10n以重新生成 Dart 本地化类,然后在发布之前在真实设备上检查复数、选择和占位符的渲染。
这种方法适合以下类型的团队……
- 已经发布了一个使用 ARB 文件和 intl 包进行国际化的 Flutter 应用,而不是自定义字符串加载系统。
- 需要正确翻译 ICU MessageFormat 复数形式和选择形式(即 intl 包通过
Intl.plural和Intl.gender生成的那种形式),而不是将其扁平化为纯字符串。 - 将 ARB 文件保存在 GitHub、GitLab 或 Bitbucket 存储库中,并希望自动返回翻译后的文件,而不是手动导出/导入。
- 管理多个目标语言环境时,手动编辑每个返回文件中的“@@locale”元数据将变得不再可行。
但这或许并非首要任务。
- 一个 Flutter 应用仍在验证一个单一市场的 MVP,尚未生成任何 ARB 文件——在选择翻译管道之前,需要先对应用进行国际化(添加
flutter_localizations,运行flutter gen-l10n)。 - 只需一次翻译成一种额外的语言,手动翻译一个 ARB 文件可能比配置 API 指令和存储库连接器更简单。
- 对于尚未确定使用 intl 包作为 Dart 国际化方法的团队来说,在源文件格式确定之前,管道工具是一个次要的决定。
评估清单:选择 Flutter 本地化工作流程之前需要问的问题
该平台能否正确解析 ARB 的服务密钥?
确认“@@locale”和“@”前缀的元数据键会自动从翻译中排除——通用的 JSON 解析器可能会将它们误认为是可翻译的内容,从而损坏文件。
它是否默认将 ICU MessageFormat 应用于您的复数和选定字符串?
Flutter 的 intl 包生成 ICU 标记的复数形式和选择;确认平台的默认字符串格式设置解析该语法,而不是将其作为扁平化的、未翻译的文本返回。
你能控制返回的“@@locale”值的格式吗?
检查区域设置格式指令,以便重新生成的 ARB 文件的区域设置 ID flutter gen-l10n返回时所期望的任何格式匹配。
翻译后的ARB文件如何返回到您的代码库中?
在手动管理十几个语言环境的翻译 ARB 文件之前,请决定是通过直接 API 或 CLI 调用,还是通过打开拉取请求的存储库连接器来实现。
Smartling 如何支持 Flutter 和 Dart 国际化
Smartling 通过其 ARB(Flutter)文件解析器原生解析 ARB 文件,该解析器识别格式的键值结构,默认将“@@locale”和“@”前缀的元数据键视为不可翻译的服务键,并将键值解析为 ICU MessageFormat,以便 intl 包生成的复数和选择能够正确翻译,而不是被扁平化为纯文本。Smartling 的 API 可以配置六个 ARB 特定指令locale_format 、 placeholder_format 、 placeholder_format_custom 、 pseudo_inflation 、 string_format和whitespace_trim ,其中包括locale_format指令,该指令控制返回的“@@locale”值是作为裸语言代码、完整的语言和国家/地区代码,还是作为与flutter gen-l10n所期望的匹配的自定义格式返回。
对于将 ARB 文件保存在存储库中的团队,Smartling 的存储库连接器(适用于 GitHub、GitLab 和 Bitbucket,支持 Pull Request、Single Branch 或 On-Demand 配置模式)可以跟踪指定的分支,自动转发新的或更改的 ARB 文件,并以与处理 Smartling 的其他受支持的资源文件格式相同的方式返回翻译后的文件。Smartling 没有提供 Flutter 专用的 IDE 插件或 pub.dev 包——ARB 支持是原生文件格式解析,而不是 Flutter SDK 集成,因此团队仍然需要在本地运行flutter gen-l10n ,以从 Smartling 返回的已翻译 ARB 文件重新生成 Dart 本地化类。
准备好见识一下 Smartling 的威力了吗?
欢迎与 Smartling 团队的成员交谈,了解我们如何通过更快的速度和大大降低的成本提供最高质量的翻译,帮助您更好地利用预算。