feat(i18n): 接入翻译 provider worker
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s

Closes #44
This commit is contained in:
2026-08-30 21:13:31 +08:00
parent 7f465523e1
commit f441f1810e
29 changed files with 3815 additions and 130 deletions
+38 -10
View File
@@ -150,11 +150,12 @@ SQLite `ResourceRepository`,索引不存在时返回 `ok=true` 且
本地文件未变且索引有效时复用,不重复解析。
- `official-textunit-tasks.json`:只由 added + modified 资源、parse cache 和
TextUnit 明细索引派生,记录 TextUnit 任务、跳过原因和解析诊断。
- `crowdin-textunit-queue.json`:只包含已产生 TextUnit 的离线任务,预留给后续
Crowdin worker;当前不会发出网络请求。
- `crowdin-textunit-queue.json`:只包含已产生 TextUnit 的离线任务;官方同步阶段
不发出 provider 网络请求。
- `translation-tasks.sqlite`:当前 release 的可变 worker 状态库,记录
queued / running / failed / completed / skipped、attempt count、provider run
ID 和 failure reasonschema 由 `schema_migrations` 版本表管理。
ID、provider、TextUnit 级译文结果、lease、失败分类、可重试标记和
next attemptschema 由 `schema_migrations` 版本表管理。
- `translation-handoff.json`:当前 release 的版本化 job/unit/provider run 交接
快照;worker 更新后的实时状态仍以 `translation-tasks.sqlite` 为准。
@@ -206,6 +207,7 @@ SQLite `ResourceRepository`,索引不存在时返回 `ok=true` 且
| `translation.tasks` | 已实现 | `{ "offset": 0, "limit": 100, "task_id": "...", "release_id": "...", "destination": "...", "archive_entry": "...", "status": "skipped_parse_failed", "parse_status": "failed", "format": "json", "has_reason": true }` | 当前官方 release 的离线 TextUnit 翻译任务状态分页。 |
| `translation.handoff` | 已实现 | `null` | 当前官方 release 的 job、unit、provider run 交接视图;动态合并队列和 SQLite worker 状态。 |
| `translation.task.update` | 已实现 | `{ "task_id": "...", "status": "failed", "failure_reason": "...", "provider_run_id": "..." }` | 写入当前 release 的 provider worker 状态,返回可回查任务记录。 |
| `translation.worker.run` | 已实现 | provider worker 参数 | 异步触发 Rust provider worker,返回 `{ "task_id": "...", "kind": "translation.worker.run", "worker": {...} }`。 |
| `translation.proofread` | 已实现 | `null` | 将当前汉化 workflow 标记为人工校对中,返回工作流状态报告。 |
`parse.status` 是只读查询;没有当前 release 或没有解析缓存时返回
@@ -215,8 +217,8 @@ SQLite `ResourceRepository`,索引不存在时返回 `ok=true` 且
`textunit_index_summary`;存在 `official-textunit-tasks.json` 时,响应会包含
`textunit_queue_available=true``textunit_task_queue_path`
`textunit_task_summary`。当 TextUnit 队列存在且有离线任务时,
`translation_status_code=translation.queued_offline`真实 Crowdin worker
尚未接入时不会返回翻译完成状态
`translation_status_code=translation.queued_offline`provider worker 完成任务后,
同一查询面会返回已落库的 worker 状态和 TextUnit 级译文结果
`parse.text_units` / `parse.errors` 是只读查询;没有当前 release 或没有
`official-textunit-index.json` 时返回 `ok=true``data.available=false`
@@ -260,6 +262,31 @@ bat-api 可通过 `translation.tasks` 查询单项任务,也可通过
不会触发下载或 provider 网络请求;没有当前 release 或任务队列时返回
`data.available=false`
`translation.worker.run` 通过 daemon 任务队列异步启动 Rust provider worker。
provider worker 会先同步当前 release 的 TextUnit 队列到
`translation-tasks.sqlite`,回收过期 lease,然后由 `concurrency` 个独立 worker
循环 claim 下一项任务;任一 worker 完成当前任务后会立即领取下一项,不等待
其他 worker 完成本轮批次。默认并发为 8,范围 `1..=256`
provider worker 参数:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
| `provider` | string | `mock` | `mock``crowdin`。 |
| `fixture_path` | string/null | `null` | mock provider fixture;别名为 `translation_fixture``provider_fixture``mock_fixture``fixture`。 |
| `concurrency` | uint | `8` | 独立 worker 数,范围 `1..=256`;别名为 `worker_concurrency``translation_concurrency`。 |
| `max_attempts` | uint | `3` | 单个任务最大 claim 次数,必须大于 0。 |
| `lease_seconds` | uint | `300` | claim lease 秒数,必须大于 0。 |
| `retry_backoff_seconds` | uint | `5` | 可重试 provider 失败的 next attempt 间隔,可为 0。 |
| `max_tasks` | uint/null | `null` | 本轮最多 claim 的任务数,设置时必须大于 0。 |
| `worker_id` | string | `bat-rpc-worker` | lease 诊断用 worker ID 前缀。 |
数字字段必须是 JSON number;字符串数字、负数和越界值会返回
`BAT-ERR-700002``mock` provider 在没有 fixture 时把 source text 写成可诊断的
mock 译文;`crowdin` provider 从 `CROWDIN_PROJECT_ID``CROWDIN_LANGUAGE_ID`
`CROWDIN_API_TOKEN` 读取配置,可选 `CROWDIN_API_BASE_URL``BAT_CURL`
token 不会进入报告、任务记录或调试输出。
### localized
| 方法 | 状态 | params | data |
@@ -397,6 +424,7 @@ CLI 对应关系:
| `bat translation-handoff` | `translation.handoff` |
| `bat i18n task list` / `bat i18n task status` | `translation.tasks` |
| `bat i18n task update` | `translation.task.update` |
| `bat i18n worker run` | `translation.worker.run` |
| `bat i18n proofread` | `translation.proofread` |
| `bat localized-status` | `localized.status` |
| `bat resource-index` | `resource.index` |
@@ -424,10 +452,10 @@ CLI 对应关系:
- typed helper 已覆盖 daemon 已实现方法(`status/logs/stop/restart/reload/refresh/doctor`)、
`resource.state/sync/verify/repair/manifest/list``schedule.list/add/update/remove/run`
`catalog.*``parse.*`
`localized.status``translation.task.update``translation.proofread``task.*` 和三个
`unityfs.patch_*` 方法。
- `resource.index``translation.tasks``translation.handoff`
`patch.apply` 当前没有专用 typed helper;需要直接使用 `Call`,并仍须遵守
`localized.status``translation.tasks``translation.handoff`
`translation.task.update``translation.worker.run``translation.proofread`
`task.*` 和三个 `unityfs.patch_*` 方法。
- `resource.index` `patch.apply` 当前没有专用 typed helper;需要直接使用 `Call`,并仍须遵守
本契约的参数和响应定义。
`internal/api` 对 bat-api 生产路径进一步收窄接口:
@@ -437,7 +465,7 @@ CLI 对应关系:
| `Backend` | `daemon.status``daemon.doctor``resource.state``catalog.status``resource.manifest` | 启动发现、周期刷新和资源分发 |
| `ControlBackend` | `daemon.restart``daemon.reload``daemon.refresh``resource.sync``resource.verify``resource.repair``catalog.refresh` | 鉴权后的管理控制白名单 |
| `ScheduleBackend` | `schedule.list``schedule.add``schedule.update``schedule.remove``schedule.run` | 鉴权后的 dashboard 调度计划控制 |
| `TranslationBackend` | `translation.task.update``translation.proofread` | 鉴权后的 dashboard 翻译任务状态回写与人工校对标记 |
| `TranslationBackend` | `translation.tasks``translation.handoff``translation.task.update``translation.worker.run``translation.proofread` | 鉴权后的 dashboard 翻译任务查询、交接视图、状态回写、provider worker 触发与人工校对标记 |
`daemon.stop``daemon.clean-stable` 和任意通用 RPC 不属于 bat-api 管理控制面。
Rust dispatch、Go transport 和 bat-api 接口的权威实现位置分别是