在看英文文献(PDF)时,经常碰到不懂的句子,这时就会把它复制粘贴到百度翻译。但是一个句子经常分布在多行,粘贴到百度翻译后句子的每行都被单独翻译了。这时就得手动地删掉不合适的空行,一次两次还好,经常这样就有些麻烦了。
网上查询答案后看到了百度翻译API文档,官方给了python的demo代码,在弄清楚其结构后,就尝试在它之上增加一个功能——去掉输入文字中的空行,完美地解决了我的问题。
为了便于使用,写了一个简单但够用的用户界面,它长这个样子:
在左边输入英文按下回车后,右边就会显示翻译结果了。
这个东西只是单纯的显示翻译结果,像音标、发音、中英文对照等功能都没有,而且编辑不方便(如提供一个×按钮来清空)。不过,其中的一些是API本身不支持(如文字转语音),另外的如加音标、方便操作的功能可以自己实现。
代码如下:
#coding=utf-8
import http.client as httplib
import hashlib
import urllib
import random
import json
import wx
def translate(q, fromLang = 'en', toLang = 'zh'):
# q ,将被翻译的文字
# fromLang = 'en',源语言,默认为英文
# toLang = 'zh',目的语言,默认为中文
appid = '需要设置成你自己appid'
secretKey = '需要设置成你自己secretKey'
httpClient = None
myurl = '/api/trans/vip/translate'
salt = random.randint(32768, 65536)
sign = appid+q+str(salt)+secretKey
# m1 = md5.new()
m1 = hashlib.md5()
m1.update(sign.encode(encoding="utf-8"))
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+urllib.parse.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
result = ""
try:
httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
#response是HTTPResponse对象
response = httpClient.getresponse()
recv_data = json.loads(response.read().decode("utf-8"))
for pair in recv_data["trans_result"]:
result += pair["dst"]+'n'
except Exception as e:
print (e)
finally:
if httpClient:
httpClient.close()
return result
class MyWin(wx.Frame):
def __init__(self, parent, title):
super(MyWin, self).__init__(parent, title = title, size = (500, 400),)
self.srcText = wx.TextCtrl(self, size = (240, 300), style = wx.TE_MULTILINE)
self.dstText = wx.TextCtrl(self, size = (240, 300), style = wx.TE_MULTILINE)
self.box = wx.BoxSizer(wx.HORIZONTAL)
self.box.Add(self.srcText, 1, wx.ALL|wx.EXPAND)
self.box.Add(self.dstText, 1, wx.ALL|wx.EXPAND)
self.srcText.Bind(wx.EVT_TEXT_ENTER, self.SrcEnter)
self.SetSizer(self.box)
self.SetAutoLayout(True)
self.box.Fit(self)
self.Centre()
self.Show()
def SrcEnter(self, e):
q = self.srcText.GetValue()
q = q.replace('n', '')
r = translate(q)
self.dstText.SetValue(r)
app = wx.App()
frame = MyWin(None, '百度翻译')
app.MainLoop()
其中,translate函数几乎完全照搬了官方提供的代码,只加了将翻译结果提取出来的部分。MyWin类实现了之前看到的用户界面,可以在其中的SrcEnter(用户在左边方框按下回车后会调用这个函数)中看到,把空('')替换掉了换行符('n'),这就是我全部的贡献了。
【注:上述代码适用于Python的3.X版本,而官方给的代码是2.X版本的,所以我对一些地方做了修改。此外,需要安装wxpython库来使用用户界面。事实上,python自带了用户界面库tkinter,但由于我对其不熟悉(好吧是懒),就没用。如果你会tkinter,完全可以不安装wxpython,自己写一个界面】