用python实现有道翻译,配合Goldendict显示
先上效果图(划词翻译):
代码:
1 #!/usr/bin/env python
2 #coding:utf-8
3
4 import json
5 from urllib import urlopen
6 import sys
7 reload(sys) #要reload一次sys才能使用setdefaultencoding函数
8
9 sys.setdefaultencoding('utf-8') #要将系统默认字符编码设置为utf-8,在Goldendict才能正常输出
10
11 html = """
12 <html>
13 <head>
14 <script type="text/javascript">function playSound(){var ky = document.getElementById("key");var word = ky.childNodes[0].nodeValue;var api = "http://dict.youdao.com/dictvoice?audio=" + encodeURIComponent(word);var ado = document.getElementById("media");try{ado.ended = true;ado.setAttribute("src",api);ado.load();ado.play();return false;}catch(err){alert(err.description);return false;}}</script>
15 </head>
16 <body>
17 <style type="text/css">
18 div.block {
19 border:1px solid #BEBEBE;
20 background:#F0F0F0;
21 margin-left:20px;
22 border-radius: 5px;
23 }
24 div.name {
25 margin-top:10px;
26 margin-bottom:5px;
27 margin-left:20px;
28 font-size:13px;
29 font-weight:bold;
30 }
31 div.item {
32 padding:5px;
33 font-size:12px;
34 margin: 0px 10px 0px 10px;
35 }
36 #web {
37 border-style: none none solid none;
38 border-color: #BEBEBE;
39 border-bottom-width: 1px;
40 }
41 </style>
42 <div class="content">
43 <div class="name"><i>查询:</i></div>
44 <div class="block">
45 %s
46 </div>
47 <div class="name"><i>有道翻译:</i></div>
48 <div class="block">
49 %s
50 </div>
51 <div class="name"><i>有道词典-基本词典:</i></div>
52 <div class="block">
53 %s
54 </div>
55 <div class="name"><i>有道词典-网络释义:</i></div>
56 <div class="block">
57 %s
58 </div>
59 <div class="name"><i>更多结果:</i></div>
60 <div class="block">
61 %s
62 </div>
63 </div>
64 </body>
65 </html>
66 """
67
68 errorHtml = """
69 <html><body>
70 <div class="block">
71 <div class="item">%</div>
72 </div>
73 </body></html>
74 """
75
76 errorResult = {'0':'', '20':'要翻译的文本过长', '30':'无法进行有效的翻译',
77 '40':'不支持的语言类型', '50':'无效的key'}
78
79 def printHtml(errorCode, query, translation, basic, web):
80 """打印html"""
81 if errorCode != 0:
82 print errorHtml % errorResult[errorCode]
83 return
84 item = '<div class="item">%s</div>'
85 #有道翻译
86 q = item % ('<b>"%s"</b>' % query)
87 trans = ''
88 for i in translation:
89 trans += item % ('<b>"%s"</b>' % i)
90
91 #有道词典
92 key = ''
93 if basic:
94 key += '<span id="key" style="font-weight:bold">%s</span>' % (query + ' ')
95 if 'phonetic' in basic.keys():
96 key += '[%s]' % basic['phonetic']
97 key += '<button id="sound" onclick="playSound()">sound</button><audio id="media"></audio>'
98 key = item % key
99 if 'explains' in basic.keys():
100 #判断查询的词是不是中文
101 isChinese = False
102 for c in query:
103 if ord(c) >= 0x4e00 and ord(c) <= 0x9fa5:
104 isChinese = True
105 break
106 if not isChinese:
107 for i in basic['explains']:
108 key += item % i
109 else:
110 for i in basic['explains']:
111 key += item % ('<a href="%s">%s</a>' % (i, i))
112 key += item % ('<a href="http://dict.youdao.com/w/%s">%s</a>' % (query, '更多解释'))
113
114 #web词典
115 webdict = ''
116 webitem = '<div %s class="item">%s<br/>%s</div>'
117 if web:
118 if len(web) > 1:
119 for i in range(len(web)-1):
120 webdict += webitem % ('id="web"', web[i]['key'], ', '.join(web[i]['value']))
121 webdict += webitem % ('', web[-1]['key'], ', '.join(web[-1]['value']))
122
123 if not key:
124 key = item % '对不起,没有结果'
125 if not webdict:
126 webdict = item % '对不起,没有结果'
127 #更多搜索
128 moreSearch = '<div class="item"><a href="http://dict.bing.com.cn/?FORM=BNGCN#' + \
129 query + '">通过Bing词典搜索</a></div>'
130 moreSearch += '<div class="item"><a href="http://test.iciba.com/' + \
131 query + '">通过iciba词典搜索</a></div>'
132 moreSearch += '<div class="item"><a href="http://www.baidu.com/s?wd=' + \
133 query + '">通过百度搜索</a></div>'
134 moreSearch += '<div class="item"><a href="http://www.google.com.hk/#q=' + \
135 query + '">通过Google搜索</a></div>'
136
137 print html % (q, trans, key, webdict, moreSearch)
138
139 def getData(string):
140 data = json.loads(string)
141 errorCode = data['errorCode']
142 query = data['query']
143 translation = data['translation']
144 basic = {}
145 if 'basic' in data.keys():
146 basic = data['basic']
147 web = []
148 if 'web' in data.keys():
149 web = data['web']
150
151 printHtml(errorCode, query, translation, basic, web)
152
153 def searchWord(word):
154 url = r'http://fanyi.youdao.com/openapi.do?keyfrom=<yourname>&key=<yourkey>&type=data&doctype=json&version=1.1&q=' + word
155 f = urlopen(url)
156 jsonStr = f.read()
157 getData(jsonStr)
158
159 if __name__ == '__main__':
160 searchWord(sys.argv[1])
后记:
- 一开始我是申请返回有道翻译的xml文件的,然后发现json文件体积比xml文件小多了,而且python更方便读取解析json文件。
- 最痛苦就是设计web的显示界面,花了一晚时间上w3cschool学习html和css。
- 发声部分是学javascript的朋友帮我写的。
- 这是我第三个版本的代码,写多了,领悟也多了,主要是终于意识到字符串格式化的好处。一开始用+来连接两个字符串使得可读性低~~,有时使得html代码错乱。
- 其实html代码可以写成一个独立的文件,由pyfanyi.py读入,这样更加好,编辑html文件也更容易。
- 在ubuntu下用自己写的翻译软件看英文好有感觉,呵呵。
使用:
安装Goldendict,ubuntu可以在软件中心安装。
把pyfanyi.py复制到/usr/bin文件夹里
在编辑->Dictionaries->Pragrams里添加一个程序,名字填 pyfanyi,Type选Html,命令填pyfanyi.py %GDWORD%