feat(i18n): 完成 localized patch 发布回滚闭环
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s

Closes #45
This commit is contained in:
2026-08-31 00:02:55 +08:00
parent f441f1810e
commit ab21344773
26 changed files with 1916 additions and 140 deletions
+2 -2
View File
@@ -92,9 +92,9 @@ CAS V1 和 Rust 官方同步闭环完成后,下一阶段优先推进:
1. 继续联调 Go `bat-api` 与 Rust daemon 的资源分发路径;Go 同步 CLI 不再作为产品目标。
2.`docs/guides/official-full-pull-smoke.md` 在隔离目录执行真实官方网络全量下载 smoke,并保留运行报告。
3. 基于 `translation.worker.run` 推进翻译记忆和 Patch 构建。
3. 基于 `translation.worker.run` 推进翻译记忆和通用 manifest Patch 构建。
4. 扩展 ResourceRepository 查询面:CAS 诊断入口、面向大索引的查询优化和更丰富 TextUnit 查询。
5. 继续完善 AssetBundle 复杂对象解析、复杂对象重打包和 Patch 发布流程统一;通用 Binary/JSON/Text Patch 基础与 UnityFS TextAsset patch 发布前置链路已可用。
5. 继续完善 AssetBundle 复杂对象解析、复杂对象重打包和通用 Patch 发布流程统一;通用 Binary/JSON/Text Patch 基础与受支持 localized patch 发布/rollback 链路已可用。
优先阅读:
+47 -3
View File
@@ -119,8 +119,8 @@ bat i18n validate \
--translation-file /tmp/bat-workbench.json
```
报告会区分未审核、原文未变化、可直接 `i18n publish` 的 TextAsset,以及必须使用
`parse repack` 的 TypeTree/嵌套 archive 条目。
报告会区分未审核、原文未变化、可直接 `i18n publish`受支持 TextAsset/
TypeTree string field 条目,以及需要先经过独立 repack 流程的 ZIP 内或其他不支持条目。
发布汉化 release
@@ -131,7 +131,12 @@ bat i18n publish \
--translation-file /tmp/bat-workbench.json
```
发布接受当前实现支持的直接 TextAsset 条目;TypeTree 字段和 zip 内 bundle 使用 `parse repack` 的 spec 单独处理。`--force` 不覆盖已有目录,而是生成独立的 `<official-release>-manual-<unix-seconds>` 汉化 release ID;也可以用 `--localized-release-id` 显式指定新 ID。因此强制发布仍保留旧 release 和 rollback 信息。
发布接受当前实现支持的直接 TextAssetTypeTree string field 和 managed-reference
string field 条目;zip 内 bundle 和其他不支持条目使用 `parse repack` 的 spec
单独处理。`--force` 不覆盖已有目录,而是生成独立的
`<official-release>-manual-<unix-seconds>` 汉化 release ID;也可以用
`--localized-release-id` 显式指定新 ID。因此强制发布仍保留旧 release 和 rollback
信息。
当前 `i18n run` 是离线工作流:刷新 TextUnit 队列,并可用 `--translation-file` 导出工作台;真实 provider 由单独的 worker 命令消费 `translation-tasks.sqlite`
@@ -266,6 +271,45 @@ Rust `translation.tasks` / `translation.handoff`,不在 Go 侧维护状态。
`POST /admin/control/translation-proofread` 会把当前汉化 workflow 标记为人工校对中;
该接口只转发 `translation.proofread`,不会改动已发布汉化 release 指针。
## localized patch 发布与回滚
`i18n publish` 会在独立的 `.staging/<localized-release-id>` 中复制当前官方
release,校验工作台与当前 TextUnit 索引的 source/location 一致后,写入已有支持
范围内的 TextAsset、TypeTree string field 和 managed-reference string field
patch。校验通过后才原子切换 `localized/current`,并在 release manifest 中记录
源/目标 BLAKE3、字节数、patch kind、TextUnit、provider、review 和 rollback
信息。ZIP 内 bundle 不会被静默改写。
使用人工编辑的工作台发布:
```bash
bat i18n publish \
--translation-file /tmp/bat-workbench.json \
--localized-release-id release-manual-1
```
使用已完成 provider worker 的译文结果发布:
```bash
bat i18n publish \
--from-worker \
--localized-release-id release-worker-1
```
发布失败会清理 staging,不切换 `current`。当前 release 的 rollback 目标由
manifest 记录,执行后删除本次版本目录并恢复上一版本;没有上一版本时移除
`current`
```bash
bat i18n rollback --localized-release-id release-worker-1
```
Rust RPC 方法为 `localized.publish``localized.rollback`bat-api 对应为
`POST /admin/control/localized-publish``POST /admin/control/localized-rollback`
以及鉴权的 `GET /admin/translation/status`。发布请求必须且只能包含
`translation_file``from_worker=true`rollback 可省略 release ID 以操作当前
release。Go 只做鉴权、参数校验和转发,状态与产物仍由 Rust 持有。
## 边界
解析器新增类型覆盖和新的解析格式仍受 `docs/reports/PARSER_FREEZE.md` 约束。本次 issue 43 的例外只开放已有解析输出的手动编排、缓存刷新、工作台编辑、既有 patch 实现的重打包和独立汉化发布,不扩展 UnityFS/AssetBundle/Addressables/TypeTree 的解析类型覆盖。