自制Java工具實現(xiàn)翻譯鼠標選中文本
前言
本功能的實現(xiàn)基于這篇筆記java實現(xiàn)全局監(jiān)聽鍵盤,本文閱讀過程中有疑惑都可以查看此筆記
實現(xiàn)思路:檢測到按壓ctrl +c +c 后,獲取當前剪切板文字,調用百度翻譯api。
實現(xiàn)結果:
完整代碼在最后
實現(xiàn)過程
1 監(jiān)控ctrl +c +c
在當前demo的功能中我們可以看到,當按壓鍵盤時會調用nativeKeyPressed
方法,并會打印當前按下的按鈕字符串。
我們去掉一些打印的干擾:去除release和type的打印,以及press打印的前綴
此時就只會打印我們的按鍵
現(xiàn)在去實現(xiàn):當連續(xù)按壓ctrl+c+c時,打印"你按下了ctrl+c+c哦" 思路:初始設置一個key字符串為"",當檢測到按壓ctrl時,設置key為"Ctrl",當不是Ctrl時,key拼接本次按壓的按鍵,然后和"CtrlCC"做比較。如果相同,則說明用戶連續(xù)按壓了ctrl+c+c; 代碼實現(xiàn)(紅框內為添加的代碼):
效果:
2 獲取剪切板內容
在我們進行ctrl+c+c的操作過程中,第一個ctrl+c就會將鼠標選擇的內容放到剪切板里,此時我們獲取剪切板的內容,之后再用這個內容調用翻譯api即可。 創(chuàng)建一個剪切板工具類
/** * 剪切板工具類 */ public class ClipBoardUtil { public static String getClipboardText() { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //從系統(tǒng)剪切板中獲取數(shù)據(jù) Transferable content = clipboard.getContents(null); //判斷是否為文本類型 if (content.isDataFlavorSupported(DataFlavor.stringFlavor)) { //從數(shù)據(jù)中獲取文本值 String text = null; try { text = (String) content.getTransferData(DataFlavor.stringFlavor); } catch (Exception e) { } if (text == null) { return "剪切板為空"; } return text; } return "剪切板無文本值"; } }
在代碼中調用:
效果:
3 調用百度翻譯api
注冊賬號,開通服務
搜索百度翻譯開放平臺,注冊賬號,實名認證后,可以申請高級版用戶 標準版:注冊,未實名 高級版:注冊,實名 尊享版:企業(yè)認證
高級版每個月有100萬字符的免費調用量,對于個人使用的話綽綽有余了。 注冊后,在管理控制臺中開通文本翻譯服務
詳細見文檔:
根據(jù)文檔,編寫代碼
其中appid和密鑰,在我們的管理控制臺中
以下是調用方法的代碼實現(xiàn),我們創(chuàng)建一個TransApi
類
import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.http.HttpUtil; import java.util.HashMap; import java.util.Map; public class TransApi { private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate"; private String appid; private String securityKey; /** * 有參構造 * @param appid appid * @param securityKey 密鑰 */ public TransApi(String appid, String securityKey) { this.appid = appid; this.securityKey = securityKey; } /** * 調用方法 * @param query 翻譯內容 * @param from 來源語言 * @param to 翻譯語言 * @return 返回參數(shù) */ public String getTransResult(String query, String from, String to) { Map<String, Object> params = this.buildParams(query, from, to); return HttpUtil.get("http://api.fanyi.baidu.com/api/trans/vip/translate", params); } /** * 初始化參數(shù) * @param query 翻譯內容 * @param from 來源語言 * @param to 翻譯語言 * @return */ private Map<String, Object> buildParams(String query, String from, String to) { Map<String, Object> params = new HashMap(); params.put("q", query); params.put("from", from); params.put("to", to); params.put("appid", this.appid); String salt = String.valueOf(System.currentTimeMillis()); params.put("salt", salt); String src = this.appid + query + salt + this.securityKey; //MD5加密 params.put("sign", DigestUtil.md5Hex(src)); return params; } }
其中調用接口的HttpUtil
和加密的DigestUtil
使用的是hutool
中的類 hutool包的地址:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.24</version> </dependency>
ctrl+c+c獲取剪切板內容并調用翻譯接口
在GlobalKeyListenerExample
類中添加TransApi類的初始化:
在獲取剪切板內容后,將剪切板的內容調用翻譯接口,并處理返回數(shù)據(jù)
運行效果
我們看到這里,已經初步完成了ctrl+c+c進行翻譯的功能,剩下的就是進行一些小優(yōu)化,如生成窗口展示數(shù)據(jù)
4 小窗口展示剪切板內容和翻譯內容
因為筆者對java的gui窗口不是很了解,這里使用chatgpt工具生成了小窗口,可能有些簡陋,讀者可以自己美化一下 新建一個MyWindows
類
import javax.swing.*; import java.awt.*; public class MyWindow extends JFrame { private JTextArea textArea; public MyWindow() { setTitle("Text Window"); 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(true); add(textArea, "Center"); add(panel, "South"); } //寫入文本 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); } }
在GlobalKeyListenerExample
類中初始化MyWindow:
在獲取翻譯后,清除原來的文字,寫入新的文字:
運行:
完整代碼
ClipBoardUtil
類,TransApi
類,MyWindow
類上文已給出完整代碼。 GlobalKeyListenerExample
類:
import cn.hutool.core.text.UnicodeUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.github.kwhat.jnativehook.GlobalScreen; import com.github.kwhat.jnativehook.NativeHookException; import com.github.kwhat.jnativehook.keyboard.NativeKeyEvent; import com.github.kwhat.jnativehook.keyboard.NativeKeyListener; import com.icepeach.Utils.ClipBoardUtil; import com.icepeach.Utils.GUI.MyWindow; public class GlobalKeyListenerExample implements NativeKeyListener { String key = ""; private static final String APP_ID = "你的appid"; private static final String SECURITY_KEY = "你的密鑰"; TransApi api = new TransApi(APP_ID, SECURITY_KEY); MyWindow window = new MyWindow(); public void nativeKeyPressed(NativeKeyEvent e) { if ("Ctrl".equals(NativeKeyEvent.getKeyText(e.getKeyCode()))) { key = new String("Ctrl"); } else { key += NativeKeyEvent.getKeyText(e.getKeyCode()); } if ("CtrlCC".equals(key)) { window.setVisible(true); //打印剪切板內容 System.out.println("剪切板內容為:" + ClipBoardUtil.getClipboardText()); //調用翻譯接口 String jsonStr = api.getTransResult(ClipBoardUtil.getClipboardText(), "auto", "zh"); // 解析JSON字符串 JSONObject jsonObject = JSONUtil.parseObj(jsonStr); // 獲取trans_result數(shù)組中的第一個元素 JSONObject transResult = jsonObject.getJSONArray("trans_result").getJSONObject(0); // 獲取dst中的內容并轉換成中文 String dst = transResult.getStr("dst"); String chineseDst = UnicodeUtil.toString(dst); System.out.println("翻譯:"+chineseDst); window.clearText(); window.writeText("剪切板內容為:" + ClipBoardUtil.getClipboardText()); window.writeText("翻譯:"+chineseDst); } if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) { try { GlobalScreen.unregisterNativeHook(); } catch (NativeHookException nativeHookException) { nativeHookException.printStackTrace(); } } } public void nativeKeyReleased(NativeKeyEvent e) { // System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode())); } public void nativeKeyTyped(NativeKeyEvent e) { // System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode())); } public static void main(String[] args) { try { GlobalScreen.registerNativeHook(); } catch (NativeHookException ex) { System.err.println("There was a problem registering the native hook."); System.err.println(ex.getMessage()); System.exit(1); } GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample()); } }
到此這篇關于自制Java工具實現(xiàn)翻譯鼠標選中文本的文章就介紹到這了,更多相關Java翻譯文本內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring?Data?JPA實現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼
Spring Data JPA是Spring基于JPA規(guī)范的基礎上封裝的?套 JPA 應?框架,可使開發(fā)者?極簡的代碼即可實現(xiàn)對數(shù)據(jù)庫的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實現(xiàn)數(shù)據(jù)持久化存儲到數(shù)據(jù)庫,感興趣的可以了解一下2022-04-04Spring Boot jar可執(zhí)行原理的徹底分析
這篇文章主要給大家介紹了關于Spring Boot jar可執(zhí)行原理的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected
這篇文章主要介紹了解決Eclipse配置Tomcat出現(xiàn)Cannot create a server using the selected type錯誤的相關資料,需要的朋友可以參考下2017-02-02- String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨占的,是可變的(因為每次都是創(chuàng)建新的對象?。?/div> 2015-11-11
最新評論