feat: 添加 Crowdin bootstrap 工作流以支持目标翻译的初始化上传
This commit is contained in:
51
docs/i18n.md
51
docs/i18n.md
@@ -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)。
|
||||
|
||||
## 当前迁移范围
|
||||
|
||||
这一批已经覆盖:
|
||||
|
||||
Reference in New Issue
Block a user