[Python]第三方模块:谷歌翻译接口--googletrans

先前我在翻译日文歌的歌词时,需要得到对应词句的罗马音和中文,最终比较多款网页翻译器,选择了谷歌翻译。后来发现谷歌翻译在翻译大段含换行符的文本时,返回的罗马音结果会除去换行符,而在文本中加入明显的分隔符,罗马音结果却不尽人意。最好的办法当然是逐句翻译,对于歌词的工作量可想而知。故我多番查找,最终找到了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:
pip install googletrans
或者是使用上面PyPI的通道下载googletrans包,然后手动安装。

使用

0.调用模块

import googletrans
如果是一般使用,可直接引用下属的翻译器类:
from googletrans import Translator

1.基本使用

我们使用Translator类来完成翻译工作。请参看下方的例子:

from googletrans import Translator
trans = Translator()
result = trans.translate('안녕하세요.', dest='ja', src='ko')

result变量返回一个Translated类:
<Translated src=ko dest=ja text=こんにちは。 pronunciation=Kon'nichiwa.>
(注:这是官网示例,实际上我测试时并没有这样的repr,反倒输出的是Python默认的repr格式,不知是版本问题还是bug。先保留原文的写法)

若要使用该模块,首先我们必须将模块中的Translator实例化,再调用translate方法。其中需要参数src(可不加,系统自动判断语言)、dest(可不加,默认为英文)、text(必加(废话),文本)。src和dest填语言代码,一般是二位字符串,具体可参照googletrans.LANGUAGES的内容:

In [2]: googletrans.LANGUAGES
Out[2]:
 {'af': 'afrikaans',
 'sq': 'albanian',
 'am': 'amharic',
 'ar': 'arabic',
 'hy': 'armenian',
 'az': 'azerbaijani',
 'eu': 'basque',
 'be': 'belarusian',
 'bn': 'bengali',
 'bs': 'bosnian',
 'bg': 'bulgarian',
 'ca': 'catalan',
 'ceb': 'cebuano',
 'ny': 'chichewa',
 'zh-cn': 'chinese (simplified)',
 'zh-tw': 'chinese (traditional)',
 'co': 'corsican',
 'hr': 'croatian',
 'cs': 'czech',
 'da': 'danish',
 'nl': 'dutch',
 'en': 'english',
 'eo': 'esperanto',
 'et': 'estonian',
 'tl': 'filipino',
 'fi': 'finnish',
 'fr': 'french',
 'fy': 'frisian',
 'gl': 'galician',
 'ka': 'georgian',
 'de': 'german',
 'el': 'greek',
 'gu': 'gujarati',
 'ht': 'haitian creole',
 'ha': 'hausa',
 'haw': 'hawaiian',
 'iw': 'hebrew',
 'hi': 'hindi',
 'hmn': 'hmong',
 'hu': 'hungarian',
 'is': 'icelandic',
 'ig': 'igbo',
 'id': 'indonesian',
 'ga': 'irish',
 'it': 'italian',
 'ja': 'japanese',
 'jw': 'javanese',
 'kn': 'kannada',
 'kk': 'kazakh',
 'km': 'khmer',
 'ko': 'korean',
 'ku': 'kurdish (kurmanji)',
 'ky': 'kyrgyz',
 'lo': 'lao',
 'la': 'latin',
 'lv': 'latvian',
 'lt': 'lithuanian',
 'lb': 'luxembourgish',
 'mk': 'macedonian',
 'mg': 'malagasy',
 'ms': 'malay',
 'ml': 'malayalam',
 'mt': 'maltese',
 'mi': 'maori',
 'mr': 'marathi',
 'mn': 'mongolian',
 'my': 'myanmar (burmese)',
 'ne': 'nepali',
 'no': 'norwegian',
 'ps': 'pashto',
 'fa': 'persian',
 'pl': 'polish',
 'pt': 'portuguese',
 'pa': 'punjabi',
 'ro': 'romanian',
 'ru': 'russian',
 'sm': 'samoan',
 'gd': 'scots gaelic',
 'sr': 'serbian',
 'st': 'sesotho',
 'sn': 'shona',
 'sd': 'sindhi',
 'si': 'sinhala',
 'sk': 'slovak',
 'sl': 'slovenian',
 'so': 'somali',
 'es': 'spanish',
 'su': 'sundanese',
 'sw': 'swahili',
 'sv': 'swedish',
 'tg': 'tajik',
 'ta': 'tamil',
 'te': 'telugu',
 'th': 'thai',
 'tr': 'turkish',
 'uk': 'ukrainian',
 'ur': 'urdu',
 'uz': 'uzbek',
 'vi': 'vietnamese',
 'cy': 'welsh',
 'xh': 'xhosa',
 'yi': 'yiddish',
 'yo': 'yoruba',
 'zu': 'zulu',
 'fil': 'Filipino',
 'he': 'Hebrew'}

googletrans.LANGCODES则是将上面的字典的键值全反过来,就不赘述了。

再看Translated类。它的repr返回了原先设置的src和dest,而此处的text则是翻译后的文字。如果是在交互命令行下直接输出这个repr也能达到翻译效果,但要是想拿到这个text,只需要调用Translated的成员变量text:

In [12]: result.text       
Out[12]: 'こ ん に ち は 。 '
2.翻译结果的其他信息

Translated类还有一些有趣的成员:

# 输出翻译后语言的发音(如果有的话)
In [13]: result.pronunciation                    
Out[13]: "Kon'nichiwa." # 日语罗马音,可以用此解决日文歌发音问题(python另外有模块pykakasi也可以解决此问题,此处不赘述)

# 显示额外信息
In [14]: result.extra_data                                       
Out[14]:
{'translation': [['こんにちは。', '안녕하세요.', None, None, 0],
 [None, None, "Kon'nichiwa.", 'annyeonghaseyo.']],
 'all-translations': None,
 'original-language': 'ko',
 'possible-translations': [['안녕하세요',
   None,
   [['こんにちは', 1000, False, False],
    ['ちょっと', 0, False, False],
    ['ハロー', 0, False, False],
    ['ねえ', 0, False, False]],
   [[0, 5]],
   '안녕하세요.',
   0,
   1],
  ['.', None, [['。', 1000, False, False]], [[5, 6]], None, 1, 2]],
 'confidence': 1.0,
 'possible-mistakes': None,
 'language': [['ko'], None, [1.0], ['ko']],
 'synonyms': None,
 'definitions': None,
 'examples': None,
 'see-also': None}

(上述结果由于Termius复制有缺陷,本人自行做了些许修正,显示出的效果可能与您的测试结果有所不同,请谅解)

对于extra_data这个成员,googletrans源代码中并未解释每一个键值对代表什么意思,可能这里是谷歌翻译开发用的数据,或者是用户收集下来供反馈用的数据,总之可能用户无需了解具体内容,我们就在此略过。各位可以自己多测试几次翻译,对比看看具体每个参数是做什么工作的。

3.其他参数和操作

掌握前面的知识,我们已经可以解决很多翻译问题了。但是我们实际测试发现,直接用官网上的实例,会直接卡死,原因其实在前面介绍中已经提及——我们默认调用的是translate.google.com的API,而由于国内伟大的墙显然上不去。介绍中提到了可以修改调用的API域名,那应该在哪里调整呢?

其实,Translator类也有一些可以调整的参数。首先我们先看Translator类的声明:
Translator(service_urls=None, user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64)', proxies=None, timeout=None)
想必各位应该都能猜出来上面的参数是什么意思。services_url给定API的地址,无需协议名,如果给出多个,那么每次翻译随机选择一个(根据实例和亲自测试,我们必须用列表包住url,否则会出现bug,不知道是什么原理);user_agent就是UA标识,这里已经给了就可以不填,当然你也可以用random.choice每次随机选UA;proxies就是代理;timeout就是超时的时间。后面三项,和urllib与requests的接口参数类似,这里就不赘述了,一般来说如果用translate.google.cn可以不加后面三项。

最后还有一个小操作,就是列表翻译:我们给定一个列表,就会返回每一项的翻译。测试如下:

In [56]: srcs = ['Hello, ', 'world!', 'The quick fox jumps \nover the lazy dog.']

In [57]: res = t.translate(srcs, dest='zh-cn')

In [58]: res
Out[58]:
[<googletrans.models.Translated at 0x7168e08>,
 <googletrans.models.Translated at 0x7168e48>,
 <googletrans.models.Translated at 0x6454148>]

In [59]: for i in res: print(i.text)
你好,
世界!
快速狐狸跳过
那只懒狗。




全文完。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容