Azure Translator翻译Markdown文档时格式丢失问题求助
解决Azure Translator翻译Markdown时的格式丢失问题
针对你遇到的翻译后Markdown格式错乱(元数据解析失败、引号内句号移位、图片路径被翻译、加粗格式破坏)问题,可通过以下方案解决:
1. 启用Markdown专属格式保留配置
Azure Translator Batch API支持针对Markdown文件的格式保留,需在翻译请求中明确指定文件格式并开启格式保留选项,避免标记错位:
修改代码中翻译请求的data部分,添加format和options参数:
const data = JSON.stringify({ inputs: [ { source: { sourceUrl: inputBlobSasUrl, }, targets: [ { targetUrl: `https://${process.env.OUTPUT_BLOB_STORAGE_ACCOUNT_NAME}.blob.core.windows.net/${process.env.OUTPUT_BLOB_STORAGE_CONTAINER_NAME}/${targetFileName}?${outputSas}`, language: 'es', glossaries: [ { glossaryUrl, format: 'csv', }, ], // 新增:目标语言的格式保留配置 options: { preserveFormatting: true, // 保留Markdown标记位置 sentenceSplitting: 'Off' // 关闭自动分句,避免标记错位 } }, ], storageType: 'File', format: 'markdown' // 明确指定源文件为Markdown格式 }, ], });
2. 单独处理YAML元数据区域
YAML元数据(---包裹的头部区域)不需要翻译,且格式错误会导致解析库失效,最可靠的方式是拆分元数据和正文,只翻译正文部分:
实现步骤:
- 先实现一个流转字符串的工具函数:
async function streamToString(stream) { const chunks = []; return new Promise((resolve, reject) => { stream.on('data', (chunk) => chunks.push(chunk)); stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8'))); stream.on('error', reject); }); }
- 在读取源Blob时拆分元数据和正文:
// 读取源Blob内容 const blobClient = inputContainerClient.getBlobClient(blob.name); const downloadResponse = await blobClient.download(); const content = await streamToString(downloadResponse.readableStreamBody); // 拆分YAML元数据和正文 const yamlRegex = /^---\n([\s\S]*?)\n---\n([\s\S]*)$/; const match = content.match(yamlRegex); let yamlPart = ''; let bodyPart = content; if (match) { yamlPart = match[1]; bodyPart = match[2]; }
- 将拆分后的正文保存为临时Blob提交翻译,翻译完成后再将原YAML元数据与翻译后的正文合并,写入目标Blob。
3. 保护图片路径和链接不被翻译
图片路径、URL链接不需要翻译,可通过两种方式处理:
- 自定义术语表:将所有固定路径(如
/assets/blog/dynamic-routing/cover.jpg)添加到术语表,设置为不翻译 - 占位符替换:翻译前将路径替换为唯一占位符(如
[[PATH_COVER]]),翻译完成后再替换回原路径
4. 修复引号内句号移位问题
启用preserveFormatting后,Translator会尽量保留引号的位置;若仍有问题,可将引号内包含句号的完整短语添加到自定义术语表,强制保留原有格式。
内容的提问来源于stack exchange,提问作者Richard Carrigan
相关产品推荐
相关产品推荐

