You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DeepL Java API排除HTML中df[TEXT]类数据框不被翻译?

解决DeepL Java API翻译时排除[XXX]类占位符的方案

核心思路

通过临时替换占位符+翻译后还原的方式,把[XXX]这类格式的占位符替换成DeepL不会识别为可翻译文本的唯一临时标记,完成翻译后再将标记还原为原占位符,全程保证占位符格式完全不变。

具体实现步骤(Java代码示例)

  1. 占位符替换与还原工具类
    用正则匹配所有\[.*?\]格式的占位符,为每个占位符生成唯一临时标记并保存映射关系,后续用于还原:

    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;
        }
    }
    
  2. 结合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>&#160;</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);
        }
    }
    
  3. 关键注意事项

    • 临时标记采用__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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:10:49