昨天看到一篇关于Linux下的桌面词典的文章,于是就想实现一个Windows命令行下的翻译软件。下面,我将一步步的来实现这个简单的小软件。
准备
按照瀑布开发模型,需要进行一些列的流程,在这里由于是博主自己使用,所以就省略了需求分析,系统设计,编码设计这些阶段,直奔主题了。
素材
博主本次试验的环境大致如下:
- 操作系统: Windows 7 64位
- 编程语言:Python (版本2.7.11)
- IDE: PyCharm 专业版
依赖
如上,根据实验环境,所需的依赖就不难理解了。不过除了接口,也没有用到什么第三方的库。所以依赖也是很简单的了。就是百度翻译的公共API接口。待会再介绍。
接口
至于什么是接口。与其说是一种规范,我个人觉得对咱们开发者而言,了解怎么使用就可以了,所以把它当做是一个函数就可以了。我们传给这个接口一些参数,然后处理返回的结果。这就可以了!够白话了吧:-)
地址
本次试验,依赖的接口是国内互联网公司三巨头之一的百度的一个公共的翻译接口。如下:
http://fanyi.baidu.com/v2transapi
待会通过get的方式或者post的方式进行与服务器的交互,就能完成今天的实验了。
参数
#
# 执行文本翻译
# query 要翻译的文本
# from 原语言语种 默认:中文
# to 目标语种 默认:英文
如上,了解了这三个参数就足够了。
返回值解析
我这里模拟请求了一下服务器,获得了其返回的一串JSON数据。大致的串如下:
编码及测试
现在万事俱备,只欠一个能编码的程序员了。:-)
Python处理JSON串简直是酸爽,特别的快速!
功能代码
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/29'
# __Desc__ = 实现命令行下的翻译程序实现
from urllib2 import *
import json
import sys
def getHtml(type=True, text='English'):
if type:
translate_url = "http://fanyi.baidu.com/v2transapi?query=%s"%text
else:
translate_url = "http://fanyi.baidu.com/v2transapi?from=zh&to=en&query=%s" % text
data = urlopen(translate_url).read()
return data
def main():
# 这里使用encode为gbk的方式是为了在Windows的DOS界面下不发生乱码的情况
flag = raw_input("英文转汉语输入1,汉语转英文输入0:".encode('gbk')).encode('utf8')
# 应该考虑到windows 的DOS界面下输入的字符编码为gbk,要想被代码正确的用utf-8解码,首先先用gbk解码,还原为愿字符
querytext = raw_input("请输入您想查询的内容\n".encode('gbk')).decode('gbk')
if flag == 1:
data = getHtml(type=False, text=querytext)
else:
data = getHtml(text=querytext)
data = json.loads(data)
# 分析json数据串,定向的获取到相应的解释信息
# 首先打印出单词的简单含义
print "\n翻译结果:".encode("gbk")
print data['trans_result']['data'][0]['dst']
if __name__ == '__main__':
main()
运行脚本
为了能直接的在命令行下使用,就得在环境变量里面进行一下设置了。不然,每次都得到这个文件路径下,那样岂不是很麻烦,这很明显不符合Pythonic的风格嘛。
于是写了一个脚本:
@echo off
python D:/mycommand/translate.py
是不是超简单呢?
环境变量
接下来就是把这个批命令bat文件的路径添加到环境变量中了。为了引起不必要的麻烦,我添加到了当前用户的环境变量中,这样就算是以后要更改,也不会影响到系统的环境变量了。
具体的方法,网上有很多参考资料,这里不过多的进行阐述了。
结果展示
最激动人心的时刻,到了。下面你将看到命令行下的精彩的世界。完善了上面步骤,就拥有了一个命令行下的翻译软件咯。:-)
英语转汉语
汉语转英语
总结
最后,来总结一下本次试验。
代码难度一般般,也可以说很简单了。就是些基础的Python内置模块的使用,额外需要掌握的就是接口,以及接口的使用等知识了。
另外,本实验可拓展性很强,因为这个接口内部又可以判断源语言的类属的功能,也就是说我们可以完成更加智能的翻译实现。不管什么语言,都可以被翻译,如果要指定目标语言的话,加个参数就即可。