在使用腾讯云翻译服务时,我们可能会遇到一个常见问题:翻译过程中Markdown格式被破坏。例如,
解决翻译服务破坏Markdown格式的问题
发布时间: 2025-08-24 (a year ago)
GO

在使用腾讯云翻译服务时,我们可能会遇到一个常见问题:翻译过程中Markdown格式被破坏。例如,### 标题可能会变成###标题,丢失了空格。

问题原因

腾讯云翻译服务会对文本进行规范化处理,可能会移除或调整文本中的空格,这对于自然语言翻译是合理的,但对于保留格式的Markdown文本来说会造成问题。

解决方案

方案一:使用HTML实体保护空格

在发送文本到翻译服务之前,将空格替换为HTML实体 

go 复制代码
func protectSpaces(text string) string {
    return strings.ReplaceAll(text, " ", " ")
}

func restoreSpaces(text string) string {
    return strings.ReplaceAll(text, " ", " ")
}

方案二:使用占位符保护Markdown语法

通过正则表达式识别Markdown格式并用占位符替换:

go 复制代码
func protectMarkdown(text string) (string, map[string]string) {
    replacements := make(map[string]string)
    counter := 0
    
    // 保护标题格式
    re := regexp.MustCompile(`^(#{1,6})\s+`)
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        placeholder := fmt.Sprintf("[[HEADER_%d]]", counter)
        replacements[placeholder] = match
        counter++
        return placeholder
    })
    
    return result, replacements
}

func restoreMarkdown(text string, replacements map[string]string) string {
    result := text
    for placeholder, original := range replacements {
        result = strings.Replace(result, placeholder, original, -1)
    }
    return result
}

方案三:分段处理保留格式

将文本按段落分割,仅翻译内容部分,保留格式行:

go 复制代码
func translateMarkdown(text string) string {
    lines := strings.Split(text, "\n")
    var translatedLines []string
    
    for _, line := range lines {
        // 检查是否为Markdown格式行
        if isMarkdownFormatLine(line) {
            // 直接保留格式行
            translatedLines = append(translatedLines, line)
        } else {
            // 翻译普通文本行
            translated := translateText(line)
            translatedLines = append(translatedLines, translated)
        }
    }
    
    return strings.Join(translatedLines, "\n")
}

func isMarkdownFormatLine(line string) bool {
    trimmed := strings.TrimSpace(line)
    // 检查是否为标题行
    return strings.HasPrefix(trimmed, "#")
}

推荐实现

推荐使用方案二(占位符保护),因为它:

  1. 精确度高,可以准确识别和保护各种Markdown格式
  2. 可扩展性强,可以轻松添加对其他格式的支持
  3. 不会影响翻译质量,因为占位符不会被翻译

注意事项

  1. UntranslatedText参数不能用于保留Markdown格式,它仅用于指定不需要翻译的特定词汇
  2. 在实际应用中,可能需要保护多种Markdown格式,如列表、代码块等
  3. 建议在翻译前后都进行文本验证,确保格式正确性