要让HellGPT在翻译时保留HTML标签,关键是把标签和属性视为“不可翻译的占位符”:先解析并提取标签与属性,替换为安全占位符,只把可见文本送入模型翻译,翻译后再按原位复原标签并修正实体、空白与编码,最后自动与人工校验结构与可访问性。


先把问题说清楚:为什么会丢失标签
很多人遇到的情况是:把一段含HTML的文本直接发给翻译模型,结果模型“把标签当文字”或“删掉了标签”,又或者把标签内部的属性误翻译了。根本原因有三点:
- 模型被设计为处理自然语言,它会尝试翻译所有看得见的字符,包括尖括号内的内容;
- 输入格式未被保护,标签和文本混在一起,模型无法区分“界面结构”和“可读内容”;
- HTML本身可能不规范(断开的标签、实体问题),模型更容易出错或丢失结构。
用费曼写作法拆解思路(简单到你能复述)
把复杂问题分成三步:理解→隔离→复原。先把HTML解析成“结构”和“文本”,然后只把文本部分交给翻译器,翻译完成后把文本放回结构中并修正细节。每一步都要能验证,这样出问题时能快速定位。
第一步:理解(你要知道哪些东西不能动)
HTML里不该被翻译的有:
- 标签名(如<h1>、<a>、<img>等)
- 类名、id、data-* 属性(通常用于样式或JS)
- URL(href、src 中的地址)除非你明确要本地化
- HTML 实体( 、< 等)和特殊字符的转义
- 脚本与样式(<script>、<style> 内部通常不直接翻译)
第二步:隔离(把可翻译文本和结构分离)
隔离通常通过两种方式实现:
- DOM解析(推荐):用HTML解析器把文档变成节点树,遍历节点只取文本节点与可翻译属性;
- 占位符法:把标签替换成像__TAG_1__、__ENDTAG_1__ 的占位符,或用更语义化的占位符如<BASE_LINK_1/>,保证在翻译过程中它们不会被改变。
具体步骤:从输入到输出的可复现流程
- 解析与清点:使用标准的HTML解析库(浏览器DOM、BeautifulSoup、htmlparser、parse5等)把输入解析成节点树,记录所有标签、属性、实体。
- 构造占位符映射:为每个标签与可保留属性生成唯一占位符,并保存原始值的映射表(例如占位符 -> 原始标签/属性字符串)。
- 提取可翻译片段:从文本节点和需要翻译的属性(alt、title、aria-label、placeholder、button文本等)收集要翻译的字符串,保留上下文信息(父标签、位置索引)。
- 送入翻译引擎:把这些纯文本段落(可批量)送进HellGPT或其它翻译模型,确保翻译请求中包含语言方向、格式指令(例如“不要翻译 __TAG_1__ 这类占位符”)。
- 复原与插回:把翻译结果按映射回到占位符位置,用原始的标签/属性值替换占位符;处理实体、空白、连字符等细节。
- 验证与修补:用HTML解析器再次解析生成的HTML,检查语法错误、未闭合标签、失去的属性或被翻译的占位符。如果有问题,回到占位符或原文再处理。
实现细节与常见陷阱
这部分有点技术,但说清楚就简单了:
占位符的设计要稳妥
占位符应满足两点:唯一且不可被翻译器错误改写。常见模式:
- 双下划线+数字:__TAG_1__
- 带角括号的伪标签:<TAG_1/>
- 带描述的占位符:__IMG_ALT_3__(用于图片alt属性)
注意:不要用自然语言单词作为占位符(比如 “LINK”),模型可能会翻译它们。最好用非字母开头或包含罕见字符。
哪些属性需要翻译,哪些不需要
并不是所有属性都该翻译。下面的表格是常见做法:
| 属性类型 | 是否翻译 | 理由 |
| alt / title / aria-label / placeholder | 是 | 面向用户的可见文本,影响可访问性 |
| href / src | 否(默认) | 通常为资源定位或路由,不该改动;本地化需人工判断 |
| class / id / data-* | 否 | 用于样式或逻辑,改动会破坏功能 |
实体与空白的处理
翻译过程中常见两个小坑:
- HTML 实体(例如 、—)在解析后可能成为普通字符,再送回时要重新转义为实体;
- 空白(前后空格、换行)可能在翻译后被丢失,尤其在内联元素中会影响渲染,必须在占位符或元数据里保留空白信息。
语言方向与排版差异(LTR/RTL)
目标语言是从右到左(如阿拉伯语、希伯来语)时,某些内联标点、嵌套占位符顺序会影响最终显示。建议在翻译时传入语言方向信息,让后处理阶段调整 dir 属性或用 CSS 修正。
如何在 HellGPT(或类似AI)中实践这些步骤
你会和模型交互,所以在发送请求时明确指令很关键。示例提示(Prompt)要包含三件事:
- 说明占位符规则:告知模型“占位符如 __TAG_1__ 不可翻译或改写”;
- 指明可翻译与不可翻译的字段:例如“翻译文本节点与 alt/title,但不翻译 href/class”;
- 保留格式要求:例如“保留换行、标点和实体的含义,不要合并句子”。
举个口语化的提示片段(写给模型看的):
请仅翻译占位符外的可读文本,所有像 __TAG_1__、__IMG_ALT_2__ 的占位符请原样保留。翻译 alt 与 title 字段,但不要改动 href、src、class、id、data-*。输出应能直接替换回原HTML。
真实示例与边缘情况
示例:原始 HTML:
<a href=”https://example.com” class=”btn”>点击这里</a>
处理流程:
- 占位:<a href=”__HREF_1__” class=”__CLASS_1__”>__TEXT_1__</a>
- 翻译文本:__TEXT_1__ -> “Click here”(或目标语言)
- 复原:替换占位符并保持 href/class 原样,结果标签结构不被改动。
边缘情况举例:
- 标签内含脚本模板(如 <script>var t = “{{title}}”;</script>):要小心模板占位符,不要误翻译模板变量。
- 可翻译的混合字符串(“Save & Exit”):要把实体与可读词分开处理。
- 断行或文本节点分割(不同节点内的短语被要求连贯翻译):收集上下文或合并短文本再翻译。
测试、验证与回滚策略
任何自动化流程都须有回滚与验证:
- 用HTML解析器校验输出是否为有效HTML;
- 对比占位符映射表,确保没有遗失或被改写的占位符;
- 构建自动化测试用例:不同语言、含实体、RTL示例、带模板变量的示例;
- 必要时保留人工校对环节,尤其是UI文案、可访问性文本与法律合同类内容。
与工程系统的集成建议(CI/CD、缓存与回退)
把翻译流程纳入现有工程系统时,注意这些实践:
- 把占位符映射和原文一起存储在版本控制或翻译记忆库(TM),便于回溯;
- 对高频文本使用缓存或翻译记忆(避免每次调用模型都重新翻译相同短语);
- 在上线前做A/B测试和可访问性检查,快速回滚机制要到位;
- 为静态内容和动态渲染内容分别设计不同的流水线。
小结外的建议(就像边写边想的碎念)
说实话,这套流程最容易被忽视的是“上下文”和“占位符设计”。你可能会觉得占位符麻烦,但一旦做成库或中间件,它能极大降低翻译错误。再有就是对属性的判断:alt/title 肯定要翻,href/src 通常不要动,但如果是国际化站点的URL结构也许需要特殊处理。多做样例,别把HTML当纯文本看待。
如果你要把这套方法落地,先把一两个页面做成手动流程(解析→占位→翻译→复原→校验),确认无误后再自动化,这样出问题时能更快定位原因。