背景

近期在搭建英文博客-<e-whisper.com>, 需要对现有的所有中文 Markdown 翻译为英文。

需求如下:

  • 将 Markdown 文件从中文 (zh-CN) 翻译为英文 (en)
  • 翻译后要保留 Markdown 的完整格式
  • 部分 Markdown block 不需要翻译,如:front-matter、代码块 等

但是实际使用中,试了好几款翻译(包括 Google,DeepL,Azure), 结果发现效果都不理想。

也找到了一些专门针对 markdown 的翻译方案,基本上都是这种方案:将 Markdown 拆分为"段".

一起看看吧。

Markdown 商业及开源解决方案

  • simpleen: 商业版
  • GT4T: 商业版
  • markdown-translator: GitHub 开源项目,基于 JavaScript 和 Azure Translate 收费 API
  • Markdown Docs Translator: GitHub 开源项目,基于 Python 和 主流免费翻译 API (Yandex/Google/Bing/Deepl)
  • ChatGPT + Prompt(markdown+翻译) ?

Simpleen

Simpleen 是个在线翻译服务,你可以通过不同的方式使用 Simpleen 来翻译和本地化你的软件:

使用在线 web 翻译器,在本地使用 CLI(连续翻译)或通过 API 自定义使用。其后端是调用 Deppl 的翻译服务。

以下是使用其翻译的效果:

可以看到,翻译除了将[toc] 翻译为 \[toc] 之外,其他都完全准确。

另外上图也可以看到,Simpleen 定位非常准确,就是针对开发者群体的,还有 Variable 相关功能。

Simpleen 一大特色功能是:Custom Translator, 如:

  • Python-i18n
  • Vue I18n
  • YAML
  • JSON
  • Markdown
  • ...

同时 Simpleen 也支持自定义词库功能,称为:Glossaries. 可以自定义个人词库。

Simpleen 就是将完整的 markdown 文档,按照 markdown 语法格式,将其拆分为一个个的 Segment. 并对每一个 Segment 进行翻译,如下:

通过 Segments 也可以看出,Simpleen 是将上篇提到的 2 种方法结合起来实现:

  1. 将 Markdown 转换为 html
  2. 将 html 拆分为 Segments
  3. 将 Segment 逐一翻译
  4. 将翻译后的 Segment html 转换为 markdown.

Simpleen 使用总结

优点:

  • 准确度高
  • 实用的特色功能:Custom Translator
  • 实用的特色功能:Variable 支持
  • 实用的特色功能:Glossaries
  • 底层基于 Deepl, Deepl 的翻译效果是最自然的。
  • 多种使用方式:web/api/cli

缺点:

  • 贵,基于 Segment 收费,价格也贵的厉害。

    • 最便宜的月费也得 $15, 并且只有 1,000 Text Segments

GT4T

Reference:

GT4T 不只是又一个翻译应用。它是一个超级插件,可以帮助你在任何 Windows/Mac 窗口中使用任何语言写作;也是一个超级文件翻译器,你可以不用上传,在你自己的电脑上翻译文件。

官方宣传其特色功能有:

  • 超级插件:运行在 29 个自动翻译引擎之上。无论哪个语言,GT4T 总是能为你提供最好的自动翻译。
  • GT4T 文件翻译器:GT4T 文件翻译器可以批量翻译文件。GT4T 可以处理包括 Office 或桌面出版文档在内的 20 种文件类型。而且如果你从事翻译业务并使用 CAT 工具,你也可以使用 GT4T 来翻译 Trados 或其他 CAT 项目。也有自己的词汇表。

其在 Translate Markdown/reStructuredText/AsciiDoc/DocBook XML and other documents 这里宣称可以翻译 Markdown, 具体步骤也很详细,这里就不展开了。

但是我在实际使用中,一方面发现它是个桌面 app, 没有 api/cli, 不适合开发者的使用需求,另一方面它对 markdown 的翻译结果相比 Simpleen 准确度欠佳。

markdown-translator

使用 Azure 文本翻译 API 直接翻译 Markdown 文件

其使用的前提条件是:从 Azure 服务 获取文本翻译 API 密钥

主要是通过 CLI 的方式使用:

# install cli
npm install markdown-translator -g # set key from Azure Text Translate API
md-translator set --key <your key>
md-translator set --region <your region> # do translate
md-translator translate --src README.md --dest README.zh.md --to zh # get more information
md-translator --help

也可以通过模块方式使用:

# install module
npm install markdown-translator
const markdownTranslate = require('markdown-translator')
markdownTranslate({
src,
// 要么
text, from,
to,
subscriptionKey,
}).then((res) => {
// deal with result
})

目前我的英文站:https://e-whisper.com/ 就是完全基于这种方式翻译的。大家可以去访问看一下,评价一下翻译效果怎么样。

它的实现方案也是:将 markdown 文档拆分为"段", 再进行翻译。

后端调用的是 Azure https://api.cognitive.microsofttranslator.com/ 的 3.0 的文本翻译接口。

另外 Azure 也直接支持 Markdown 文档 翻译功能。

但是价格比文本翻译略贵。

以下是我的一些感受:

优点:

  • 基于 Azure Translate API, 将 markdown 拆分为"段"后调用一次 API 获取完整翻译结果,价格可接受
  • 翻译后 Markdown 格式基本没有错误。
  • CLI 的方案结合一些脚本,可以实现批量翻译,效率很高。

比如很简单的一个脚本,实现批量翻译:

#!/bin/bash

# 遍历指定目录下的所有文件
for MD in source/_posts/*; do
echo "------Translating ${MD}------"
md-translator translate --from zh-CN --to en --src ${MD} --dest ${MD} 2>&1 >>logs/md-translator.log
done

缺点:

  • 基于 Azure Translate API, 我个人感觉 Azure 的翻译效果没有 Deppl 的好。
  • Markdown 内嵌的一些 front-matter 等,翻译还是存在问题。建议翻译前先将 front-matter 拿掉。
  • 可能还是 Azure Translate API 的问题,对同一个词汇前后会出现好多不同版本的翻译后词汇(没有自定义词汇表导致的), 另外上下文也不是特别连贯。

目前的个人感受是基本可用,但是还是有一些特殊需求无法满足,后续我可能会尝试直接使用 Azure 最新提供的 Python SDK 进行开发定制。

Markdown Docs Translator

Markdown Docs Translator 是一个 Markdown 文档的自动翻译器,用 Python 构建。该工具支持多种翻译服务,并提供各种选项来定制翻译过程。

功能:

  • 支持多种翻译服务(Yandex, Google, Bing, Deepl)。
  • 多线程以加快翻译速度。
  • 覆盖原始文件、删除原始文件或用翻译文本创建一个新文件的选项。
  • 缓存以加快重复翻译。
  • 动词水平控制。

具体使用方法也是先安装再通过 CLI 使用:

pipx install md-translate
md-translate path_to_file_or_folder -F source_lang -T target_lang -P service [OPTIONS]

之前,我试用了好多次,都没有成功,可能是跟它使用的是翻译的免费接口有关,容易被封,无法提供稳定的服务。

最近看了一下,它已经改为基于 selenium 模拟浏览器的行为去访问,可能会好一些。后续有机会试试。

另外它的代码结构也很清晰明了,后续也仔细学习一下它的源码。

ChatGPT + Prompt ?

这应该也是一种思路,利用 ChatGPT 的强大能力。但是关键点在于如何提供有效的 Prompt, Prompt 可能是要强调 Markdown 语法,并利用 ChatGPT 出众的上下文理解和自然语言翻译能力给出翻译结果。

甚至还可以利用 ChatGPT 已有的能力,对文章进行进一步的润色、补充、语气调整等。

未来可期。

不过可能大量翻译的话,API 调用费用会贵上不少吧?

总结

本文很浅显地总结了一些我收集到的 markdown 文档的翻译方案。

主要是基于:将 Markdown 拆分为"段" 的思路。

或者是:将 Markdown 拆分为"段" 和 将 Markdown 翻译为 HTML 二者结合起来。

这里我了解了 4 种:

相关方案肯定很多,笔者由于精力和时间所限,无法一一列举。欢迎各位补充~

同时也结合近期 ChatGPT 的爆火,提出用 ChatGPT 翻译 markdown 的可能性。

希望对您有所帮助。

如何翻译 Markdown 文件?-2-几种商业及开源解决方案介绍的更多相关文章

  1. 初遇Git与MarkDown 文件

    新年好! 昨晚熬夜在学Git,稍微会了一些命令. 推荐大家去try.github.io上学习,这是GitHub提供的网页,它在网页提供了一个“伪”模拟器,根据网页的提示学习命令.网页上说15分钟就能学 ...

  2. .md即markdown文件的基本常用编写语法(图文并茂)

    序言: 很久没有写博客了,感觉只要是不写博客,人就很变得很懒,学的知识点感觉还是记不住,渐渐地让我明白,看的越多,懂的越少(你这话不是有毛病吗?应该是看的越多,懂的越多才对),此话怎讲,当你在茫茫的前 ...

  3. 为Markdown文件生成目录

    缘由 思路 效果 代码实现 缘由 Markdown源生文件源生不支持目录,目前比较主流的生成目录的方式(各式插件),都是转化为HTML文件.虽然HTML文件可以生成眼花缭乱的目录,但是修改起来又没有M ...

  4. .md即markdown文件的基本常用编写语法

    因为现在的前端基本上都用上了前端构建工具,那就难免要写一些readme等等的说明性文件,但是这样的文件一般都是.md的文件,编写的语法自然跟其他格式的文件有所区别,本文也是我学习写markdown文件 ...

  5. 转 .md即markdown文件的基本常用编写语法(图文并茂)

    原文链接:.md即markdown文件的基本常用编写语法(图文并茂) 序言: 很久没有写博客了,感觉只要是不写博客,人就很变得很懒,学的知识点感觉还是记不住,渐渐地让我明白,看的越多,懂的越少(你这话 ...

  6. Markdown文件导出为HTML的小程序

    Markdown文件导出为HTML的小程序 为什么做 最近把一些学习经验记下来,总结成MarkDown文件,不知不觉已经有12篇了. Sublime Text 的 MarkDown Preview 插 ...

  7. jsp:jsp包含文件的两种方式

    第一种:include指令 include指令:当JSP转换成Servlet时引入指定文件(指令元素),这是一种静态包含,它运行的时候不会单独编译成.class文件,它生成一个新的整体.class文件 ...

  8. markdown文件的基本常用编写语法

    .md即markdown文件 1.标题的几种写法: 第一种:     前面带#号,后面带文字,分别表示h1-h6,上图可以看出,只到h6,而且h1下面会有一条横线,注意,#号后面有空格 第二种:   ...

  9. .md 即 markdown 文件的基本常用编写语法

    0. 前言 Markdown 是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式.现在的项目都使用了 git 仓库,再加上远程仓库 github 托管,那就难免要写一些 ...

  10. Linux下文件的七种类型

    文件属性 1. 本章引言 上一章通过学习文件io,知道了如何使用文件io来打开文件,对文件进行读写等操作,那么我们这一章将换一个角度,专门围绕文件属性进行相关的讨论. 1.1 什么是文件属性? 我们通 ...

随机推荐

  1. C++ //set/multiset 容器 //set不可以插入重复的数字 multiset可以插入重复的数字 //ste容器构造和赋值 //set大小和交换 //set 插入和删除 //set查找和统计 //set 和 multiset 区别 //pair 对组创建 //set存放自定义数据类型 //set内置数据 进行排序

    1 //set/multiset 容器 //set不可以插入重复的数字 multiset可以插入重复的数字 2 //ste容器构造和赋值 //set大小和交换 //set 插入和删除 3 //set查 ...

  2. zabbix“专家坐诊”第178期问答汇总

    大家好,我是乐乐.早在三年前,我们就在社区举办了zabbix公益问答活动,并且定在每周三邀请资深的zabbix技术工程师,为社群的小伙伴进行免费的答疑.到现在已经178期了.后续我将会把每期的答疑汇总 ...

  3. vm 虚拟机总是蓝屏 移除打印机和声卡 移除这俩硬件 (大文件用飞秋传输)

    vm 虚拟机总是蓝屏 移除打印机和声卡 移除这俩硬件 (大文件用飞秋传输)

  4. stm32 使用多串口通信调试总结

    前记:   stm32使用多个串口通信,这个项目遇到了不少问题,值得反思和深入总结一下.   提纲:  这次的问题,主要有几个部分组成: A 多串口的DMA配置,这个需要注意,尽量不要使用同一个DMA ...

  5. python3 Crypto模块实例解析

    一 模块简介 1.简介 python的Crypto模块是安全hash函数(例如SHA256 和RIPEMD160)以及各种主流的加解密算法的((AES, DES, RSA, ElGamal等)的集合. ...

  6. JSF+EJB+JPA之整体思想

    序言: JSF+EJB+JPA 其实没有想象中的难,不过要做好应用以及在合适的地方建立应用,才是真正的难点. 好的技术在不合适的地方做了应用,那也只能是垃圾. 所以这个东西并不适合于太小规模的企业应用 ...

  7. GdbServer和libuuid移植到HISI3520d

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. DialogFragment源码分析

    目录介绍 1.最简单的使用方法 1.1 官方建议 1.2 最简单的使用方法 1.3 DialogFragment做屏幕适配 2.源码分析 2.1 DialogFragment继承Fragment 2. ...

  9. HTML/ CSS 入门

    前言 我们在之前的学习中,对于网络有了一定的了解.现在我们来学习一些基础的 HTML/ CSS 知识.希望阅读完这篇文章能达到编写简单页面的程度. 目录: HTML/ CSS 的发明: HTML 基础 ...

  10. JS 为什么0==““ 会是true

    0 是逻辑的 false 1 是逻辑的 true空字符串是逻辑的 false null 是逻辑的 false NaN==任何 都是false 所以:空字符串是逻辑的 false , 0是逻辑的fals ...