跳到主要内容

如何用 Python 自动翻译 Markdown 文档

· 5 分钟阅读
Eric Cheng
Eric Cheng
JAVA 後端工程師

很多朋友问我这个网站多国语言是怎么做的 ?

Docusaurus 本身就支援 i18n,但是比较麻烦的是不同的语言对应的就是不同的 md 文档,当然也可以直接将繁中的 md 档内容贴到 google 翻译,然后再将翻译完成的内容贴回简中的 md 档,但身为工程师是不允许这样做的...

Google Translate API​

其实正解应该是使用 Google Translate API,不过这个服务是付费的,而且需要先注册 GCP 帐号,并不符合我不想付钱的需求

Selenium 执行 Google 翻译网页​

回到文章最前面

可以直接将繁中的 md 档内容贴到 google 翻译,然后再将翻译完成的内容贴回简中的 md 档

如果写成自动化程式直接执行,问题是不是就解决了 ?

Selenium 是最直觉想到的工具,我们这里使用的 Selenium Python 的版本

前置作业​

  • 电脑安装 Python 环境
  • 下载 webdriver 对应电脑 chrome 版本

然后我们找到了 google 翻译的网址
https://translate.google.com.tw/?sl=zh-TW&tl=zh-CN&op=translate
其中sl=zh-TW => 代表来源是繁中,tl=zh-CN => 代表要翻译成简中,只需要更改这两个参数,就可以更改要翻译的语言

再来要定位 input 和 output
input 比较简单,整个页面只有一个 textArea,所以也不需要特别定位
output 就比较麻烦,先按 F12,叫出 chrome dev tools (其他的浏览器也有对应的功能,这里用 chrome),然后在翻译的地方随便打几个字

translate-md-02

在对应的 span 按右键,选「Copy」再选「Copy Xpath」

translate-md-01

就会取得像以下的值

//*[@id="yDmH0d"]/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[2]/div[5]/div/div[1]/span[1]/span/span

开始写程式​

安装 Selenium

pip install selenium

设定的部份填上自己电脑环境的资料

  • chrome_driver_path: 刚才下载 webdriver 后存放的路径
  • source_path: 翻译档案来源路径
  • target_path: 翻译后档案存放路径
  • translate_files: 要翻译的档案,可一次设定多个档案
  • source_language: 翻译来源语言
  • target_language: 翻译后语言
  • target_xpath: 刚才查到的 XPath
  • sleep_second: 避免执行太频繁,sleep 的秒数

完整程式码如下

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# Setting
chrome_driver_path = "C:/software/chromedriver_win32/chromedriver.exe"

source_path = 'C:/project/havocfuture/src/pages/'
target_path = 'C:/project/havocfuture/i18n/zh-hans/docusaurus-plugin-content-pages/'

translate_files = ['a.md', 'b.md']
source_language = 'zh-TW'
target_language = 'zh-CN'

target_xpath = '//*[@id="yDmH0d"]/c-wiz/div/div[2]/c-wiz/div[2]/c-wiz/div[1]/div[2]/div[2]/c-wiz[2]/div[5]/div/div[1]/span[1]/span/span'

sleep_second = 1

## 翻译 function
def translate_text(_text):
url = "https://translate.google.com.tw/?sl=" + source_language + "&tl=" + target_language + "&op=translate"

options = webdriver.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--headless")
options.add_argument('--disable-infobars')
options.add_argument('--blink-settings=imagesEnabled=false')
driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
driver.get(url)

time.sleep(sleep_second)
input_element = driver.find_element_by_tag_name('textArea')
input_element.send_keys(_text)
time.sleep(sleep_second)

result_elements = driver.find_element_by_xpath(target_xpath)
result = result_elements.text

time.sleep(sleep_second)
driver.close()

return result

# 回圈翻译档案
for x in translate_files:
source_file_path = source_path + x
target_file_path = target_path + x

f1 = open(source_file_path, 'r', encoding="utf-8")
source_content = f1.read()
f1.close()

f2 = open(target_file_path, 'w', encoding="utf-8")
target_content = translate_text(source_content)
f2.write(target_content)
f2.close()

这样只要设定完后,执行后就可以一口气就 Markdown 文档翻译完且放在对应的路径下了

已知问题​

google 翻译页面不能翻译超过 5000 字元,如果档案太大是会翻译失败的,如果有太大档案的翻译需求,看来还是要乖乖付钱去用 google translate API

googletrans​

名字取得很像 google 官方的工具,但实际上是第三方的 lib,我是写完上面使用 selenium 才发现这个工具的,怎么使用可以参考官方文件,就不再多说

要注意的是直接用 pip install 的版本 3.0.0 我实测是不能用的,估计是 google 有改版,但原作者没有继续维护下去,改安装社群修改过后的版本

pip install googletrans==3.1.0a0

实测 3.1.0a0 这个版本可以正常使用没有问题

版权声明


這是 google 廣告