目标:界面上一句中文都不该硬编码;新增页面/文案有固定套路,漏翻与结构回退由 CI 挡下。
assets/i18n/<locale>/<page>.json # 一种语言一个目录,一个页面一个分片
lib/surface/i18n/og_l_i18n.dart # 内核:t(page, key, {args}) + locales/pages 清单
lib/surface/pages/<x>_page.dart # 页面代码:只出现 t('x_page', 'key')
tool/i18n_scan.py # 抽取 + 校验(CI 门禁)
tool/i18n_wire.py # 批量接线(把中文字面量换成 t())
tool/sort_imports.py # import 分组排序(directives_ordering)
zh(源)/ zh_TW / en / de /
fr / ru。commentPosted 而非 text1);一个键只放一条文案。首次启动跟随系统语言(
zh会按区域细分:繁体系统 →zh_TW), 之后一律以用户在设置页选择的语言为准(落盘、重启保留)。
/// 页面顶部(或工具文件)放一个 `_t` 助手:
String _t(String key, [Map<String, Object?>? args]) =>
OgLI18n.instance.t('my_page', key,
args: args?.map((String k, Object? v) => MapEntry<String, String>(k, '$v')));
Text(_t('title')) // 静态文案
Text(_t('deleted', {'path': path})) // 文案里写 `{path}`
兜底顺序:当前语言 → 英文基线 → 键名,绝不返回空串;缺参会保留 {name} 原文而不抛异常。
assets/i18n/zh/<page>.json 加键(值写中文,术语 GitHub / Release /
Actions / PR / Token / Pages / Commit / OhGithubLost 不译)。_t('键');若该行原本在 const 里,去掉 const。python3 tool/sort_imports.py。翻译其余 14 种语言(增量模式,只翻新键、合并进现有分片):
cd _setup
python3 ogl_i18n_translate.py --page <page> --keys 键1,键2 --locales all --rpm 8 --concurrency 3
python3 tool/i18n_scan.py --check(必须 0 失败)。_t。lib/surface/i18n/og_l_i18n.dart 的 pages 列表加页面名(不加则分片不会被加载)。assets/i18n/zh/<page>.json;若目录是新的,pubspec.yaml 的 assets: 也要加。python3 ogl_i18n_translate.py --page <page> --locales all
(合并模式:一个语种一次请求,整页一起给模型)。tool/i18n_scan.py --check + flutter test test/surface/i18n_test.dart。| 命令 | 检查什么 |
|---|---|
python3 tool/layer_audit.py --fatal |
依赖只能 surface → domain → base → kernel |
python3 tool/i18n_scan.py --check |
① 界面文案 0 处未本地化 ② 6 语言分片键集合与 zh 完全一致 |
flutter analyze --fatal-infos |
含 directives_ordering(用 tool/sort_imports.py 修) |
flutter test |
含 test/surface/i18n_test.dart(分片存在性 / 键集合 / 术语保留) |
Text / 按钮 / 提示 / 校验错误 / 对话框 / 通知里的字符串。OgLAppLog / OgLLogFile / debugPrint /
throw / assert 里的开发者日志与诊断;非交互层(kernel / base /
domain)的所有字符串;og_l_i18n.dart 里的语言自称(「简体中文」在任何
语言下都显示原文)。// i18n-allow: 说明 显式豁免(只在确实不是界面文案时用)。_setup/,本机脚本,不入库)python3 ogl_i18n_translate.py --all --locales all --rpm 9 --concurrency 3 # 全量
python3 ogl_i18n_translate.py --page repo --locales ja,ko # 单页多语
python3 ogl_i18n_translate.py --page common --keys a,b --locales all # 增量补键
python3 ogl_i18n_translate.py --all --locales all --dry-run # 只估 Prompt 体积