Java实现快捷翻译
大约 8 分钟
百度翻译API
申请API权限
- 申请API权限 百度翻译API页 https://api.fanyi.baidu.com/api/trans/product/index
- 拿到APPID和密钥 这里申请的时候只需提交应用名称和应用介绍即可
img - 官网提供了文档和各种编程语言的DEMO https://api.fanyi.baidu.com/doc/21
- 示例代码Java https://fanyiapp.cdn.bcebos.com/api/demo/java.zip
demo测验
代码结构如图所示
我们需要在BaiduMain.java完成APP_ID和SECURITY_KEY的填写,建议在使用时先阅览一遍官网文档
// 关键代码
// 在平台申请的APP_ID 详见
// http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer
private static final String APP_ID = "你的ID";
private static final String SECURITY_KEY = "你的KEY";
public static void main(String[] args) {
TransApi api = new TransApi(APP_ID, SECURITY_KEY);
String query = "翻译";
// 这里auto 是自动选择翻译的源语言和输出语言
String transResult = api.getTransResult(query, "auto", "auto");
// unicodeDecode是自定义方法 作用是将unicode编码转换为汉字
System.out.println(unicodeDecode(transResult));
}
/**
* @Title: unicodeDecode
* @Description: unicode解码
* @param str
* @return str
*/
public static String unicodeDecode(String string) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(string);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
string = string.replace(matcher.group(1), ch + "");
}
return string;
}
翻译文本框实现
快捷键快速呼出翻译文本框,读取粘贴板内容翻译,查阅翻译后关闭隐藏
注册快捷键到全局热键
//关键代码
private void initWindow() {
// 主类是Provider,获取当前平台(操作系统)的提供者
// Provider provider = Provider.getCurrentProvider(useSwingEventQueue);
Provider provider = Provider.getCurrentProvider(true);
//用于翻译窗口展示
private MyWindow window = new MyWindow();
// 查单词
provider.register(KeyStroke.getKeyStroke("control alt Q"), new HotKeyListener() {
@Override
public void onHotKey(HotKey arg0) {
try {
Thread.sleep(200); // 参数为毫秒,所以需要将0.3转换成对应的毫秒值
} catch (InterruptedException e) {
e.printStackTrace();
}
String paste = getPaste();
String trans = BaiduMain.getTrans(paste);
Point p = MouseInfo.getPointerInfo().getLocation();
window.setLocation((int) p.getX(), (int) p.getY());
window.setVisible(true);
window.clearText();
// window.writeText(paste);
window.writeText(trans);
}
});
}
获取粘贴板的数据
//模拟按下抬起ctrl+c实现复制光标选中的数据到剪切板,并回传
public String getPaste() {
Robot robot;
try {
robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL); // 按下ctrl键盘
robot.keyPress(KeyEvent.VK_C); // 按下ctrl键盘
robot.delay(50);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_C);
robot.delay(100);
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Paste.getSysClipboardText().trim();
}
实现翻译
//其中unicodeDecode在上文已给出作用
public static String getTrans(String query) {
TransApi api = new TransApi(APP_ID, SECURITY_KEY);
String transResult = api.getTransResult(query, "auto", "auto");
return unicodeDecode(transResult);
}
窗口展示数据
public class MyWindow extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea textArea;
public MyWindow() {
setTitle("翻译窗口");
setSize(400, 300);
// setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea = new JTextArea();
// 设置字体大小
textArea.setFont(new Font("SimSun", Font.PLAIN, 16));
// 自动换行
textArea.setLineWrap(true);
// 断行不断字
textArea.setWrapStyleWord(true);
JPanel panel = new JPanel();
// 默认隐藏
setVisible(false);
add(textArea, "Center");
add(panel, "South");
// 设置窗口关闭按钮行为为隐藏窗口
setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) { // 窗口关闭时执行自定义的操作(可选) // ... // 隐藏窗口
setVisible(false);
}
});
}
// 写入文本
public void writeText(String text) {
textArea.append(text + "\n");
}
// 清除文本
public void clearText() {
textArea.setText("");
}
public static void main(String[] args) {
MyWindow window = new MyWindow();
window.setVisible(true);
}
}
效果
鼠标选择好需要翻译的文本后按下ctrl + alt + Q,即可在鼠标位置弹出翻译窗口,关闭即走
支持windows/linux/mac
参考
百度翻译API教程 https://blog.csdn.net/IT__LiangChen/article/details/125714847
开发-示例集合-Java-系统快捷键
开发-示例集合-Java-系统粘贴板
TODO
可以进一步优化展示窗口,比如失去焦点直接关闭,比如格式化返回的JSON