feat: 添加 Crowdin bootstrap 工作流以支持目标翻译的初始化上传

This commit is contained in:
春河晴
2026-03-13 04:54:47 +09:00
parent 67b559200d
commit 89bd4ba13a
4 changed files with 268 additions and 98 deletions

View File

@@ -2,6 +2,15 @@
MaiBot 现在使用 `JSON + Crowdin + Babel` 的国际化方案,不依赖 gettext 的 `.po/.mo` 运行时。
## 仓库翻译策略
- `zh-CN` 是仓库内唯一的 source language也是唯一的 GitHub 侧 source of truth。
-`zh-CN` 的目标语言文件是同步产物和可评审输出,不是常规长期编辑面。
- 仓库中已经提交过的目标语言文件,需要先通过一次 bootstrap 同步进 Crowdin避免 Crowdin 把这些历史翻译当成“未翻译”并用 source 文本导出覆盖。
- bootstrap 完成后,目标语言的常规维护应在 Crowdin 中完成,而不是直接在 GitHub 中持续编辑。
- GitHub Actions 是仓库与 Crowdin 之间唯一允许的同步方式;不要把 Crowdin 的原生 GitHub integration 当作第二条回写路径。
- 翻译回流仍然通过 `l10n_*` pull request 完成,不直接写回 `main``r-dev`
## 目录结构
翻译文件位于 `locales/<locale>/*.json`,当前默认语言是 `zh-CN`
@@ -77,12 +86,14 @@ Prompt 加载规则:
- 全部小写
- 不要把中文原文直接当 key
## 新增翻译的步骤
## 日常翻译流程
1. 先在 `locales/zh-CN/*.json` 添加 source 文案
2. `locales/en-US/*.json` 中补上同名 key
3. 在代码中用 `t()``tn()` 替换硬编码字符串
4. 运行 `python scripts/i18n_validate.py` 校验结构
1. 先在 `locales/zh-CN/*.json` `prompts/zh-CN/**/*.prompt` 添加或修改 source 内容
2.代码中用 `t()` / `tn()` / `load_prompt()` 替换硬编码字符串
3. 运行 `python scripts/i18n_validate.py` 校验结构
4. 把 source 变更推送到 `main``r-dev`,或手动触发 [`crowdin-sync.yml`](../.github/workflows/crowdin-sync.yml)
5. 目标语言翻译在 Crowdin 中完成。
6. GitHub Actions 下载当时 Crowdin 中可用的翻译结果,并通过 `l10n_main` / `l10n_r-dev` pull request 回流到仓库。
对于非 `zh-CN` 的目标 locale
@@ -90,6 +101,15 @@ Prompt 加载规则:
- 不要手工把中文 source 文案直接复制进目标语言文件后提交。
- 英文 locale 文件中不应保留中文字符;这类残留会被校验脚本拦截。
### 什么时候可以直接改目标语言文件
以下场景才适合直接在 GitHub 中改非 `zh-CN` 文件:
- 需要把仓库里已经存在的历史目标语言文件一次性 bootstrap 到 Crowdin。
- 需要做紧急修复,而且你确认后续会把同样的修改补回 Crowdin避免下一次同步被覆盖。
除了上面这些例外,不要把目标语言文件当作常规编辑入口。
## 校验脚本
运行:
@@ -129,17 +149,30 @@ python scripts/i18n_extract_candidates.py
项目根目录的 [`crowdin.yml`](../crowdin.yml) 使用 `locales/zh-CN/*.json` 作为 source。
现在也会把 `prompts/zh-CN/**/*.prompt` 作为单文件 Prompt 模板 source 上传到 Crowdin。
GitHub Actions 中的 [`crowdin-sync.yml`](../.github/workflows/crowdin-sync.yml) 会在 workflow 运行时上传 source并下载当时 Crowdin 中可用的翻译结果。
GitHub Actions 中的 [`crowdin-sync.yml`](../.github/workflows/crowdin-sync.yml) 是日常稳态同步入口:
- push 到 `main` / `r-dev` 时,只有 `zh-CN` source 资产和 `crowdin.yml` 会触发正常上传。
- workflow 运行时会上传 source并下载当时 Crowdin 中可用的翻译结果。
- 下载结果通过 `l10n_*` pull request 回流,而不是直接写回 `main` / `r-dev`
[`crowdin-bootstrap.yml`](../.github/workflows/crowdin-bootstrap.yml) 是一次性或例外场景使用的 bootstrap 入口:
- 只能手动触发。
- 会把仓库当前已提交的目标语言文件上传到 Crowdin用来保留历史翻译。
- 不会作为日常 workflow 持续上传 GitHub 中的目标语言改动。
常用命令:
```bash
crowdin upload sources
crowdin upload translations
crowdin download translations
python scripts/i18n_validate.py
gh workflow run crowdin-sync.yml --ref r-dev
gh workflow run crowdin-bootstrap.yml --ref r-dev -f base_branch=r-dev -f confirm_bootstrap=yes-bootstrap-current-target-translations
gh run list --workflow crowdin-sync.yml --limit 5
gh pr list --head l10n_r-dev
```
更完整的 GitHub 侧操作说明见 [`docs/github-actions-crowdin-workflow-report.md`](./github-actions-crowdin-workflow-report.md)。
## 当前迁移范围
这一批已经覆盖: