想让 HellGPT 翻译同时完整保留原有格式,核心在于把“格式”当成不可翻的结构单元:先识别并抽出标签、表格单元、样式与占位符,只把纯文本节点喂给模型翻译,翻译后再按原位重插并用后处理脚本修正因语言导致的换行、标点与数字格式差异。结合占位符策略、样式映射、翻译记忆与校对流程,就能在 HTML、DOCX、PDF 与 OCR 场景下实现高保真格式保留。

先弄明白“保留格式”到底意味着什么
把翻译和排版拆成两件事来想会更清楚:翻译负责把语义换语言,格式负责把信息以相同“形状”呈现。格式包括标签(HTML/Markdown)、段落、换行、粗体/斜体、列表、表格、页眉页脚、样式(例如 DOCX 的样式)、以及图片位置和文本框。要做到既不丢语义又不改“样子”,得在技术上把这两层分离开来。
为什么翻译过程中会丢失格式?
- 输入被简化为纯文本,标签或样式被剥离或转义错误。
- 模型或 API 默认会把 HTML、Markdown 当普通文本处理,从而翻译标签内部或破坏标签结构。
- 不同语言长度差异导致换行与段落重排。
- PDF/图片需要 OCR,OCR 输出往往只有文本流,丢失布局信息。
- 表格、公式、代码块、脚注等结构化内容如果不特别处理,会被扁平化。
用费曼法把问题拆成四步
费曼法要我们把复杂问题拆成最小可理解单元、向别人解释、找出盲点、再重建。应用到“保留格式”的翻译上,可以分为:
- 识别:把文档里的每一种格式化元素识别出来。
- 抽象:把这些元素标记为不可翻的占位符或结构化节点。
- 翻译:只把纯文本节点发送给翻译引擎,同时使用术语表与翻译记忆。
- 重构与校对:把翻译后的文本按占位符插回原位置,并做语言相关的排版修正。
第一步:识别与分类(先看清楚你面对什么)
把内容按类型分类,常见类别包括:
- 块级结构:段落、标题、列表
- 内联格式:粗体、斜体、链接、代码片段
- 结构化表格:表头、单元格合并、数字/货币/百分比
- 专有文本:品牌名、变量、占位符、HTML 标签、公式
- 图片/图形里的文字(需 OCR 并保留坐标)
第二步:抽象与占位符策略(像做工艺活那样隔离)
关键想法是“占位符化”——把不可翻部分换成不会被模型修改的 token,翻译后再替换回来。常用做法:
- HTML/Markdown:只把文本节点传给模型,保留标签;或者用明确的占位符替换标签属性值。
- DOCX:把 run(w:r)拆开,保存 w:rPr 样式信息,只翻译 w:t 文本节点。
- 表格:按单元格 ID 提取文本,翻译后写回到对应单元格,不更改合并单元格结构。
- 代码/公式:标记为不可翻,或替换为
{CODE_1}形式。
第三步:给翻译引擎喂东西时的要点
不要盲目把整份文档一次性发给模型,按结构化片段处理,常见实践:
- 发送纯文本但保留占位符:例如把 “重要” 变为 “{BOLD_START}重要{BOLD_END}”,模型只翻译“重要”。
- 使用术语表(glossary)锁定品牌名、专有词汇和不可译项。
- 启用翻译记忆(TM)以保持前后用词一致。
- 设置模型参数:保留标签/忽略 HTML 标记的参数,或使用专门的“format-preservation”选项(不同平台名不同)。
- 对数字、日期、货币使用本地化规则,而不是盲目翻译字符串中的数字。
按文件类型给出可执行建议
HTML / Markdown
原则:只翻译文本节点,保留标签与属性。实践步骤:
- 用 HTML 解析器(如 BeautifulSoup、html5lib)遍历 DOM,抽出文本节点。
- 对于属性中的可见文本(alt、title),单独提取并标记。
- 把提取的文本数组发给翻译 API,翻译完成后按节点 ID 写回。
- 注意保持空格、 、换行语义,避免破坏内联元素。
DOCX / ODT
DOCX 本质上是 XML 压缩包,优点是能保留丰富样式。做法:
- 用 python-docx、Open XML SDK 或 LibreOffice SDK 解析 w:t 文本节点。
- 保留 w:rPr(样式)和段落样式,只翻译内容文本。
- 对表格、页眉页脚、脚注分区处理,逐单元格翻译并回写。
- 若语言长度增长导致分页问题,需在后处理阶段调整样式或页边距。
PDF / 图片(OCR 场景)
PDF 和图片最难,因为需要重建布局。推荐工作流:
- 使用能输出位置信息的 OCR(如 Tesseract 的 hOCR、ABBYY、Google Vision),得到文本块的边界框。
- 按区域提取文本并保留框信息,翻译后根据边界重新排版,必要时调整行距和字体大小。
- 对于扫描文档,优先用专业 OCR(ABBYY)以减少排版误差。
CSV / JSON /XLSX
这些结构化格式要明确“翻译字段”与“保留字段”:
- 用字段白名单来控制翻译范围。
- 对数字、公式、标识符、路径等字段做“不可译”标记。
- XLSX 的单元格格式(日期/数字格式)要在回写时保留原有单元格类型。
小表格示例:不同文件类型的关键处理点
| 文件类型 | 关键做法 | 常见工具 |
| HTML / Markdown | 只翻译文本节点,保留标签与属性 | BeautifulSoup, cheerio, html5lib |
| DOCX | 解析 w:t,保留 w:rPr 样式,分区翻译 | python-docx, Open XML SDK |
| PDF / OCR | 得到边界框,区域化 OCR,再重排 | ABBYY, Tesseract(hOCR), Google Vision |
实战工作流示例(三种场景)
网页内容实时翻译(前端场景)
- 前端抓取 DOM,抽取需要翻译的文本节点并以节点路径标识。
- 对文本进行占位符替换,调用后端翻译 API(带术语表)。
- 收到翻译后按原节点写回,同时处理 RTL、换行与缩进。
DOCX 批量翻译(企业文档)
- 把 DOCX 解包为 XML,按段落/段落样式抽取文本。
- 使用翻译记忆避免重复翻译相同句子,保留样式映射表。
- 翻译后重建 DOCX,最后用人工校对页码、目录和索引。
扫描合同(PDF + OCR)
- 先用高精度 OCR 生成带位置信息的文本块。
- 按语义块(标题、条款编号、正文)提取并翻译。
- 把翻译文本渲染回 PDF 模板或生成双语对照版。
常见坑与应对
- 把标签也发给模型翻译:会导致结构破坏。用解析器或占位符规避。
- 忽视非拉丁字符的长度差:中文或德语可能更短或更长,做好样式回退与行高调整。
- 翻译公式或代码:应标记为不可译,或只翻译注释部分。
- 不处理文化差异的格式化:日期、货币须本地化而非直接翻译字符。
工具清单(按用途)
- 解析与操作:BeautifulSoup、lxml、python-docx、openpyxl
- OCR 与布局:Tesseract(hOCR)、ABBYY、Google Vision
- 翻译支持:CAT 工具(OmegaT、Trados)、翻译记忆系统、术语库管理工具
- 自动化与脚本:Python、Node.js、LibreOffice headless 转换
最后,做这类工作讲究一点儿耐心:把“格式”看成一层可拆卸的外衣,按识别—抽象—翻译—重构的步骤做,就像修理一件衣服一样。开始可能步骤多点琐碎,但一旦把占位符和后处理流水线搭好,重复使用就会省时省力。按需把人工校对放在最后一步,尤其是重要合同、营销物料和法律文本,那儿机器做得再好也需要人眼确认。这玩意儿慢慢做,会越来越顺手。