zoukankan      html  css  js  c++  java
  • 用python实现有道翻译,配合Goldendict显示

    先上效果图(划词翻译):

    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- 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])

    后记:

    1. 一开始我是申请返回有道翻译的xml文件的,然后发现json文件体积比xml文件小多了,而且python更方便读取解析json文件。
    2. 最痛苦就是设计web的显示界面,花了一晚时间上w3cschool学习html和css。
    3. 发声部分是学javascript的朋友帮我写的。
    4. 这是我第三个版本的代码,写多了,领悟也多了,主要是终于意识到字符串格式化的好处。一开始用+来连接两个字符串使得可读性低~~,有时使得html代码错乱。
    5. 其实html代码可以写成一个独立的文件,由pyfanyi.py读入,这样更加好,编辑html文件也更容易。
    6. 在ubuntu下用自己写的翻译软件看英文好有感觉,呵呵。

    使用:

    安装Goldendict,ubuntu可以在软件中心安装。

    把pyfanyi.py复制到/usr/bin文件夹里

    在编辑->Dictionaries->Pragrams里添加一个程序,名字填 pyfanyi,Type选Html,命令填pyfanyi.py %GDWORD%

  • 相关阅读:
    DOM对象的一些常用方法
    body-parser的使用
    CSS中box-sizing: border-box
    ES6 数组方法 --- map() filter() find()的用法
    JavaScript --- 预编译
    Vue过滤器filter
    Lock wait timeout exceeded; try restarting transaction
    lead函数
    Mysql 数据词典
    OOD
  • 原文地址:https://www.cnblogs.com/skyhacker/p/2346111.html
Copyright © 2011-2022 走看看