NextAI Translator 桌面端全局划词插件:PopClip 与 SnipDo 安装配置与 IPC 实现原理
【免费下载链接】nextai-translator基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 - Browser extension and cross-platform desktop application for translation based on ChatGPT API.项目地址: https://gitcode.com/GitHub_Trending/op/nextai-translator
导读
划词翻译是 NextAI Translator 的核心体验:浏览器插件可以借助浏览器内置 API 直接取得选中的文本,而桌面端应用却没有跨操作系统的统一取词 API。本文基于仓库中的 CLIP-EXTENSIONS-CN.md 文档,完整梳理 macOS 端 PopClip 插件与 Windows 端 SnipDo 插件的安装、配置与使用流程,并结合 clip-extensions/popclip 与 clip-extensions/snipdo 的插件源码、src-tauri/src/main.rs 中的 IPC 服务端实现,讲解插件与桌面端之间通过本地 Socket / HTTP 端口通信的底层原理。读完本文,你将能够独立完成两大桌面端划词插件的部署,并理解"第三方划词软件取词 → 本地 IPC → 翻译窗口"这一完整链路。
为什么桌面端需要独立的划词插件
浏览器场景下,划词翻译可以直接读取用户选中的文本,因为浏览器插件拥有访问选中内容的统一 API。但桌面端应用面对的是整个操作系统的任意窗口,macOS、Windows、Linux 各自都没有统一的系统级 API 可以直接获取"用户当前选中的文本"。
常见的替代方案是借助剪贴板:模拟复制操作、再读取剪贴板内容。但这种方式存在明显缺陷:
- 剪贴板混乱:频繁改写剪贴板会污染用户正常复制粘贴的内容,在一些应用中可能引发异常行为;
- 无选中文本时的误报:在 macOS 上,如果没有选中任何文本就触发了复制快捷键,系统会发出警告声,体验很差;
- 破坏复制历史:使用剪贴板增强工具(如 Paste、Raycast)的用户,其复制历史会被大量"假复制"刷屏。
幸运的是,各操作系统都已经存在成熟的划词软件,并且提供了完善的插件机制。NextAI Translator 正是针对这些划词软件开发了专用插件,让用户"无痛"获得桌面端的全局划词翻译能力——选中文本 → 点击浮动按钮 → 桌面端弹出翻译窗口。
从仓库目录结构可以看到,插件源码按平台组织在 clip-extensions/popclip(macOS)与 clip-extensions/snipdo(Windows)两个目录下,各包含插件清单文件与执行脚本,下文逐一展开。
macOS:PopClip 插件安装与使用
准备工作
PopClip 是 macOS 上一款成熟的划词软件,选中文本后会在光标附近弹出操作条,并通过插件机制扩展功能。安装 NextAI Translator 的 PopClip 插件前,需要先完成:
- 下载并安装 PopClip(官方应用商店或官网均可);
- 确保本机已经安装并运行 NextAI Translator 桌面端应用——插件本身只负责"取词 + 转发",真正的翻译由桌面端完成。
安装插件
插件安装一共三步:
- 下载插件包
nextai-translator.popclipextz(可从项目 release 产物中获取); - 双击下载完成的
nextai-translator.popclipextz; - 在弹出的窗口中点击Install "NextAI Translator"按钮,即可完成安装。
popclipextz本质上是popclipext(PopClip Extension)目录的 zip 压缩包。仓库中的 Makefile 给出了完整的打包命令,可以直观看到产物的构成:
build-popclip-extension: rm -f dist/nextai-translator.popclipextz mkdir -p dist/nextai-translator.popclipext cp -r clip-extensions/popclip/* dist/nextai-translator.popclipext cd dist && zip -r nextai-translator.popclipextz nextai-translator.popclipext && rm -r nextai-translator.popclipext即:把 clip-extensions/popclip 目录下的全部文件(Config.plist、nextai-translator.sh 及图标)复制进nextai-translator.popclipext目录,再压缩为nextai-translator.popclipextz。
启用并开始使用
- 安装完成后,打开PopClip 的设置页面,在插件列表中开启NextAI Translator;
- 回到任意应用中选中一段文本,PopClip 弹出操作条时即可看到 NextAI Translator 按钮;
- 点击该按钮,桌面端翻译窗口随即弹出并显示选中文本的翻译结果。
插件源码解析:脚本做了什么
PopClip 插件由两份文件组成,理解它们有助于排查安装后不生效的问题。
Config.plist 是 PopClip 插件的声明文件(XML Property List 格式),核心字段如下:
| 字段 | 取值 | 说明 |
|---|---|---|
Extension Identifier | xyz.yetone.apps.openai-translator.clip-extensions.popclip | 插件唯一标识符 |
Extension Name | NextAI Translator | 插件显示名称 |
Extension Description | Translate text with NextAI Translator. | 插件描述 |
Extension Image File | nextai-translator.png | 插件在 PopClip 设置列表中的图标 |
Required OS Version | 10.13 | 最低系统版本要求(macOS High Sierra) |
Actions[0].Title | NextAI Translator | 操作条上按钮的显示标题 |
Actions[0].Shell Script File | nextai-translator.sh | 按钮点击后执行的脚本 |
Actions[0].Image File | icon.png | 按钮图标 |
Credits | NextAI Translator 项目链接 | 插件归属信息 |
真正的取词转发逻辑在 nextai-translator.sh 中,全文如下:
send_text() { curl -d "$POPCLIP_TEXT" --unix-socket /tmp/openai-translator.sock http://nextai-translator } if ! send_text; then open -g -a NextAI\ Translator sleep 2 send_text fi脚本逻辑非常清晰:
- PopClip 在执行 Action 脚本时,会把选中的文本注入环境变量
POPCLIP_TEXT; send_text()使用curl通过Unix Domain Socket/tmp/openai-translator.sock向本地桌面端发送 POST 请求,请求体就是选中文本;- 如果第一次发送失败(桌面端尚未运行,Socket 不存在),则通过
open -g -a NextAI\ Translator静默唤起桌面端应用,等待 2 秒后重试发送。
从源码结构看,open -g的含义是后台启动应用而不抢占当前焦点,保证用户操作不被打断;sleep 2则给桌面端启动并监听 Socket 留出时间窗口。这也是文档强调"先装好桌面端再装插件"的原因。
Windows:SnipDo 插件安装与使用
准备工作
SnipDo 是 Windows 平台的划词软件(可通过 Microsoft Store 安装),选中文本后会弹出快捷操作面板。安装前同样需要:
- 下载并安装 SnipDo(Microsoft Store 应用);
- 确保本机已安装并运行 NextAI Translator 桌面端应用。
安装插件
- 下载插件包
nextai-translator.pbar; - 双击下载完成的
nextai-translator.pbar即可完成安装(SnipDo 会自动识别并导入); - 打开SnipDo 的设置页面,在已安装的扩展中启用NextAI Translator。
SnipDo 的插件包pbar同样是 zip 归档,仓库 Makefile 中的打包命令为:
build-snipdo-extension: rm -f dist/nextai-translator.pbar zip -j -r dist/nextai-translator.pbar clip-extensions/snipdo/*zip -j会把 clip-extensions/snipdo 目录下的文件(nextai-translator.json、nextai-translator.ps1 与图标)直接压入pbar包,不保留目录层级。
使用建议:只保留 NextAI Translator
SnipDo 默认会启用多个扩展按钮,操作面板会比较拥挤。文档给出的实操建议是:在 SnipDo 的设置页面中,只保留 NextAI Translator 一个扩展,关闭其余扩展,这样选中文本后弹出的操作条干净简洁,只显示翻译按钮,避免误触。
完成上述配置后,在任意应用中选中文本,SnipDo 操作条即出现翻译入口,点击后桌面端翻译窗口弹出并完成翻译。
插件源码解析:PowerShell 脚本做了什么
SnipDo 插件的声明文件是 nextai-translator.json,内容如下:
{ "name": "NextAI Translator", "identifier": "xyz.yetone.apps.openai-translator.clip-extensions.snipdo", "icon": "icon.png", "actions": [ { "title": "NextAI Translator", "icon": "icon.png", "powershellFile": "nextai-translator.ps1" } ] }与 PopClip 的 plist 声明相对应:identifier同样是xyz.yetone.apps.openai-translator.clip-extensions命名空间下的唯一标识,actions中指定了按钮标题、图标与要执行的 PowerShell 脚本。
实际转发逻辑在 nextai-translator.ps1 中:
param( [string]$PLAIN_TEXT ) $encode_text = [System.Text.Encoding]::UTF8.GetBytes($PLAIN_TEXT) curl 127.0.0.1:62007 -Method POST -Body $encode_text -UseBasicParsing要点如下:
- SnipDo 把选中文本通过参数
$PLAIN_TEXT传给脚本; - 脚本先将文本按UTF-8编码为字节数组(
[System.Text.Encoding]::UTF8.GetBytes),确保中文等多字节字符在传输中不出现乱码; - 然后通过
curl以 POST 方式发送到本机127.0.0.1:62007端口。
与 macOS 端使用 Unix Domain Socket 不同,Windows 端走的是TCP 回环端口 62007,这与桌面端在两种平台上的 IPC 服务实现一一对应(见下一节)。
底层原理:桌面端本地 IPC 服务如何接收文本
插件负责取词与转发,桌面端则负责接收。这段通信服务的实现在 src-tauri/src/main.rs 中,根据平台条件编译出两种监听方式。
双平台监听逻辑
桌面端启动时,会派生一个后台线程专门运行 IPC 服务(src-tauri/src/main.rs):
std::thread::spawn(move || { #[cfg(target_os = "windows")] { let server = Server::http("127.0.0.1:62007").unwrap(); launch_ipc_server(&server); } #[cfg(not(target_os = "windows"))] { use std::path::Path; let path = Path::new("/tmp/openai-translator.sock"); std::fs::remove_file(path).unwrap_or_default(); let server = Server::http_unix(path).unwrap(); launch_ipc_server(&server); } });- Windows:监听
127.0.0.1:62007TCP 端口,这正是 PowerShell 脚本中curl 127.0.0.1:62007的目标; - macOS / Linux:监听 Unix Domain Socket
/tmp/openai-translator.sock,这正是 Shell 脚本中curl --unix-socket /tmp/openai-translator.sock的目标。启动前先remove_file清理可能残留的旧 Socket 文件,避免地址占用。
也就是说,插件脚本里的每个细节——Socket 路径、端口号、POST 方法——都能在桌面端源码中找到严格对应的监听端。两端使用 HTTP 协议通信,因此插件侧只需curl即可完成调用,无需额外依赖。
收到文本后发生了什么
launch_ipc_server是核心处理函数(src-tauri/src/main.rs):
#[inline] fn launch_ipc_server(server: &Server) { for mut req in server.incoming_requests() { let mut selected_text = String::new(); req.as_reader().read_to_string(&mut selected_text).unwrap(); let use_compact = config::get_config() .ok() .and_then(|c| c.use_compact_lookup) .unwrap_or(false); if use_compact { let window = windows::show_inline_lookup_window(false, true, false); utils::send_text(selected_text); let _ = window.set_focus(); } else { utils::send_text(selected_text); remember_active_window(); let window = windows::show_translator_window(false, true, false); window.set_focus().unwrap(); utils::show(); } let response = HttpResponse::from_string("ok"); req.respond(response).unwrap(); } }处理流程可以归纳为:
- 读取请求体:从 POST 请求中读出完整的选中文本;
- 读取配置:查询
use_compact_lookup配置项,决定采用哪种展示形态; - 分流展示:
- 若启用紧凑模式(
use_compact_lookup为 true),弹出内联查词窗口(show_inline_lookup_window); - 否则记录当前活动窗口(
remember_active_window,便于翻译后切回),弹出常规翻译窗口(show_translator_window)并置前显示;
- 若启用紧凑模式(
- 回执响应:向插件返回字符串
ok,插件脚本收到成功响应后结束。
选中的文本通过 src-tauri/src/utils.rs 中的send_text以 Tauri 事件change-text广播给前端窗口,前端监听该事件后即可驱动翻译流程:
pub fn send_text(text: String) { match APP_HANDLE.get() { Some(handle) => handle.emit("change-text", text).unwrap_or_default(), None => {} } }由此,"选中文本 → 划词软件插件 → 本地 IPC → 桌面端窗口 → 翻译渲染"的完整链路全部打通。
常见问题排查
结合文档流程与源码实现,整理以下排查要点:
- 点击按钮无反应:优先确认桌面端应用已启动并保持运行。从脚本逻辑看,macOS 端在发送失败时会自动唤起应用并重试,但如果应用未安装,
open -a也会失败; - macOS 发送失败但应用已启动:检查
/tmp/openai-translator.sock是否被占用或残留陈旧文件。桌面端启动时虽会清理旧 Socket,但如果曾有异常退出的实例,可重启桌面端应用解决; - Windows 发送失败:检查
127.0.0.1:62007端口是否被其他程序占用;同时确认 PowerShell 脚本被正常执行(SnipDo 设置中扩展处于启用状态); - 中文乱码:确认使用的是最新版插件包。Windows 端脚本显式以 UTF-8 编码文本字节,若使用旧版本插件可能出现编码问题;
- 操作面板按钮过多:按文档建议,在 SnipDo 设置中只保留 NextAI Translator 扩展,保持操作条干净。
结语
NextAI Translator 通过 PopClip(macOS)与 SnipDo(Windows)两个成熟划词软件补齐了桌面端全局取词的能力缺口,避免了剪贴板方案带来的副作用。插件侧只是薄薄一层"取词 + curl 转发",桌面端则以平台相关的本地 IPC(macOS/Linux 的 Unix Socket、Windows 的 TCP 端口)统一接收文本,并通过配置项灵活切换内联查词与翻译窗口两种展示形态。整套方案轻量、可维护,也展示了"借助生态成熟组件补齐系统能力"的工程思路。安装与配置过程已在上文完整给出,按步骤操作即可在两大桌面平台上获得与浏览器插件一致的划词翻译体验。
【免费下载链接】nextai-translator基于 ChatGPT API 的划词翻译浏览器插件和跨平台桌面端应用 - Browser extension and cross-platform desktop application for translation based on ChatGPT API.项目地址: https://gitcode.com/GitHub_Trending/op/nextai-translator
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考