尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

NextAI Translator 桌面端全局划词插件:PopClip 与 SnipDo 安装配置与 IPC 实现原理

NextAI Translator 桌面端全局划词插件:PopClip 与 SnipDo 安装配置与 IPC 实现原理 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/popclipmacOS与 clip-extensions/snipdoWindows两个目录下各包含插件清单文件与执行脚本下文逐一展开。macOSPopClip 插件安装与使用准备工作PopClip 是 macOS 上一款成熟的划词软件选中文本后会在光标附近弹出操作条并通过插件机制扩展功能。安装 NextAI Translator 的 PopClip 插件前需要先完成下载并安装 PopClip官方应用商店或官网均可确保本机已经安装并运行 NextAI Translator 桌面端应用——插件本身只负责取词 转发真正的翻译由桌面端完成。安装插件插件安装一共三步下载插件包nextai-translator.popclipextz可从项目 release 产物中获取双击下载完成的nextai-translator.popclipextz在弹出的窗口中点击Install NextAI Translator按钮即可完成安装。popclipextz本质上是popclipextPopClip 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 Identifierxyz.yetone.apps.openai-translator.clip-extensions.popclip插件唯一标识符Extension NameNextAI Translator插件显示名称Extension DescriptionTranslate text with NextAI Translator.插件描述Extension Image Filenextai-translator.png插件在 PopClip 设置列表中的图标Required OS Version10.13最低系统版本要求macOS High SierraActions[0].TitleNextAI Translator操作条上按钮的显示标题Actions[0].Shell Script Filenextai-translator.sh按钮点击后执行的脚本Actions[0].Image Fileicon.png按钮图标CreditsNextAI 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_TEXTsend_text()使用curl通过Unix Domain Socket/tmp/openai-translator.sock向本地桌面端发送 POST 请求请求体就是选中文本如果第一次发送失败桌面端尚未运行Socket 不存在则通过open -g -a NextAI\ Translator静默唤起桌面端应用等待 2 秒后重试发送。从源码结构看open -g的含义是后台启动应用而不抢占当前焦点保证用户操作不被打断sleep 2则给桌面端启动并监听 Socket 留出时间窗口。这也是文档强调先装好桌面端再装插件的原因。WindowsSnipDo 插件安装与使用准备工作SnipDo 是 Windows 平台的划词软件可通过 Microsoft Store 安装选中文本后会弹出快捷操作面板。安装前同样需要下载并安装 SnipDoMicrosoft 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 TranslatorSnipDo 默认会启用多个扩展按钮操作面板会比较拥挤。文档给出的实操建议是在 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.rsstd::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 通过 PopClipmacOS与 SnipDoWindows两个成熟划词软件补齐了桌面端全局取词的能力缺口避免了剪贴板方案带来的副作用。插件侧只是薄薄一层取词 curl 转发桌面端则以平台相关的本地 IPCmacOS/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),仅供参考
返回列表