移动/游戏
Flutter 应用国际化:用 gen-l10n 与…
当需要为 Flutter 应用添加或维护国际化(l10n/i18n)、管理 ARB 翻译、处理复数/选择消息、格式化数字日期或修复本地化生成错误时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Flutter 应用国际化:用 gen-通用
解决思路
- 先检查 pubspec.yaml、l10n.yaml、现有 *.arb 文件、生成的导入、MaterialApp/CupertinoApp 配置以及当前翻译用法,再决定改动方案。
- 明确任务类型:初始化 l10n、新增语言、替换硬编码 UI 文本、添加占位符/复数/选择、格式化数值、修复生成错误,或迁移过时的导入与配置。
- 按决策指南选择方案:新项目、迁移、ARB 管理、复数/选择、Material/Cupertino 应用优先用 gen-l10n;仅当项目已用 Intl.message() 加 messages_all.dart 或用户明确要求时才用旧版 intl_translation;仅小型原型或刻意避免代码生成的现有代码才用自定义 map 方案,并在最终回复中说明该限制。
- 若项目已有本地化设置,先沿用其路径、类名、语言列表和生成风格,再考虑引入默认值。
- 只读取任务所需的参考文档(l10n 配置、ARB 格式、数字日期格式等),避免无关内容。
- 执行本地化改动:缺少时添加 flutter_localizations 和 intl:any 依赖;在 pubspec.yaml 中设置 flutter: generate: true;创建或更新 l10n.yaml;创建或更新带描述和占位符元数据的 ARB 文件;将 AppLocalizations 接入 MaterialApp 或 CupertinoApp;用生成的 getter 或方法替换硬编码 UI 字符串。
- gen-l10n 最小配置:pubspec.yaml 中写 flutter:\n generate: true;l10n.yaml 中写 arb-dir: lib/l10n、template-arb-file: app_en.arb、output-localization-file: app_localizations.dart。
- 使用与生成位置匹配的源码导入,通常为 import 'l10n/app_localizations.dart';;若生成文件写入自定义 output-dir,则相应更新导入路径。
- 优先使用生成的列表:localizationsDelegates: AppLocalizations.localizationsDelegates 和 supportedLocales: AppLocalizations.supportedLocales。
- 不要导入 package:flutter_gen/gen_l10n/app_localizations.dart,除非项目确实固定在旧版 Flutter 工作流;也不要启用 synthetic-package。
- 保留旧版 Intl.message() 工作流时:确保 intl_translation 在 dev 依赖中;保持生成文件与导入和现有项目一致;先提取再生成;在 Windows 或无通配符展开的 shell 中显式列出 ARB 文件。典型命令:dart run intl_translation:extract_to_arb --output-dir=lib/l10n lib/main.dart 和 dart run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/main.dart lib/l10n/intl_*.arb。若该工作流原本不存在,应说明 gen-l10n 是更安全的默认方案。
- 不要自行编造翻译:若未提供目标语言文本,仅在用户批准时添加清晰的占位翻译,否则报告缺失的翻译。
- 不要拼接本地化字符串,改用占位符、复数或选择消息。
- 当 gen-l10n 占位符格式化能完成时,不要手动格式化数字、货币、百分比、日期或时间。
- 不要添加 synthetic-package: true(当前 Flutter 已弃用并不可用)。
- 仅在项目接受非空生成 getter 行为时设置 nullable-getter: false,否则保持项目默认并在代码中做必要的空值处理。
- 在模板 ARB 文件中保留面向翻译者的描述和示例。
- 对 RTL 语言,检查文本方向、布局假设、镜像图标和语言特定组件。
- 用 flutter gen-l10n 生成并验证,然后运行最相关的项目检查,通常是 flutter analyze 或受影响的测试。
- 验证清单:flutter gen-l10n 按项目 l10n.yaml 成功;生成的导入路径可编译;每个新 ARB 键都存在于模板文件和所需语言文件中;翻译 ARB 值中的占位符与模板元数据匹配;复数/选择消息包含 other;数字/日期占位符使用受支持的格式;相关 flutter analyze 或测试通过,或报告阻塞项。
- 报告变更文件、生成行为、运行的验证以及仍缺失的语言或翻译。
- 技能维护时额外检查 YAML frontmatter、本地 markdown 链接、ARB 资源的 JSON 有效性、l10n.yaml 的 YAML 有效性、资源路由以及 SKILL.md、参考文档和资源之间的一致性。
适用边界 · 注意事项
- 项目已使用旧版 intl_translation 工作流且用户明确要求保留时,不要强行改用 gen-l10n。
- 不要为小型原型或刻意避免代码生成的现有代码引入 gen-l10n,除非用户同意。
- 未获得用户批准时不要自行编造目标语言翻译。