用Java做一个及时翻译工具
平时看英文文档或者查询资料的时候,遇到了不懂的单词,就要去百度,然后就会很麻烦。于是就想到用Java写一个及时翻译的小工具!
预期的实现效果:
双击选中一个单词,按下Ctrl+C进行复制
然后马上显示出对应单词的中文翻译
首先基本思路是这样的:
- 首先获取系统剪切板的内容
- 将该内容发送到网页上,然后获取网页的源码,查找到对应的中文解释
- 将中文翻译显示出来
以上就是基本的思路!但是实际操作的时候还是遇到了很大的困难的。
先写两个接口
得到剪切板的内容
这个并不是很困难,毕竟java有提供对应的API,代码如下:
package translate;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;public class ClipboradUtils {protected static String getClipboardText() throws Exception{Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();//获取系统剪贴板// 获取剪切板中的内容Transferable clipT = clip.getContents(null);if (clipT != null) {// 检查内容是否是文本类型if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))return (String)clipT.getTransferData(DataFlavor.stringFlavor); }return null;}
}
以上是放在一个工具类,做成静态函数方便调用!
获取网页源码
首先想到是就是去百度翻译
我们在这里翻译单词 blue
我们看地址栏http://fanyi.baidu.com/?aldtype=16047#en/zh/blue
,刚好我们要翻译的单词就在最后,所以只要爬取页面http://fanyi.baidu.com/?aldtype=16047#en/zh/待查单词
的源代码,然后做一些筛选就可以了!
然后事情进展的却并不是那么的顺利,百度的这个应该是为了防止爬取,所以翻译的操作应该是Dom操作,源代码上面毫无翻译痕迹。
这个方法就终止了。
然后想到的是百度翻译是否有开放接口
果然,百度翻译提供了开放的接口,但是貌似要收费。
http://api.fanyi.baidu.com/api/trans/product/index
当然,我建议大家用这个方法,毕竟人家公司也不容易,而且功能也相对很丰富。
但是,如果真的不想花钱就不行了吗?答案是否定的!
意外收获
我在百度直接搜索一个单词的是否发现也会出现对应的翻译!如下:
然后查看一下源代码,搜索蓝色
,果然,源代码上面是有翻译结果的(偷笑)。
而且对应的翻译内容就在<span class="op_dict_text2">
和</span>
之间!
百度搜索的url对应的是http://www.baidu.com/s?wd="搜索内容"
于是就可以把获取翻译内容的工具类写好了,代码如下:
package translate;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class GetHtmlContentUtils {private final static String PreUrl="http://www.baidu.com/s?wd="; //百度搜索URLprivate final static String TransResultStartFlag="<span class=\"op_dict_text2\">"; //翻译开始标签private final static String TransResultEndFlag="</span>"; //翻译结束标签public static String getTranslateResult(String urlString) throws Exception { //传入要搜索的单词URL url = new URL(PreUrl+urlString); //生成完整的URL// 打开URLHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();// 得到输入流,即获得了网页的内容BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));String preLine="";String line;int flag=1;// 读取输入流的数据,并显示String content=""; //翻译结果while ((line = reader.readLine()) != null) { //获取翻译结果的算法if(preLine.indexOf(TransResultStartFlag)!=-1&&line.indexOf(TransResultEndFlag)==-1){content+=line.replaceAll(" | ", "")+"\n"; //去电源代码上面的半角以及全角字符flag=0;}if(line.indexOf(TransResultEndFlag)!=-1){flag=1;}if(flag==1){preLine=line;}}return content;//返回翻译结果}}
再写一个窗体界面
注:有了上面的核心算法,下面的其实都随意实现了!
界面实现
我设计的窗体界面如下:
简单说一下界面布局:最上面一个JTextField
和JCheckBox
,下面是JTextArea
。
简单说一下各个控件的作用:
JTextField:显示待翻译的单词
JCheckBox:表示是从剪切板获取单词还是自己直接输入
JTextArea:显示翻译结果
实现思路
界面已经实现完成了,那么思路是什么呢?
我的思路是这样的:
- 开启一个线程,将JTextField里面的值不断设置为剪切板里面的值
- 如果JTextField里面的值改变了(剪切板的值改变了,也就是选中复制了新的单词),调用GetHtmlContentUtils 里面的方法获取翻译的结果,并显示!
对应代码如下:
package translate;import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;public class MainFrame extends JFrame implements Runnable {private JTextField srcContentTextField; // 记录剪切板的内容private JTextArea resContentTextField; // 记录翻译的内容private JCheckBox translateFlag; //标记单词的获取来源//选中:手动输入 未选中:剪切板获取private Container topContainer;public MainFrame() {//初始化控件srcContentTextField = new JTextField(10);resContentTextField = new JTextArea();translateFlag = new JCheckBox();topContainer = new Container();}public void setMinWindowLayout() {// TODO Auto-generated method stub//布局设置resContentTextField.setBorder(new LineBorder(new java.awt.Color(127, 157, 185), 1, false));this.setLayout(new BorderLayout());this.add(this.resContentTextField);translateFlag.setToolTipText("手动输入取词");topContainer.setLayout(new BorderLayout());topContainer.add(srcContentTextField, BorderLayout.CENTER);topContainer.add(translateFlag, BorderLayout.EAST);this.add(this.topContainer, BorderLayout.NORTH);this.setResizable(false);translateFlag.addActionListener(new ActionListener() {//设置JCheckBox的监听@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif (translateFlag.isSelected()) {translateFlag.setToolTipText("自动复制取词"); //设置提示} else {translateFlag.setToolTipText("手动输入取词");}}});//监听JTextField里面内容改变的事件srcContentTextField.getDocument().addDocumentListener(new DocumentListener() { @Overridepublic void changedUpdate(DocumentEvent arg0) {}@Overridepublic void insertUpdate(DocumentEvent arg0) { //内容改变try {//调用接口获取翻译结果String result = GetHtmlContentUtils.getTranslateResult(srcContentTextField.getText());if (result == "")result = "!Sorry,未找到该词!";resContentTextField.setText(result);//显示翻译结果} catch (Exception e) {// TODO Auto-generated catch blockresContentTextField.setText("!Sorry,未找到该词!");}}@Overridepublic void removeUpdate(DocumentEvent arg0) {}});this.validate();}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {if (!translateFlag.isSelected()) { //如果JCheckBox没有被选中,则从剪切板获取单词try {String content = ClipboradUtils.getClipboardText();srcContentTextField.setText(getSimpleWord(content));} catch (Exception e) { // TODO Auto-generated catch blocke.printStackTrace();}}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static String getSimpleWord(String content) {//去掉切板里面的一些特殊字符return content.replace(".", "").replace(",", "").replace("'", "").replace(":", "").replace(";", "").trim();}
}
接下来就是main函数了,代码如下:
package translate;import javax.swing.JFrame;public class TranslateTool {public static void main(String[] args) {MainFrame mainFrame = new MainFrame();mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mainFrame.setBounds(300, 200, 400, 300);mainFrame.setVisible(true);mainFrame.setAlwaysOnTop(true);//设置在最顶层mainFrame.setMinWindowLayout();Thread t = new Thread(mainFrame);t.start(); //开启线程}
}
程序运行结果
随手翻译了下 public 关键字,感觉还是可以的!
以下是2017/03/19日的补充
从eclipse导出jar包时候,发现显示的翻译乱码了。
找了半天的资料,有以下两种解决方案:
- 在控制台运行:
java -Dfile.encoding=utf-8 -jar
C:\Users\lenovo\Desktop\TranslateTool.jar(可执行jar的路径)
- 设置JAVA_TOOL_OPTIONS:
有关JAVA_TOOL_OPTIONS,参考:
http://docs.oracle.com/javase/6/docs/platform/jvmti/jvmti.html#tooloptions
现在就可以在系统环境变量中增加一个变量,变量名为:
JAVA_TOOL_OPTIONS, 变量值为:-Dfile.encoding=UTF-8
这样就基本可以解决乱码问题。如果你有好的解决方案,欢迎留言
软件下载地址:下载及时翻译工具
用Java做一个及时翻译工具相关推荐
- 自己动手做一个局域网聊天工具(一)
作者:朱金灿 来源:http://blog.csdn.net/clever101 现在部门使用的局域网聊天工具是飞秋,但是飞秋总是不够稳定,有时会掉线.这使我萌生一个念头:做一个局域网聊天工具. ...
- 一个文本翻译工具的实现
一.需求 一个文本翻译工具,功能类似于汇编器,能够把一些字符串(程序的助记符)翻译为其他的字符串或者数字,并打印到文本文件中.完成的功能如下: 1. 助记符翻译 2. 程序 ...
- 用Java做一个跳一跳辅助
用Java做一个跳一跳辅助 Java跳一跳辅助 首先..让大家看下效果: 由于是闲着没事写的.也懒得看OpenCV的API了. 要用到的工具如下: adb+jdk 把adb添加到环境变量里就行.很简单 ...
- 如何复制java卡,使用java做一个简单的集卡程序
使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...
- python实战扫码下载_实例:用 Python 做一个扫码工具
原标题:实例:用 Python 做一个扫码工具 来自公众号: 新建文件夹X 链接:https://blog.csdn.net/ZackSock/article/details/108610957Pyt ...
- python屏幕录制与回放_使用Python来做一个屏幕录制工具的操作代码
本文给大家分享使用Python来做一个屏幕录制工具,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方 ...
- java mysql点赞功能_用Java做一个类似于微博QQ空间点赞的功能-Fun言
点赞是一个互动性很强的功能,网站加入点赞可以增强用户之间的亲密度,可以利用点赞排出受欢迎文章或者其他的列表,所以今天教大家如何做一个类似于微博.QQ空间的点赞功能 需求分析: 首先要明确这个功能是需要 ...
- 脚本录制软件python 按键精灵 tc_使用Python来做一个屏幕录制工具的操作代码
一.写在前面 作为一名测试,有时候经常会遇到需要录屏记录自己操作,方便后续开发同学定位.以前都是用ScreenToGif来录屏制作成动态图,偶尔的机会看到python也能实现.那就赶紧学习下. 二.效 ...
- 用Python做一个安全攻防工具:端口嗅探器(9)
传送门 本系列原创博文传送门: 用Python做一个安全攻防工具:端口嗅探器(1) 用Python做一个安全攻防工具:端口嗅探器(2) 用Python做一个安全攻防工具:端口嗅探器(3) 用Pytho ...
- 简单用java做一个图书管理系统
简单用java做一个图书管理系统 首先,我们创建一个View类当做它的视图页 package view;import service.BookService; import service.UserS ...
最新文章
- python 把2个列表或者2个元组转成字典
- Python的零基础超详细讲解(第四天)-Python的数据类型
- HTML5 Web SQL数据库
- 一个MIT计算机博士对数学的思考
- Python_Mix*OS模块,序列化模块种的json,pickle
- 前端学习(2229):react条件渲染实现登录
- virtualbox 启动时报Kernel driver not installed (rc=-1908) 的错误
- linux 怎么改系统字体,Linux下如何设置中文字体
- mysql修改表字段小数点精度,mysql – 如何配置Rails以在表单字段中以正确的精度输出小数?...
- UnityShader25:在Unity中实现泛光
- 3D MAX 倾斜物体对齐问题和坐标轴重置问题
- 构建简单的智能客服系统(三)——基于 UniMRCP 实现讯飞 TTS MRCP Server
- 虚拟机网络连接失败解决方案
- erp系统的开发工具
- linux 电驴,开源电驴 MLDonkey 3.0.7 发布
- 个税汇算期,公司收到好多申诉,怎么办?
- linux getfattr中文乱码,Linux下快速解析nf_conntrack
- r5 5600u和r5 5600H参数对比哪个好?
- AcWing 666. 三角形类型
- 淘宝商品详情查询V1新版接口