i18n: localize prompt templates with crowdin

This commit is contained in:
春河晴
2026-03-13 00:09:01 +09:00
parent 68f0ac3803
commit c9bfedddd2
46 changed files with 1156 additions and 17 deletions

View File

@@ -11,10 +11,26 @@ MaiBot 现在使用 `JSON + Crowdin + Babel` 的国际化方案,不依赖 gett
- `core.json`
- `startup.json`
- `config.json`
- `prompts.json`
长 Prompt 模板使用单文件本地化目录:
```text
prompts/
zh-CN/
replyer.prompt
planner.prompt
```
注意:
- `prompts/zh-CN/` 是 prompt source。
- 不要把 `zh-CN` 原文整批复制到 `prompts/en-US/` 后直接提交。
- 目标语言 prompt 文件应该由 Crowdin 下载生成;在本地还没有目标文件时,运行时会自动回退到 `zh-CN`
## 在代码中使用
统一从 [src/common/i18n/__init__.py](/Users/sayaka/workspace/MaiBot/src/common/i18n/__init__.py) 导入:
统一从 [`src/common/i18n/__init__.py`](../src/common/i18n/__init__.py) 导入:
```python
from src.common.i18n import t, tn
@@ -32,6 +48,21 @@ logger.info(tn("core.tasks_cancelled", count))
- `format_number_localized(...)`
- `format_decimal_localized(...)`
Prompt 模板统一从 [`src/common/prompt_i18n.py`](../src/common/prompt_i18n.py) 加载:
```python
from src.common.prompt_i18n import load_prompt
template = load_prompt("replyer")
rendered = load_prompt("replyer", identity="Mai", bot_name="麦麦")
```
Prompt 加载规则:
- 优先读取 `prompts/<当前 locale>/`
- 找不到时回退到 `prompts/zh-CN/`
- 如果新目录中还没有对应文件,再回退到历史兼容目录 `prompts/*.prompt`
## locale 优先级
运行时按以下顺序决定 locale
@@ -70,6 +101,12 @@ python scripts/i18n_validate.py
- 各语言 key 集合是否与 `zh-CN` 对齐
- 占位符集合是否一致
- plural 结构是否一致
- prompt 模板已存在时,其占位符集合必须与 `prompts/zh-CN/` 对齐
对于 prompt 模板:
- 缺少目标 locale 文件只会给 warning不会阻断因为运行时有 fallback
- 目标 locale 文件如果存在但占位符漂移,会直接校验失败
## 候选扫描
@@ -83,9 +120,19 @@ python scripts/i18n_extract_candidates.py
## Crowdin
项目根目录的 [crowdin.yml](/Users/sayaka/workspace/MaiBot/crowdin.yml) 使用 `locales/zh-CN/*.json` 作为 source。
项目根目录的 [`crowdin.yml`](../crowdin.yml) 使用 `locales/zh-CN/*.json` 作为 source。
现在也会把 `prompts/zh-CN/**/*.prompt` 作为单文件 Prompt 模板 source 上传到 Crowdin。
GitHub Actions 中的 [crowdin-sync.yml](/Users/sayaka/workspace/MaiBot/.github/workflows/crowdin-sync.yml) 会负责和 Crowdin 同步。
GitHub Actions 中的 [`crowdin-sync.yml`](../.github/workflows/crowdin-sync.yml) 会负责和 Crowdin 同步。
常用命令:
```bash
crowdin upload sources
crowdin upload translations
crowdin download translations
python scripts/i18n_validate.py
```
## 当前迁移范围
@@ -94,9 +141,11 @@ GitHub Actions 中的 [crowdin-sync.yml](/Users/sayaka/workspace/MaiBot/.github/
- `bot.py` 启动、重启、退出与协议确认提示
- `src/config` 中第一批配置加载、热重载、校验异常提示
- `src/main.py` 的主要启动链路提示
- `src/prompt/prompt_manager.py` 的 locale 感知 Prompt 加载
- `prompts/<locale>/` 的单文件 Prompt 模板结构
暂不建议立即迁移
仍然可以继续做但这次没有全量翻译的内容
- 大段 prompt 模板
- 所有 Prompt 模板的高质量英文翻译
- 内部协议字段
- debug-only 文案