Install
openclaw skills install @huhoo/long-doc-translation外文长文(德/英/法/日,授权可访问)产出四类交付:主稿 .md、自包含阅读版 .html、逐段备查、新术语总表;存疑交人工不强译。 Do NOT use for: publishing copyrighted text as-is, practice-grade legal output.
openclaw skills install @huhoo/long-doc-translation把一部几百页的外文专著译成「可交付、可核查、术语统一」的中文全稿。核心不是翻译本身,而是让 100+ 个翻译单元在体例与用词上保持一致,并在合并后不出现重复、断裂、未译残留。
源自实战:Dilthey《施莱尔马赫的生平·第2卷》(德文,OCR 底本,800+ 页)→ 141 片段 → 中文全稿 + 带目录导航 HTML,术语对照英文版 Oxford Handbook 与网络检索核校。
本技能是为大规模流水线设计的。用错规模会比不用更累,先对号入座:
| 你的情况 | 建议 |
|---|---|
| 300 页以上学术专著 / 古籍 / 档案,术语需全书统一 | ✅ 完整流水线(本技能主场景) |
| 100–300 页,或需多人 / 多子代理并行 | ✅ 完整流水线(批次可精简) |
| 几十页,术语要求不严,单人完成 | ⚠️ 轻量模式(--scale light) |
| 只译几段文字(< 10 页) | ❌ 不要用——直接译即可,流水线的配置开销大于收益 |
| 要做排版级双语对照出版 | ❌ 超出范围(本技能产出单语主稿 + 阅读版 HTML) |
轻量模式 vs 完整模式的差别(init_project.py --scale light 会生成对应清单):
| 环节 | 完整流水线 | 轻量模式 |
|---|---|---|
| 切片 + 重叠检测(overlap_check) | 必须 | 跳过(片段少,无滑动窗口重叠风险) |
| 并行子代理翻译 | 必须 | 跳过(单人直接译) |
| 边界去重(dedup_boundary) | 必须 | 跳过 |
| 术语表 | 必须 | 选做(建议保留,成本很低) |
| 体例三节(原注/译注/新术语) | 必须 | 保留(这样日后升级完整流水线,脚本可直接复用) |
| 质检(qa_check) | 必须 | 建议跑一次,只看【3】未译残留与【7】空文件 |
轻量模式下仍保留体例三节,是刻意的:将来篇幅扩大时,不用返工补格式。
python --version # 需 3.8 以上
pip install markdown pypinyin
markdown:合并时生成 HTML 用,缺了主稿 .md 仍可生成、HTML 会失败。pypinyin:术语表按拼音排序用,不装也能跑,只是术语改按 Unicode 排序(中文会乱序)。
脚本缺依赖时会明确提醒并说明降级后果,不会静默出错。python scripts/init_project.py <项目目录> # 完整流水线
python scripts/init_project.py <项目目录> --scale light # 轻量模式
python scripts/init_project.py <项目目录> --src en # 指定源语言(默认 de)
产出:目录骨架(source/ work/chunks/ output/chunks/ glossary/)、
译者简报模板、术语表模板,以及一份 RUNBOOK.md——
里面写好了本项目该按什么顺序跑哪些命令,照着打勾即可,不必通读本文档。
TRANSLATOR_BRIEF.md 填空(开工前必填,它是所有译者的体例契约);source/;RUNBOOK.md 推进。| 什么时候 | 跑哪个 |
|---|---|
| 项目初始化 | init_project.py |
| 翻译开工前(防整段重复,代价最高的一步) | overlap_check.py |
| 合并前质检 | qa_check.py |
| 发现边界句级重复 | dedup_boundary.py |
| 出主稿 .md + 基础 HTML | merge_build.py |
| 出增强阅读版 HTML | build_reader.py |
| 复验本包自测面(只判包内夹具,不碰你的稿子) | check_translation.py --selftest |
所有脚本对常见操作失误都会给出可执行的下一步,而不是抛 traceback:
init_project.py;--expect)→ 提示正确写法;一条重要保证(范围要说清,别读成万能保证):目录路径写错时,脚本会报错退出,
而不会打印「0 个片段」再给一排全绿 ✅——这一类静默假通过已统一封在 scripts/_common.py 里。
但"全绿"只覆盖这一类失效:另有几类"判定根本没发生"的静默跳过(分组命名不匹配、短句低于 MINLEN 不参判、只有一片时无相邻可比),见硬规则 8 与 references/pitfalls.md §1c——所以报告全绿不等于逐项都成立,报告明细里的每一行跳过提示都要用户过一眼再放行。
| 阶段 | 做什么 | 关键产出 |
|---|---|---|
| 1. 解析 | PDF/图片 → 文本(优先 omni-reader 等 OCR 解析;有对照外文版则一并解析) | source/DE_原文.md、source/EN_参考.md |
| 2. 清洗切片 | 修 OCR 错字、删页眉页脚、按原书结构(非等长)切片,写 manifest | work/chunks/*.txt + manifest.json |
| 3. 建体例与术语 | 先于翻译:写译者简报 + 多语术语表 | TRANSLATOR_BRIEF.md、glossary/DE-EN-ZH.md |
| 4. 并行翻译 | 主线程译一批 + 子代理并行译其他批(每段仅一个写者) | output/chunks/*.md |
| 5. 质检修复 | 完整性 / 体例 / 未译残留 / 重复段 / 页边码连续性 | scripts/qa_check.py 报告 |
| 6. 合并交付 | 去重合并 → 单一主稿 .md + 增强阅读版 HTML(build_reader.py,搜索/脚注跳转/护眼夜间大字) | 译名.md + 译名.html |
顺序不可颠倒:阶段 3 必须在阶段 4 之前。边译边定体例 = 全书体例漂移,后期返工量巨大。
编号后可在文档中交叉引用(如「硬规则 4」)。派子代理时直接引用编号即可,不必复述全文。
译者简报 TRANSLATOR_BRIEF.md(必需) 至少规定:
页边码:原书页码单独成行 〔S. XXX〕,保留以便核校与引用。(源文本页码常被打散成 S. 5 3 3,需还原)
强调字体:原文舒展字体(Sperrdruck / 斜体 / 逐字空格)还原为完整文句 + **粗体**,绝不逐字直译。
脚注:保留原编号,正文用上标 ⁷,注文统一移到段末 #### 原注 小节。
残句:片段开头残句用 > 〔承前页〕……,结尾残句照译并以 …… 收尾,不编造补齐。
存疑必标:任何不确定处加 #### 译注,格式 `N. 疑点。原文作「…」;对照版表述「…」;因…暂译作「…」,存疑。宁可多标,不可臆断。
文末三节(每个片段文件都附,便于合并时汇总):
#### 原注 (脚注译文)
#### 译注 (存疑说明)
#### 新术语 (本篇新定译名:原文 → 中文)
术语表铁律(glossary/DE-EN-ZH.md,必需):三语对照(原文 ⇄ 参照语言 ⇄ 中文)。同一原文词条全书唯一对应同一中文词;确需变通才在译注说明。建表依据:原书缩写 / 索引表 + 参照外文版 + 学界通行译法。
脚本告警不等于全绿:overlap_check.py / dedup_boundary.py 存在「判定未发生」的情形(命名不匹配分组模式、MINLEN 阈值下的短句)。看到命名模式提醒、「仅 1 片,无相邻片可比较」或 exit 3 时,先按提示处理再放行——报告最后一行的 ✅ 不等于真的检查过。详见 references/pitfalls.md §1c。
完整版(含发现 / 修复 / 预防,以及脚本阈值的静默失效模式)见 references/pitfalls.md。
| # | 陷阱 | 一句话 |
|---|---|---|
| 1 | 切片窗口重叠 | 相邻片段边界重叠 → 合并后整段重复;翻译开工前必跑 overlap_check.py(硬规则 8) |
| 2 | OCR 错字批量替换误伤译注 | 只替换正文区,注释区的纠错说明必须保留 |
| 3 | 合并后跨片段标题重复 | 按同级标题去重,排除 #### 原注/译注/新术语 |
| 4 | 字符数 vs 字节数 | 对比体量统一口径(实测 1 字符 ≈ 2.4 字节,不是 3) |
| 5 | 子代理产出未校验 | 查空文件、抽查头 25 行、读子代理自述 |
完整版见 references/parallel-translation.md。
python scripts/qa_check.py output/chunks
python scripts/check_translation.py --selftest # 包内自带自测面(零网络、纯 stdlib)
check_translation.py --selftest 验的是本包自己:三档——好样链(scripts/fixtures/good/ 三片走完 overlap→qa→dedup(dry-run)→merge 并逐项断言上面七项与交付形制)、坏样必红(scripts/fixtures/bad/ 每片一处病灶,断言判定真的发生并点名到文件与行号)、反证与封死(对好样做七枚单点破坏,每枚必须让对应一项转红;一枚正向不误拦——注文里的 OCR 残痕必须仍 ✅(同样按判定行结构判:该块只许一枚判定行,且必须是放行行);缺目录与空目录时五支脚本一律退 1、给「→」下一步、零 Traceback)。 一档里「七项全 ✅」按判定行结构判:qa_check 把判定打在两空格缩进、明细打在更深缩进,同缩进还有两类说明行(「(豁免 …)」「· 正常接缝…」)不算结论——一项为绿,当且仅当该块的判定行恰好一枚且以放行标记开头。所以往块里追加任何一枚别的判定行都当场翻红,不论它写 ❌、⚠、⛔、[X] 还是 "FAIL:",也不必先见过那个符号;只留红行同样红。退码兜不住这一类(qa_check 报红仍退 0),判面自己兜。夹具命名必须合 部_篇_编号(如 01_phil_001.md):不合式时相邻比较一次都不会发生却照样打印全绿(硬规则 8 记的那一类静默假通过)。。逐项判绿的实际尺是判定行结构:该块的判定行必须恰有一枚且以放行标记开头;说明行只认质检脚本自己那两句打全了的话(豁免行与「正常接缝…无需处理」行,且整行须按该形状走到头),其余任何两空格缩进行一律算判定行——换一枚没见过的红符号穿不透,把结论写成「· 不合格…」这类说明句式也穿不透
| # | 检查项 | 合格标准 |
|---|---|---|
| 1 | 片段完整性 | 译文片段数 == 切片数(或差异有 _redundant 解释) |
| 2 | 体例三节 | 每个片段含 #### 原注 / #### 译注 / #### 新术语 |
| 3 | 未译残留 | 正文无「>60 字符且无中文」的整行外文(书目/广告页除外,应保留原文) |
| 4 | OCR 残痕 | 正文区错字数 == 0(注释区豁免)——错字表是项目级配置(OCR_TYPOS 现值,当前装的是本包样例那部德文书的实测残留),换一部书若没重填,这一项会近乎空判:它是配置域,不是包内固定闸 |
| 5 | 页边码连续 | 全稿页码无断档(罗马/阿拉伯分段各自连续) |
| 6 | 重复段 | 正文关键句出现次数 == 1(术语表/附录内重复属正常) |
| 7 | 目录干净 | HTML TOC 仅含 2–3 级标题,无 原注/译注 杂项 |
脚本阈值口径与逐项修复动作见 references/qa-checklist.md;本文与那份清单里的数字都是镜像,判定=各脚本 CONFIG 区现值,一条命令原地打出来(自带安装后路径,任意目录整行粘贴可跑;装在别处把 ~/.workbuddy/skills/ 换成你的技能安装目录;命令用 grep(POSIX 工具),Windows 请在 Git Bash 或 WSL 内跑,路径写作 C:\Users<用户名>.workbuddy\skills\long-doc-translation\scripts\qa_check.py):
grep -n "CONFIG\|^[A-Z_]\{2,\} *=" ~/.workbuddy/skills/long-doc-translation/scripts/qa_check.py ~/.workbuddy/skills/long-doc-translation/scripts/overlap_check.py ~/.workbuddy/skills/long-doc-translation/scripts/dedup_boundary.py
闸分两性质:包内固定闸(缺目录即报错、片段数对账、TOC 层级、页码连续算法)不随项目变;配置域(页边码正则、OCR 错字表、体例三节命名、跳过哪些文件/章节、分组模式与各阈值默认值)按项目重填才成立——所举数字一律不作穷尽断言。
scripts/)| 脚本 | 用途 |
|---|---|
init_project.py | 一键建项目骨架(首次使用先跑它):建目录 + 生成译者简报/术语表模板 + 按规模(完整/轻量)生成 RUNBOOK.md 操作清单;可加 --scale light / --src en / --no-copy |
overlap_check.py | 页码级切片重叠检测(翻译开工前先跑)— 按「部」分组比较各片页边码首尾;逆序片(索引)自动跳过 |
qa_check.py | 上述 7 项质检(含句级重复行检测),输出可读报告 |
dedup_boundary.py | 句级边界重复清理— 默认 dry-run,--apply 才写盘;重复行带页边码时只删句子、保留码 |
merge_build.py | 同级标题去重合并 → 主稿 MD + 带 TOC 导航的 HTML;并对外暴露 SECTIONS/page_val/sort_terms/collect_doubts/collect_new_terms 等供 build_reader.py 复用(需 pip install markdown pypinyin) |
build_reader.py | 在 merge_build 之上生成增强阅读版 HTML:脚注正文↔注文双向跳转、全文搜索、原书页码跳转、目录高亮、护眼/夜间/大字主题、单文件自包含可直接发送 |
_common.py | 各脚本共用的友好错误提示与目录/参数校验(非独立工具,被上面各脚本 import)。它保证了「目录写错就报错退出」而非静默假通过 |
check_translation.py | 包内自带自测面(--selftest,零网络、纯 stdlib):三档=好样链/坏样必红/反证与缺目录封死,判的是本包夹具 scripts/fixtures/good/、scripts/fixtures/bad/,不动用户稿;末行自报「selftest: ALL GREEN(…断言 N 条,不符 0 条)」 |
推荐顺序:init_project.py → overlap_check.py → 翻译 → qa_check.py → dedup_boundary.py → merge_build.py → build_reader.py。
脚本顶部均有 CONFIG 区(页边码正则、错字映射表、标题层级、目录深度、是否跳过索引/书目),按新项目改配置即可复用——上面这些是配置域,不是包内已验证能力:改了配置,报告里对应那一项的判别力跟着变,别把默认值当承诺。
完整工程决策与用法见 references/reader-build.md。
merge_build.py 产出「能看」的基础 HTML;build_reader.py 在其之上产出读者真正用得顺手的增强版,二者共用同一份 merge_build 逻辑,不在 reader 里另写一份(避免两份实现漂移)。
增强版能力:脚注双向跳转 · 全文搜索(/ n p Esc)· 原书页码跳转 · 目录高亮 · 阅读设置(字号 / 行宽 / 大字模式 / 日间 ▸ 护眼 ▸ 夜间,localStorage 记忆)。
四条不可省的工程决策:① 单文件自包含(CSS/JS 内联,不引 CDN)→ 一个 .html 可直接发送;② 术语表按拼音排序(不按 Unicode 码点);③ 页边码正则要宽(覆盖阿拉伯 + 罗马数字与 OCR 变体);④ 脚注 id 唯一(未被引用的编号不生成返回链接,避免死链)。
*.md(单一文件,便于再加工/转 docx);*.html(左侧固定目录,点击跳转,适合通读与检索);output/chunks/*.md 逐片译文备查;#### 新术语 汇总为文末「全书新术语总表」。ζ.B.→z.B.)。切片边界不可避免会有 1–3 页的页码接缝(本次 32 处),以及 >3 页的疑似断档(12 处,多为原书图表页或无页边码页)。逐处强改代价高、收益低,建议在交付说明中如实列出,交由使用者据底本核对。
| 文件 | 何时读 |
|---|---|
references/pitfalls.md | 切片 / 翻译 / 合并各阶段排查重复与 OCR 问题;含脚本静默失效模式(§1c) |
references/qa-checklist.md | 合并前跑质检时——七项标准 + 脚本阈值 + 修复动作 + 交付基线 |
references/reader-build.md | 出增强阅读版 HTML 时(工程决策与依赖降级) |
references/parallel-translation.md | 派子代理并行翻译前(分片原则、提示词三要素、验收) |