article_image

macOS 原生查词功能(Look up)备受好评,选中一个生词,按一下快捷键或者重按触控板,便能就地弹出一个小弹窗,占地不大、查完就关,不打断阅读。可惜查词功能只能对付单词,一个长句,或者一个词组,就能让原生查词功能歇菜——毕竟它只是依赖本地词典的查词工具,而非万能的翻译工具。

Alt text
原生查词虽方便,却不能对付句子或词组

工作需要,我本人也苦于外文资料久矣,遇到长句和一些词组搭配,往往需要在翻译网页和阅读材料之间反复辗转,操作步骤多且不谈,最难受的当属这种界面切换会频频打断阅读。

本文介绍一套基于 Keyboard Maestro 的查词翻译一体化解决方案,它继承了 macOS 原生查词功能,可以自动检测当前选中的是单词还是句子、词组,并在遇到后两者时主动呈现翻译页面的浮动窗口,兼具查词、翻译两种功能,并保持显示效果的干净简洁。

Alt text
根据所选内容不同,自动查词或翻译

动作使用

整个查词翻译动作由 Keyboard Maestro 和 Automator 两部分组成,前者负责交互和逻辑判断,后者主司翻译,需下载并安装两部分自动化动作。

>>Keyboard Maestro 和 Automator 动作下载<<

用前注意三点:

  1. 请检查 Keyboard Maestro Macro 中的 Automator workflow 文件路径,确保其安装在您电脑的 /Users/Min/Library/Services/ 文件夹下,如有移动,请将 Keyboard Maestro 中的路径改为实际位置。
  2. 动作默认提供的 Trigger 是点击鼠标中键,这是考虑到选词几乎必然要使用光标(触控板的场景稍后再说),搭配中键,就能只靠一个输入装置、单手实现“划词、查词、翻译一条龙”,不需再记忆快捷键。另,由于所用 Trigger 高度个人化,您需要重新再录入一遍按键。
  3. 为了避免和别的中键操作撞车,动作默认只在 Preview(预览工具)中生效,你可以在 Keyboard Maestro 编辑界面扩大其应用范围。
Alt text
在 Keyboard Maestro 动作组编辑界面添加适用应用范围

现在用 Preview 打开一份文档,挑一个生词或一句话,点击鼠标中键即可分情况查词或翻译——如果选中的只是一个单词,动作会调用系统原生查词功能,弹出一个词典窗口;如果选中了一整句话,也会弹出一个小浮窗,其中显示的是在线翻译的结果(本文选择 Google 翻译)。

Alt text
根据所选内容不同,自动查词或翻译
注意:本文 Automator 动作用到了 Python 3,在新版本的 macOS 中已经不再预装,请预先安装。

自定义操作方式

鼠标并不是唯一的查词翻译方式,实际上,许多使用内置触控板的读者就用不了鼠标。这时候,仍然可以选择最传统的自动化工具启动方式——快捷键。在动作编辑界面添加一个 Hotkey Trigger,然后录入你喜欢的快捷键。建议的键位是 ⌃Control-⌥Option-⌘Command-D,可以和系统查词(Look Up)快捷键保持相似(系统键位是 ⌃Control-⌘Command-D),更重要的是这三颗键挨在一起,使用时可以一股脑地按下,不需要纠结到底按哪几颗。

Alt text
自定义操作方式

但是不要试图直接用 ⌃Control-⌘Command-D 代替系统快捷键,会弹出两次查词搜索窗口,效果不佳。另外可以留意一下,鼠标中键触发方式是通过 USB Device Key Trigger 实现的,这一触发方式和 Hotkey Trigger 区别在于前者可以控制几乎任意单颗“按键”,而不论其位于键盘还是触控板。Hotkey 则常见于多颗按键的组合。

找回原生体验:搭配 BetterTouchTool

使用 Keyboard Maestro 是为了利用其逻辑模块,减少写脚本的工作量,同时其操作方式也较丰富,快捷键、鼠标皆可。美中不足的是,Keyboard Maestro 对于触控板的支持却表现平平,而 macOS 原生就支持用触控板重按查词,在 Twitter 上就有网友表示更想用触控板完成查词&翻译。

最常见的优化方向是结合 Keyboard Maestro 动作和 BetterTouchTool 的触控板操作。BetterTouchTool 可以覆盖系统原生的操作方式,其中就包括“Single Finger FORCE Click”,可以取代原生的重按。接着在“Single Finger FORCE Click”中加入一段启动 Keyboard Maestro 动作的 AppleScript 脚本,就可以将重按查词改为重按后启动 Keyboard Maestro 动作,实现重按查词/翻译

Alt text
通过 BetterTouchTool 触发 Keyboard Maestro 动作

其中的脚本摘录如下,可以拷贝即用。如果你修改过本文所提供 Keyboard Maestro 动作的名字,需要同时修改脚本中的动作名,将 "Look Up X" 内的 Look Up X 改为你重命名后的动作名。

tell application "Keyboard Maestro Engine"
    do script "Look Up X"
end tell
提前和各位读者说声抱歉,本文初稿写于2020年,如今我早已不使用 BetterTouchTool,再遇新版本早已是烂柯人,恐怕无力回答相关问题。

原理分析

深入一些核心步骤之前,我们来整体浏览一下查词翻译的整个流程,大致了解 Keyboard Maestro 和 Automator 是怎样协作的。过程中有一些和查词或翻译并无直接关联的细节设置,这里一并指出,以免遗漏,也避免和核心步骤混淆。

  1. 开始之前,取得当前剪贴板数据存入 Keyboard Maestro 的变量,因为后续得借助剪贴板传递数据,故需要通过这一步把原有数据保护起来;
  2. 模拟快捷键 ⌘Command-C,拷贝当前所选内容;
  3. 运行 AppleScript 脚本,判断方才拷贝下来的内容有几个单词,并根据单词数据执行不同操作;
  4. 如果多于一个单词,证明选中了词组或句子,需执行负责翻译功能的 Automator 动作;
  5. 如果只有一个单词,证明选中了单词,径直模拟查词快捷键 ⌃Control-⌘Command-D 呼出原生查词界面;
  6. 查词或翻译结束后,从 Keyboard Maestro 变量中将临时保存的数据恢复回剪贴板,避免改动其中的原有内容。
Alt text
Keyboard Maestro 部分的步骤

一个操作,通吃查词+翻译

视情况进行查词或翻译,这一想法源自大量的阅读需求。同样是想“查”,查单词可以简单到按一下触控板,而翻译词组或句子却要复制、前往网页、粘贴;即便借助 LaunchBar 等自动化操作简化了中间操作,查单词和查词组或句子仍然是两套平行、独立的操作。好像双手各拿一双筷子吃饭,没有必要。

真应该把它们合在一起,实现尽量少、尽可能统一的操作。

在这样的需求驱动下,就要求把区分单词和词组/句子的任务交给机器。判断当前所选内容属于单词还是词组/句子,关键依据就是所选内容的词数——只有 1 个,自然是单词;多于 1 个,则是词组或句子。

AppleScript 原生支持了词数(Words)统计,我已经据此写好了脚本;而 Keyboard Maestro 又和 AppleScript 一拍即合,可以根据 AppleScript 的结果执行不同的操作,即视 AppleScript 统计结果是否大于 1,分情况查词或者翻译。

实现弹窗翻译效果

查词的操作比较简单,直接调用系统快捷键 ⌃Control-⌘Command-D 即可;而显示翻译结果的弹窗则需要自己动手实现。本文推荐利用原生工具 Automator 的 Website Popup 模块,设置简单,同时经过细节调整,能够实现和系统查词界面类似的显示效果,保持查询效果的统一。

Keyboard Maestro 支持直接启动 Automator 动作,不过有一点小瑕疵,即只能单纯启动动作,不能再附带处理所选内容,所以有了之前在剪贴板和 Keyboard Maestro 变量间转移数据的一通折腾,通过剪贴板把词组或句子传递给 Automator。所以,Automator 的运行机制就可以归结为:获取剪贴板,和 Google Translate 的搜索链接组合起来(步骤 2),显示组合后的链接页面(步骤 3)。

Alt text
Automator 部分的步骤

Website Popup 模块所显示的其实是一个完整的网页,差不多等于一个 Safari 浏览器窗口,故熟悉其他翻译引擎的读者也可以对本文动作施以改造,使其支持其他翻译引擎。关于链接组合和 Website Popup 模块的自定义,之前在《用 Automator 在迷你浮窗中即时搜索选中的内容》《在 macOS 上随手贴图,Pin 住常用信息(Automator)》两篇文章中有过介绍,本文动作也无需额外的设置,诸位对于自定义显示效果感兴趣的话,阅读前两篇文章即可。

🛍 我撰写的付费栏目《Keyboard Maestro 进阶指引》正在 UNTAG 售卖,详解 Keyboard Maestro Macro 高级设计思路,欢迎选购:付费内容链接

Keyboard Maestro 进阶指引
Keyboard Maestro 进阶指引

author_avatar

Lawyer, macOS/iOS Automation Amateur