OhGithubLost

多语言(i18n)维护手册

目标:界面上一句中文都不该硬编码;新增页面/文案有固定套路,漏翻与结构回退由 CI 挡下。

1. 结构

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)

2. 取文案

首次启动跟随系统语言(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} 原文而不抛异常。

3. 新增一条文案(标准流程)

  1. 在 assets/i18n/zh/<page>.json 加键(值写中文,术语 GitHub / Release / Actions / PR / Token / Pages / Commit / OhGithubLost 不译)。
  2. 代码里改用 _t('键');若该行原本在 const 里,去掉 const。
  3. 跑 python3 tool/sort_imports.py。
  4. 翻译其余 14 种语言(增量模式,只翻新键、合并进现有分片):

    cd _setup
    python3 ogl_i18n_translate.py --page <page> --keys 键1,键2 --locales all --rpm 8 --concurrency 3
    
  5. 本地自检:python3 tool/i18n_scan.py --check(必须 0 失败)。

4. 新增一个页面

  1. 写好页面代码,把界面文案全部走 _t。
  2. lib/surface/i18n/og_l_i18n.dart 的 pages 列表加页面名(不加则分片不会被加载)。
  3. 新建 assets/i18n/zh/<page>.json;若目录是新的,pubspec.yaml 的 assets: 也要加。
  4. 译 14 种语言:python3 ogl_i18n_translate.py --page <page> --locales all (合并模式:一个语种一次请求,整页一起给模型)。
  5. tool/i18n_scan.py --check + flutter test test/surface/i18n_test.dart。

5. 门禁(CI 会跑,违反即红)

命令 检查什么
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(分片存在性 / 键集合 / 术语保留)

什么算「界面文案」,什么不算

6. 翻译工具速查(_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 体积