这里将要介绍的是一种在Linux
平台实现的划词翻译工具,当然在考虑自己实现一个如此功能的工具前,我也是在网上搜索了一些在Linux
平台实现的类似的开源工具,例如 pdfTranslator,popup-dict,但它们的安装和配置都显得比较麻烦,而且使用起来也并不方便。
我实现这个工具的初衷本是方便自己看一些英文文献和书籍的,极为方便,考虑到分享出去可以让更多人受惠,因此这里详细介绍一下它的实现步骤。
本文所实现的划词翻译工具主要有以下特性:
- 支持英文单词和短语到中文的翻译
- 划词翻译,终端显示
- 自动过滤选中文本中的换行等特殊字符
- 只依赖少数几个
Linux
命令工具
下面有动图进行演示。
本人所使用的环境是运行在VMware
虚拟机下的Linux
发行版 Ubuntu 18.04.3 LTS ,因此这里介绍的步骤可能与其他Linux
发行版中的实现略有不同。下面就来一步一步的实现它吧。
一. 安装必要的命令
xclip
1 | sudo apt install xclip |
xclip
命令建立了终端和剪切板之间通道,可以用命令的方式将终端输出或文件的内容保存到剪切板中,也可以将剪切板的内容输出到终端或文件。详细的用法可以使用man xclip
,见其手册。这里介绍几个常用的用法。
1 | xclip file_name # 文件内容保存到X window剪切板 |
值得强调的是,这里所说的X window
剪切板,简单的说就是你用鼠标选择的文本会实时的存放在这个剪切板,使用鼠标中键可以粘贴。而外部剪切板是保存你用ctrl+c
复制的文本,ctrl+v
可以粘贴。这两个地方是不一样的。
translate-shell
1 | sudo apt install translate-shell |
这是命令行版的谷歌翻译工具,之前叫做Google Translate CLI
是一款借助谷歌翻译(默认)、必应翻译等来翻译的命令行翻译器。它让你可以在终端访问这些翻译引擎。translate-shell
在大多数Linux
发行版中都能使用。常用的方法如下:
1 | trans en:zh [word] # 英文到中文的单词翻译 |
需要注意的是,使用这个翻译工具需要你能够访问外网,或者通过修改translate-shell
的默认翻译引擎,具体的方法这里就不阐述了。
二. 编程实现
这个工具整体的思路就是C
程序实时检测鼠标按键的动态,当检测到用户使用鼠标选择一段文本之后,调用shell
脚本获取X window
剪切板的内容进行翻译后输出到终端显示。
1. 定位鼠标设备文件
鼠标作为输入设备。其信息可以在文件/proc/bus/input/devices
中,使用下列命令查看:
1 | sudo cat /proc/bus/input/devices |
其中的Handlers
的值event2
表示可以在/dev/input/event2
文件下读取鼠标的状态。需要注意的是,对于不同的设备,读取鼠标的状态的文件可能不一样,比如也可能是/dev/input/event3
。我们可以使用下面的命令找到你的鼠标对应的是哪一个event
。
1 | sudo cat /dev/input/event2 | hexdump # 测试时改变数字即可 |
比如,当我运行上面这条命令之后,我移动鼠标、按鼠标左键/中键/右键,终端都会输出一些值,这就说明event2
文件就是对应着我的鼠标。如果操作鼠标没有反应,说明这个就不是。你可以通过这种方法找到你的鼠标对应的event
文件。
2. Linux
下获取按键响应
在Linux
内核中,input
设备用input_dev
结构体描述,使用input
子系统实现输入设备驱动的时候,驱动的核心工作就是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event
,通过input_event
结构体描述),不再需要关心文件操作接口,因为input
子系统已经完成了文件操作接口Linux/input.h
这个文件定义了event
事件的结构体,API
和标准按键的编码等。
1 | // 结构体定义见 input.h |
这里稍微介绍一下type
,指事件类型,常见的事件类型有:EV_KEY
,按键事件,如键盘的按键(按下哪个键),鼠标的左键右键(是否击下)等;EV_REL
,相对坐标,主要是指鼠标的移动事件(相对位移);EV_ABS
, 绝对坐标,主要指触摸屏的移动事件 。
3. 编写C
程序
下面就可以编写程序来检测鼠标的动态了。首先在你的用户~
目录下建立文件夹Translator
。在 Translator
里建立一个ct.c
源文件,代码如下:
1 |
|
然后就是调用gcc
编译器生成可执行文件ct
:
1 | gcc ct.c -o ct |
4. 编写shell
脚本翻译剪切板内容
在Translator
里建立goTranslate.sh
文件,内容如下:
1 | !/bin/bash |
原理非常简单,读者自行了解。这里我们还要在Translator里建立一个lastContent.txt
文件作为缓存,目的是本次调用脚本时能够获取上一次调用时翻译的文本内容,如果和本次调用的翻译文本一样,则本次就不进行翻译。
5. 设置ct
别名
这里已经可以通过下面的命令运行程序了:
1 | sudo ~/Translator/ct |
但是由于每次运行都要输出这么长的命令,因此我们在~/.bashrc
文件中加入下面一条命令。
1 | alias ct='sudo ~/Translator/ct' |
这样,以后每次看英文文献时就可以在命令行下输入:
1 | ct |
三. 结束语
这里有一些小技巧。可以更方便的使用这个工具。比如,把终端设为置顶并缩小到合适的尺寸,这样在阅读文献划词翻译时终端屏幕不会遮挡我们的视线。
值得说明的是,由于本人完全是为了方便自己的使用,而且在搞出这么个工具时仅仅接触Linux
系统编程才不到两周,所以里面的实现对于有经验的朋友来说略显的有些笨拙了,请理解哈。
个人觉得这个工具使用起来还是很方便的,你觉得呢?
参考文章: