[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-30":3},{"id":4,"title":5,"title_en":6,"abstract":7,"abstract_en":8,"content":9,"content_en":9,"category":10,"banner_id":11,"banner_path":12,"tags":13,"is_recommend":15,"prev_article":16,"next_article":20,"created_at":24},30,"解决翻译服务破坏Markdown格式的问题","Solve the problem of translation services destroying the Markdown format","> 在使用腾讯云翻译服务时，我们可能会遇到一个常见问题：翻译过程中Markdown格式被破坏。例如，","> When using Tencent Cloud translation service, we may encounter a common problem: Markdown format is destroyed during translation. example,","> 在使用腾讯云翻译服务时，我们可能会遇到一个常见问题：翻译过程中Markdown格式被破坏。例如，`### 标题`可能会变成`###标题`，丢失了空格。\n\n## 问题原因\n\n腾讯云翻译服务会对文本进行规范化处理，可能会移除或调整文本中的空格，这对于自然语言翻译是合理的，但对于保留格式的Markdown文本来说会造成问题。\n\n## 解决方案\n\n### 方案一：使用HTML实体保护空格\n\n在发送文本到翻译服务之前，将空格替换为HTML实体`&nbsp;`：\n\n```go\nfunc protectSpaces(text string) string {\n    return strings.ReplaceAll(text, \" \", \"&nbsp;\")\n}\n\nfunc restoreSpaces(text string) string {\n    return strings.ReplaceAll(text, \"&nbsp;\", \" \")\n}\n```\n\n### 方案二：使用占位符保护Markdown语法\n\n通过正则表达式识别Markdown格式并用占位符替换：\n\n```go\nfunc protectMarkdown(text string) (string, map[string]string) {\n    replacements := make(map[string]string)\n    counter := 0\n    \n    \u002F\u002F 保护标题格式\n    re := regexp.MustCompile(`^(#{1,6})\\s+`)\n    result := re.ReplaceAllStringFunc(text, func(match string) string {\n        placeholder := fmt.Sprintf(\"[[HEADER_%d]]\", counter)\n        replacements[placeholder] = match\n        counter++\n        return placeholder\n    })\n    \n    return result, replacements\n}\n\nfunc restoreMarkdown(text string, replacements map[string]string) string {\n    result := text\n    for placeholder, original := range replacements {\n        result = strings.Replace(result, placeholder, original, -1)\n    }\n    return result\n}\n```\n\n### 方案三：分段处理保留格式\n\n将文本按段落分割，仅翻译内容部分，保留格式行：\n\n```go\nfunc translateMarkdown(text string) string {\n    lines := strings.Split(text, \"\\n\")\n    var translatedLines []string\n    \n    for _, line := range lines {\n        \u002F\u002F 检查是否为Markdown格式行\n        if isMarkdownFormatLine(line) {\n            \u002F\u002F 直接保留格式行\n            translatedLines = append(translatedLines, line)\n        } else {\n            \u002F\u002F 翻译普通文本行\n            translated := translateText(line)\n            translatedLines = append(translatedLines, translated)\n        }\n    }\n    \n    return strings.Join(translatedLines, \"\\n\")\n}\n\nfunc isMarkdownFormatLine(line string) bool {\n    trimmed := strings.TrimSpace(line)\n    \u002F\u002F 检查是否为标题行\n    return strings.HasPrefix(trimmed, \"#\")\n}\n```\n\n## 推荐实现\n\n推荐使用方案二（占位符保护），因为它：\n\n1. 精确度高，可以准确识别和保护各种Markdown格式\n2. 可扩展性强，可以轻松添加对其他格式的支持\n3. 不会影响翻译质量，因为占位符不会被翻译\n\n## 注意事项\n\n1. `UntranslatedText`参数不能用于保留Markdown格式，它仅用于指定不需要翻译的特定词汇\n2. 在实际应用中，可能需要保护多种Markdown格式，如列表、代码块等\n3. 建议在翻译前后都进行文本验证，确保格式正确性","go",0,"https:\u002F\u002Fblog4-1316398321.cos.ap-nanjing.myqcloud.com\u002Fblog5\u002F20250825122458__剪影.png",[14],"GO",false,{"id":17,"title":18,"title_en":19},28," Go语言性能分析"," Go language performance analysis",{"id":21,"title":22,"title_en":23},31,"Docker 部署 Elasticsearch 8.x","Docker Deployment of Elasticsearch 8.x","2025-08-24T20:24:22+08:00"]