Install
openclaw skills install @huhoo/long-doc-translation长篇外文(德/英/法/日等)学术专著、古籍、档案、译著的全文高质量中译流水线:解析→清洗切片→建体例与术语表→并行分批翻译→多维质检→合并交付带目录的阅读版。适用于 300 页以上、需要术语全书统一、脚注保留、存疑可追溯的长篇翻译任务。Triggers: 全文翻译 / 翻译全书 / 翻译整本 / 德译中 / 学术翻译 / 长篇翻译 / 译著 / 逐段翻译 / 把这本书译成中文 / translate a whole book / full-text translation of a scholarly monograph.
openclaw skills install @huhoo/long-doc-translation把一部几百页的外文专著译成「可交付、可核查、术语统一」的中文全稿。核心不是翻译本身,而是让 100+ 个翻译单元在体例与用词上保持一致,并在合并后不出现重复、断裂、未译残留。
源自实战:Dilthey《施莱尔马赫的生平·第2卷》(德文,OCR 底本,800+ 页)→ 141 片段 → 中文全稿 + 带目录导航 HTML,术语对照英文版 Oxford Handbook 与网络检索核校。
| 阶段 | 做什么 | 关键产出 |
|---|---|---|
| 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 之前。边译边定体例 = 全书体例漂移,后期返工量巨大。
译者简报 TRANSLATOR_BRIEF.md(必需) 至少规定:
〔S. XXX〕,保留以便核校与引用。(源文本页码常被打散成 S. 5 3 3,需还原)**粗体**,绝不逐字直译。⁷,注文统一移到段末 #### 原注 小节。> 〔承前页〕……,结尾残句照译并以 …… 收尾,不编造补齐。#### 译注,格式 `N. 疑点。原文作「…」;对照版表述「…」;因…暂译作「…」,存疑。宁可多标,不可臆断。#### 原注 (脚注译文)
#### 译注 (存疑说明)
#### 新术语 (本篇新定译名:原文 → 中文)
术语表 glossary/DE-EN-ZH.md(必需):三语对照(原文 ⇄ 参照语言 ⇄ 中文)。铁律——同一原文词条全书唯一对应同一中文词;确需变通才在译注说明。建表依据:原书缩写/索引表 + 参照外文版 + 学界通行译法。
长文本按字符数或页面滑动窗口切片时,相邻片段边界会重叠(本次 024 是 023 的子集窗口,两者各译一遍 → 12 页内容在合并稿里出现两次;022 还逾界译入属 023 的 8 页)。
〔S. N〕 的首尾,比较相邻片段 本片首 ≤ 上片尾 即重叠。
python scripts/overlap_check.py output/chunks # 输出每片覆盖区间与重叠告警
output/chunks/_redundant/(不参与合并,可恢复)。overlap_check.py 再开工翻译。1b. 句级边界重复(更常见、更易漏):即使不是整段子集,相邻片段也常在边界重叠 1–2 句——A 片末尾译了,B 片开头又译一遍(本次 8 处)。页码级检测看不出来,要靠 qa_check.py 的【6】重复行检测发现。
python scripts/dedup_boundary.py <chunks_dir> # dry-run,只报告
python scripts/dedup_boundary.py <chunks_dir> --apply # 确认后修复
策略:保留 A 的完整译文,删 B 开头的重复段;若重复行带页边码,只保留页边码、删句子(页码是核校锚点,不能丢)。
⚠ 删除前必须排除「结构性重复」:源文本身可能有文字相同的两处不同成分——如著作纲要条目的「I. xxx」与正文中舒展字体的正式节标题「I. xxx」(本次 052 即此,两处各自独立,读了源文才敢判定)。判据:回查源文 .txt 确认该句是否真出现两次,不可见重复就删。
译注里常写「原文 ζ.B. 应为 z.B.」——这是正确内容,全局替换会把纠错说明一起改掉。
#### 原注/译注/新术语 区内,只替换**区外(正文)**的错字。见脚本 note_flags() 逻辑。Sdiell→Schell、Erkentnis→Erkenntnis、ζ.B.→z.B.、Audi→Auch、Venunflsystematik→Vernunftsystematik、§SO→§50;上标数字易错(2e→26、2»→29、18 拆成 ¹⁸/¹⁹),需据页底注文校正归位。各片段为自洽常重标章名(如「第二章(续)」)→ 目录里同一章出现几十次。
###/#### 子标题),且排除 #### 原注/译注/新术语(level 4 本就每片重复,必须保留)。wc -c 是字节(UTF-8 中文 ×3),len(str) 是字符。228 万字节 ≈ 76 万字符,看着像「重复了 3 倍」其实正常。对比体量时统一口径。
< 15 行);TRANSLATOR_BRIEF.md + glossary/DE-EN-ZH.md + 1 篇紧邻的已译样本(保证风格衔接);python scripts/qa_check.py output/chunks
| # | 检查项 | 合格标准 |
|---|---|---|
| 1 | 片段完整性 | 译文片段数 == 切片数(或差异有 _redundant 解释) |
| 2 | 体例三节 | 每个片段含 #### 原注 / #### 译注 / #### 新术语 |
| 3 | 未译残留 | 正文无「>60 字符且无中文」的整行外文(书目/广告页除外,应保留原文) |
| 4 | OCR 残痕 | 正文区错字数 == 0(注释区豁免) |
| 5 | 页边码连续 | 全稿页码无断档(罗马/阿拉伯分段各自连续) |
| 6 | 重复段 | 正文关键句出现次数 == 1(术语表/附录内重复属正常) |
| 7 | 目录干净 | HTML TOC 仅含 2–3 级标题,无 原注/译注 杂项 |
scripts/)| 脚本 | 用途 |
|---|---|
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:脚注正文↔注文双向跳转、全文搜索、原书页码跳转、目录高亮、护眼/夜间/大字主题、单文件自包含可直接发送 |
推荐顺序:overlap_check.py → 翻译 → qa_check.py → dedup_boundary.py → merge_build.py。
脚本顶部均有 CONFIG 区(页边码正则、错字映射表、标题层级、目录深度、是否跳过索引/书目),按新项目改配置即可复用。
merge_build.py 产出的是「能看」的基础 HTML;build_reader.py 在其之上产出读者真正用得顺手的增强版,二者共用同一份 merge_build 逻辑(脚注上标换算、页码锚点、pypinyin 术语排序、存疑抽取),不在 reader 里另写一份,避免两份实现漂移。
增强版能力:
⁷ 点击跳到注文,注文编号点击返回正文(按片段隔离编号,仅链接可配对项,避免死链)。/ 聚焦、n/p 切换、Esc 清除。537 → 定位〔S. 537〕;无精确页时落最近页并提示。IntersectionObserver 随滚动高亮当前章,层级可折叠。A−/A+(13–32px)、行宽、大字老年友好模式(字号≥23px + 行距 2.2 + 加宽 + 放大顶栏控件)、主题循环 日间 ▸ 护眼 ▸ 夜间(护眼=柔和豆沙绿降低眩光,夜间=深色)。关键工程决策(下次直接照做,别再摸索):
.html 离线可用、可直接微信/邮件发给任何人。文件名用中文无妨。pypinyin.lazy_pinyin 对中文主词排序,西文条目按拉丁字母排并置于末尾;不要按 Unicode 码点排(中文会乱序)。〔S\.\s*(\d{1,3}|[IVXLCDM]{1,8})(?:\s*(?:续|末|f{1,2}))?\s*〕 —— 同时覆盖阿拉伯数字(正文)与罗马数字(前处理/目次),并兼容 OCR 变体「… 续/末」。n-{name}-{n}-{k} 计数后缀避免 id 重复;正文未实际引用某编号(OCR 脱落)时注文不生成返回链接,避免死链。**粗体** 对应原版 Sperrdruck。用法:python merge_build.py [chunks_dir] [out_prefix] 先出主稿,再 python build_reader.py(路径用环境变量 LB_BASE 指定工作根,默认当前目录;输出 output/译著阅读版.html)。
*.md(单一文件,便于再加工/转 docx);*.html(左侧固定目录,点击跳转,适合通读与检索);output/chunks/*.md 逐片译文备查;#### 新术语 汇总为文末「全书新术语总表」。ζ.B.→z.B.)。切片边界不可避免会有 1–3 页的页码接缝(本次 32 处),以及 >3 页的疑似断档(12 处,多为原书图表页或无页边码页)。逐处强改代价高、收益低,建议在交付说明中如实列出,交由使用者据底本核对。