先前我在翻译日文歌的歌词时,需要得到对应词句的罗马音和中文,最终比较多款网页翻译器,选择了谷歌翻译。后来发现谷歌翻译在翻译大段含换行符的文本时,返回的罗马音结果会除去换行符,而在文本中加入明显的分隔符,罗马音结果却不尽人意。最好的办法当然是逐句翻译,对于歌词的工作量可想而知。故我多番查找,最终找到了Python下的一个第三方模块——googletrans。
PyPI链接
官方API链接
以下的内容手翻自PyPI项目介绍:
Googletrans是一款免费、无极限、模拟谷歌翻译API的Python库。它使用了Google Translate Ajax API来调用可用于探测和翻译的方法。
本库支持Python2.7+和3.4+(注意:Python 2将在下一个主要更新中被移除)。
特性:
- 快速且可靠——它使用的服务器与translate.google.com相同;
- 自动识别语言;
- 大片文本翻译(译注:这是直译的结果,实际测试发现这个模块支持对列表里每一句话翻译);
- 自定义服务器url(译注:也就是可以选择translate.google.cn提速);
- 连接池(requests.Session的优势);
- 支持HTTP/2。
可以使用pip:
。
或者是使用上面PyPI的通道下载googletrans包,然后手动安装。
0.调用模块
。
如果是一般使用,可直接引用下属的翻译器类:
。
1.基本使用
我们使用Translator类来完成翻译工作。请参看下方的例子:
result变量返回一个Translated类:
(注:这是官网示例,实际上我测试时并没有这样的repr,反倒输出的是Python默认的repr格式,不知是版本问题还是bug。先保留原文的写法)
若要使用该模块,首先我们必须将模块中的Translator实例化,再调用translate方法。其中需要参数src(可不加,系统自动判断语言)、dest(可不加,默认为英文)、text(必加(废话),文本)。src和dest填语言代码,一般是二位字符串,具体可参照的内容:
而则是将上面的字典的键值全反过来,就不赘述了。
再看Translated类。它的repr返回了原先设置的src和dest,而此处的text则是翻译后的文字。如果是在交互命令行下直接输出这个repr也能达到翻译效果,但要是想拿到这个text,只需要调用Translated的成员变量text:
2.翻译结果的其他信息
Translated类还有一些有趣的成员:
(上述结果由于Termius复制有缺陷,本人自行做了些许修正,显示出的效果可能与您的测试结果有所不同,请谅解)
对于extra_data这个成员,googletrans源代码中并未解释每一个键值对代表什么意思,可能这里是谷歌翻译开发用的数据,或者是用户收集下来供反馈用的数据,总之可能用户无需了解具体内容,我们就在此略过。各位可以自己多测试几次翻译,对比看看具体每个参数是做什么工作的。
3.其他参数和操作
掌握前面的知识,我们已经可以解决很多翻译问题了。但是我们实际测试发现,直接用官网上的实例,会直接卡死,原因其实在前面介绍中已经提及——我们默认调用的是translate.google.com的API,而由于国内伟大的墙显然上不去。介绍中提到了可以修改调用的API域名,那应该在哪里调整呢?
其实,Translator类也有一些可以调整的参数。首先我们先看Translator类的声明:
想必各位应该都能猜出来上面的参数是什么意思。services_url给定API的地址,无需协议名,如果给出多个,那么每次翻译随机选择一个(根据实例和亲自测试,我们必须用列表包住url,否则会出现bug,不知道是什么原理);user_agent就是UA标识,这里已经给了就可以不填,当然你也可以用random.choice每次随机选UA;proxies就是代理;timeout就是超时的时间。后面三项,和urllib与requests的接口参数类似,这里就不赘述了,一般来说如果用translate.google.cn可以不加后面三项。
最后还有一个小操作,就是列表翻译:我们给定一个列表,就会返回每一项的翻译。测试如下: