日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我手撸了一个划线翻译工具!

發(fā)布時間:2025/3/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我手撸了一个划线翻译工具! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來源 :https://yuanlehome.github.io/20200612/

這里將要介紹的是一種在 Linux 平臺實現(xiàn)的劃詞翻譯工具,當然在考慮自己實現(xiàn)一個如此功能的工具前,本人也是在網(wǎng)上搜索了一些在 Linux 平臺實現(xiàn)的類似的開源工具,例如 pdfTranslator,popup-dict,但它們的安裝和配置都顯得比較麻煩,而且使用起來也并不方便。

本人實現(xiàn)這個工具的初衷本是方便自己看一些英文文獻和書籍的,極為方便,考慮到分享出去可以讓更多人受惠,因此這里詳細介紹一下它的實現(xiàn)步驟。

本文所實現(xiàn)的劃詞翻譯工具主要有以下特性:

  • 支持英文單詞和短語到中文的翻譯

  • 劃詞翻譯,終端顯示

  • 自動過濾選中文本中的換行等特殊字符

  • 只依賴少數(shù)幾個 Linux 命令工具

下面有動圖進行演示。

本人所使用的環(huán)境是運行在 VMware 虛擬機下的 Linux 發(fā)行版 Ubuntu 18.04.3 LTS,因此這里介紹的步驟可能與其他 Linux 發(fā)行版中的實現(xiàn)略有不同。下面就來一步一步的實現(xiàn)它吧。

一. 安裝必要的命令

  • xclip

  • $?sudo?apt?install?xclip

    xclip 命令建立了終端和剪切板之間通道,可以用命令的方式將終端輸出或文件的內(nèi)容保存到剪切板中,也可以將剪切板的內(nèi)容輸出到終端或文件。詳細的用法可以使用 man xclip,見其手冊。這里介紹幾個常用的用法。

    $?xclip?file_name?#?文件內(nèi)容保存到X?window剪切板 $?xclip?-selection?c?file_name?#文件內(nèi)容保存到外部剪切板 $?xclip?-o?#?X?window剪切板內(nèi)容輸出到終端顯示 $?xclip?-selection?c?-o?#?外部剪切板內(nèi)容輸出到終端顯示

    值得強調(diào)的是,這里所說的 X window 剪切板,簡單的說就是你用鼠標選擇的文本會實時的存放在這個剪切板,使用鼠標中鍵可以粘貼。而外部剪切板是保存你用 ctrl+c 復制的文本,ctrl+v 可以粘貼。這兩個地方是不一樣的。

  • translate-shell

  • $?sudo?apt?install?translate-shell

    這是命令行版的谷歌翻譯工具,之前叫做 Google Translate CLI 是一款借助谷歌翻譯(默認)、必應翻譯等來翻譯的命令行翻譯器。它讓你可以在終端訪問這些翻譯引擎。translate-shell 在大多數(shù) Linux 發(fā)行版中都能使用。常用的方法如下:

    $?trans?en:zh?[word]?#?英文到中文的單詞翻譯 $?trans?en:zh?-b?[text]?#?簡要的輸出,進行文本翻譯

    需要注意的是,使用這個翻譯工具需要你能夠訪問外網(wǎng),或者通過修改 translate-shell 的默認翻譯引擎,具體的方法這里就不闡述了。

    二. 編程實現(xiàn)

    這個工具整體的思路就是 C 程序?qū)崟r檢測鼠標按鍵的動態(tài),當檢測到用戶使用鼠標選擇一段文本之后,調(diào)用 shell 腳本獲取 X window 剪切板的內(nèi)容進行翻譯后輸出到終端顯示。

    1. 定位鼠標設(shè)備文件

    鼠標作為輸入設(shè)備。其信息可以在文件 /proc/bus/input/devices 中,使用下列命令查看:

    $?sudo?cat?/proc/bus/input/devices I:?Bus=0011?Vendor=0002?Product=0013?Version=0006 N:?Name="VirtualPS/2?VMware?VMMouse" P:?Phys=isa0060/serio1/input1 S:?Sysfs=/devices/platform/i8042/serio1/input/input4 U:?Uniq= H:?Handlers=mouse0?event2? B:?PROP=0 B:?EV=b B:?KEY=70000?0?0?0?0 B:?ABS=3

    其中的 Handlers 的值 event2 表示可以在 /dev/input/event2 文件下讀取鼠標的狀態(tài)。需要注意的是,對于不同的設(shè)備,讀取鼠標的狀態(tài)的文件可能不一樣,比如也可能是 /dev/input/event3 。我們可以使用下面的命令找到你的鼠標對應的是哪一個 event。

    $?sudo?cat?/dev/input/event2?|?hexdump?#?測試時改變數(shù)字即可

    比如,當我運行上面這條命令之后,我移動鼠標、按鼠標左鍵/中鍵/右鍵,終端都會輸出一些值,這就說明 event2 文件就是對應著我的鼠標。如果操作鼠標沒有反應,說明這個就不是。你可以通過這種方法找到你的鼠標對應的 event 文件。

    2. Linux 下獲取按鍵響應

    在 Linux 內(nèi)核中,input 設(shè)備用 input_dev 結(jié)構(gòu)體描述,使用 input 子系統(tǒng)實現(xiàn)輸入設(shè)備驅(qū)動的時候,驅(qū)動的核心工作就是向系統(tǒng)報告按鍵、觸摸屏、鍵盤、鼠標等輸入事件(event,通過 input_event 結(jié)構(gòu)體描述),不再需要關(guān)心文件操作接口,因為 input 子系統(tǒng)已經(jīng)完成了文件操作接口 Linux/input.h 這個文件定義了 event 事件的結(jié)構(gòu)體,API 和標準按鍵的編碼等。

    //?結(jié)構(gòu)體定義見?input.h struct?input_event {struct?timeval?time;?//?按鍵時間__u16?type;??????????//?事件類型__u16?code;??????????//?要模擬成什么按鍵__s32?value;?????????//?是按下還是釋放 };//?下面宏定義見?input-event-coses.h //?type #define?EV_KEY?0x01 #define?EV_REL?0x02 #define?EV_ABS?0x03 //?...//?code #define?BTN_LEFT?0x110 #define?BTN_RIGHT?0x111 #define?BTN_MIDDLE?0x112 //?...//?value #define?MSC_SERIAL?0x00 #define?MSC_PULSELED?0x01 //?...

    這里稍微介紹一下 type,指事件類型,常見的事件類型有:EV_KEY,按鍵事件,如鍵盤的按鍵(按下哪個鍵),鼠標的左鍵右鍵(是否擊下)等;EV_REL,相對坐標,主要是指鼠標的移動事件(相對位移);EV_ABS, 絕對坐標,主要指觸摸屏的移動事件 。

    3. 編寫 C 程序

    下面就可以編寫程序來檢測鼠標的動態(tài)了。首先在你的用戶~目錄下建立文件夾 Translator。在 Translator 里建立一個 ct.c 源文件,代碼如下:

    #include?<stdio.h> #include?<stdlib.h> #include?<unistd.h> #include?<linux/input.h> #include?<fcntl.h>int?main(void) {int?keys_fd;struct?input_event?t;//?注意這里打開的文件根據(jù)你自己的設(shè)備情況作相應的改變keys_fd?=?open("/dev/input/event2",?O_RDONLY);if?(keys_fd?<=?0){printf("open?/dev/input/event2?error!\n");return?-1;}while?(1){read(keys_fd,?&t,?sizeof(t));if?(t.type?==?EV_KEY)??????????????//?有鍵按下if?(t.code?==?BTN_LEFT)????????//?鼠標左鍵if?(t.value?==?MSC_SERIAL)?//?松開//?調(diào)用外部shell腳本system("~/Translator/goTranslate.sh");}close(keys_fd);return?0; }

    然后就是調(diào)用 gcc 編譯器生成可執(zhí)行文件 ct :

    $?gcc?ct.c?-o?ct

    4. 編寫 shell 腳本翻譯剪切板內(nèi)容

    在 Translator 里建立 goTranslate.sh 文件,內(nèi)容如下:

    #!/bin/bashstr_old=$(cat?~/Translator/lastContent) str_new=$(xclip?-o?2>/dev/null?|?xargs) if?[[?"$str_new"?!=?"$str_old"?&&?$str_new?]];?thenecho?-e?"\n"count=$(echo?"$str_new"?|?wc?-w)if?[?"$count"?==?"1"?];?thenecho?-n?-e?"$str_new?"?>>~/Translator/wordsecho?"$str_new"?|?trans?:zh-CN?|?tail?-1?|?cut?-c?5-?|?sed?"s,\x1b\[[0-9;]*[a-zA-Z],,g"?|?tee?-a?~/Translator/wordselseecho?"$str_new"?|?trans?:zh-CN?-bfiecho?"$str_new"?>~/Translator/lastContent fi

    原理非常簡單,讀者自行了解。這里我們還要在 Translator 里建立一個 lastContent.txt 文件作為緩存,目的是本次調(diào)用腳本時能夠獲取上一次調(diào)用時翻譯的文本內(nèi)容,如果和本次調(diào)用的翻譯文本一樣,則本次就不進行翻譯。

  • 設(shè)置 ct 別名

  • 這里已經(jīng)可以通過下面的命令運行程序了:

    $?sudo?~/Translator/ct

    但是由于每次運行都要輸出這么長的命令,因此我們在 ~/.bashrc 文件中加入下面一條命令。

    alias?ct='sudo?~/Translator/ct'

    這樣,以后每次看英文文獻時就可以在命令行下輸入:

    $?ct

    三. 結(jié)束語

    這里有一些小技巧。可以更方便的使用這個工具。比如,把終端設(shè)為置頂并縮小到合適的尺寸,這樣在閱讀文獻劃詞翻譯時終端屏幕不會遮擋我們的視線。

    值得說明的是,由于本人完全是為了方便自己的使用,而且在搞出這么個工具時僅僅接觸 Linux 系統(tǒng)才不到兩周,所以里面的實現(xiàn)對于有經(jīng)驗的朋友來說略顯的有些笨拙了,請理解哈。

    有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

    歡迎大家關(guān)注Java之道公眾號

    好文章,我在看??

    總結(jié)

    以上是生活随笔為你收集整理的我手撸了一个划线翻译工具!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。