千家信息网

Linux平台如何实现划词翻译工具

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章将为大家详细讲解有关Linux平台如何实现划词翻译工具,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。所实现的划词翻译工具主要有以下特性:支持英文单词和短语到
千家信息网最后更新 2025年02月23日Linux平台如何实现划词翻译工具

这篇文章将为大家详细讲解有关Linux平台如何实现划词翻译工具,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

所实现的划词翻译工具主要有以下特性:

  • 支持英文单词和短语到中文的翻译

  • 划词翻译,终端显示

  • 自动过滤选中文本中的换行等特殊字符

  • 只依赖少数几个 Linux 命令工具

下面有动图进行演示。

本人所使用的环境是运行在 VMware 虚拟机下的 Linux 发行版 Ubuntu 18.04.3 LTS,因此这里介绍的步骤可能与其他 Linux 发行版中的实现略有不同。下面就来一步一步的实现它吧。

一. 安装必要的命令

1.xclip

$ sudo apt install xclip

xclip 命令建立了终端和剪切板之间通道,可以用命令的方式将终端输出或文件的内容保存到剪切板中,也可以将剪切板的内容输出到终端或文件。详细的用法可以使用 man xclip,见其手册。这里介绍几个常用的用法。

$ xclip file_name # 文件内容保存到X window剪切板 $ xclip -selection c file_name #文件内容保存到外部剪切板 $ xclip -o # X window剪切板内容输出到终端显示 $ xclip -selection c -o # 外部剪切板内容输出到终端显示

值得强调的是,这里所说的 X window 剪切板,简单的说就是你用鼠标选择的文本会实时的存放在这个剪切板,使用鼠标中键可以粘贴。而外部剪切板是保存你用 ctrl+c 复制的文本,ctrl+v 可以粘贴。这两个地方是不一样的。

2.translate-shell

$ sudo apt install translate-shell

这是命令行版的谷歌翻译工具,之前叫做 Google Translate CLI 是一款借助谷歌翻译(默认)、必应翻译等来翻译的命令行翻译器。它让你可以在终端访问这些翻译引擎。translate-shell 在大多数 Linux 发行版中都能使用。常用的方法如下:

$ trans en:zh [word] # 英文到中文的单词翻译 $ trans en:zh -b [text] # 简要的输出,进行文本翻译

需要注意的是,使用这个翻译工具需要你能够访问外网,或者通过修改 translate-shell 的默认翻译引擎,具体的方法这里就不阐述了。

二. 编程实现

这个工具整体的思路就是 C 程序实时检测鼠标按键的动态,当检测到用户使用鼠标选择一段文本之后,调用 shell 脚本获取 X window 剪切板的内容进行翻译后输出到终端显示。

1. 定位鼠标设备文件

鼠标作为输入设备。其信息可以在文件 /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 文件下读取鼠标的状态。需要注意的是,对于不同的设备,读取鼠标的状态的文件可能不一样,比如也可能是 /dev/input/event3 。我们可以使用下面的命令找到你的鼠标对应的是哪一个 event。

$ sudo cat /dev/input/event2 | hexdump # 测试时改变数字即可

比如,当我运行上面这条命令之后,我移动鼠标、按鼠标左键/中键/右键,终端都会输出一些值,这就说明 event2 文件就是对应着我的鼠标。如果操作鼠标没有反应,说明这个就不是。你可以通过这种方法找到你的鼠标对应的 event 文件。

2. Linux 下获取按键响应

在 Linux 内核中,input 设备用 input_dev 结构体描述,使用 input 子系统实现输入设备驱动的时候,驱动的核心工作就是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过 input_event 结构体描述),不再需要关心文件操作接口,因为 input 子系统已经完成了文件操作接口 Linux/input.h 这个文件定义了 event 事件的结构体,API 和标准按键的编码等。

// 结构体定义见 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 程序

下面就可以编写程序来检测鼠标的动态了。首先在你的用户~目录下建立文件夹 Translator。在 Translator 里建立一个 ct.c 源文件,代码如下:

#include  #include  #include  #include  #include   int main(void) {     int keys_fd;     struct input_event t;      // 注意这里打开的文件根据你自己的设备情况作相应的改变     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) // 松开                     // 调用外部shell脚本                     system("~/Translator/goTranslate.sh");     }     close(keys_fd);     return 0; }

然后就是调用 gcc 编译器生成可执行文件 ct :

$ gcc ct.c -o ct

4. 编写 shell 脚本翻译剪切板内容

在 Translator 里建立 goTranslate.sh 文件,内容如下:

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

原理非常简单,读者自行了解。这里我们还要在 Translator 里建立一个 lastContent.txt 文件作为缓存,目的是本次调用脚本时能够获取上一次调用时翻译的文本内容,如果和本次调用的翻译文本一样,则本次就不进行翻译。

设置 ct 别名

这里已经可以通过下面的命令运行程序了:

$ sudo ~/Translator/ct

但是由于每次运行都要输出这么长的命令,因此我们在 ~/.bashrc 文件中加入下面一条命令。

alias ct='sudo ~/Translator/ct'

这样,以后每次看英文文献时就可以在命令行下输入:

$ ct

关于"Linux平台如何实现划词翻译工具"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

文件 鼠标 命令 剪切 内容 终端 事件 按键 输出 工具 文本 设备 就是 程序 结构 脚本 输入 运行 方法 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全培养计划 企业 如何维护网络安全和预防网络风险 苏州程序软件开发哪家可靠 港口航运管理与网络技术哪个好 青浦区工业网络技术采购信息 组装一台服务器该怎么配置 全自动数据库维护服务 应用技术和网络技术那个号 蓝谷网络技术有限公司长沙 易语言数据库怎么读写图片 江西智慧社区软件开发系统 数据库查找最高单价 xp 逻辑磁盘管理服务器 软件开发工程师证有什么用处 嘉定区进口网络技术开发行业标准 数据库大明 怎么注册人民日报图文数据库 数据库图书和读者的关系 嵊州天气预报软件开发 国家医保数据库动态维护数据 中国顶级网络安全公司有多少人 东营网络安全视频 利用农牧民夜校网络安全 服务器租赁挣钱么 韶关卫星软件开发代理价格 爬取wifi万能钥匙数据库 嘉定区品牌人工智能应用软件开发 手机要如何开我的世界服务器 感应软件开发 YOUCAM摄像头软件开发
0