如何用DeepL Java API排除HTML中df[TEXT]类数据框不被翻译?
解决DeepL Java API翻译时排除[XXX]类占位符的方案
核心思路
通过临时替换占位符+翻译后还原的方式,把[XXX]这类格式的占位符替换成DeepL不会识别为可翻译文本的唯一临时标记,完成翻译后再将标记还原为原占位符,全程保证占位符格式完全不变。
具体实现步骤(Java代码示例)
占位符替换与还原工具类
用正则匹配所有\[.*?\]格式的占位符,为每个占位符生成唯一临时标记并保存映射关系,后续用于还原:import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PlaceholderManager { private static final Pattern PLACEHOLDER_REGEX = Pattern.compile("\\[.*?\\]"); private final Map<String, String> placeholderMap = new HashMap<>(); private int tagCounter = 0; // 将原占位符替换为唯一临时标记 public String replacePlaceholders(String rawContent) { Matcher matcher = PLACEHOLDER_REGEX.matcher(rawContent); StringBuffer processedContent = new StringBuffer(); while (matcher.find()) { String originalPlaceholder = matcher.group(); String tempTag = "__PLACEHOLDER_" + tagCounter + "__"; placeholderMap.put(tempTag, originalPlaceholder); matcher.appendReplacement(processedContent, tempTag); tagCounter++; } matcher.appendTail(processedContent); return processedContent.toString(); } // 将翻译后的临时标记还原为原占位符 public String restorePlaceholders(String translatedContent) { for (Map.Entry<String, String> entry : placeholderMap.entrySet()) { translatedContent = translatedContent.replace(entry.getKey(), entry.getValue()); } return translatedContent; } }结合DeepL Java API完成翻译
先处理文本替换占位符,再调用翻译接口,最后还原占位符,同时保留HTML结构:import com.deepl.api.DeepLException; import com.deepl.api.Translator; import com.deepl.api.TextResult; public class DeepLTranslationService { public static void main(String[] args) throws DeepLException { // 初始化DeepL翻译器(替换为你的授权密钥) Translator translator = new Translator("YOUR_DEEPL_AUTH_KEY"); // 原始HTML内容 String originalHtml = "<!DOCTYPE html>\n<html>\n <head>\n </head>\n <body>\n <p>Dear client,</p>\n <p>Please find enclosed the Events for the order you wish to execute for your account [ACCOUNT_NAME_TEXT].</p>\n <p> </p>\n <p>Kind regards,</p>\n <p>[COMPANY_NAME]</p>\n </body>\n</html>"; // 处理占位符 PlaceholderManager manager = new PlaceholderManager(); String contentToTranslate = manager.replacePlaceholders(originalHtml); // 调用DeepL翻译,开启HTML标签处理与格式保留 TextResult translationResult = translator.translateText( contentToTranslate, "EN", "ZH", null, true, // 开启HTML标签处理,保留页面结构 null, null, null, true // 保留原有格式(换行、空格等) ); // 还原占位符,得到最终翻译结果 String finalTranslatedHtml = manager.restorePlaceholders(translationResult.getText()); System.out.println(finalTranslatedHtml); } }关键注意事项
- 临时标记采用
__PLACEHOLDER_数字__格式,避免与原文内容冲突,保证替换与还原的准确性。 - 翻译时必须开启
tag_handling="html"(对应Java API中第5个参数为true),防止HTML结构被破坏。 - 开启
preserve_formatting参数,确保原文的排版格式和占位符的方括号结构完全保留。
- 临时标记采用
替代方案(需修改HTML结构)
如果允许修改原始HTML,可以将占位符包裹在自定义标签中,比如<span class="notranslate">[COMPANY_NAME]</span>,然后在翻译时设置ignore_tags参数为["notranslate"],DeepL会自动忽略该标签内的内容。但此方案需要改动原始HTML,若要求完全不修改原格式,优先使用第一种临时替换方案。
内容的提问来源于stack exchange,提问作者lsa
相关产品推荐
相关产品推荐

