TranslateDot 是一款原生 macOS 菜单栏应用。它通过 Accessibility API 读取当前应用中的选中文本,调用 Apple Translation framework 在本机完成翻译,并以非激活式悬浮面板呈现结果——全程不打断当前工作流,不依赖任何云端翻译服务。
核心链路:选中文本或框选屏幕区域 → 按快捷键 → 本地识别与翻译 → 悬浮显示。
- 全局快捷键 ⌥D(默认值,可在设置中自定义录制)
- 截图翻译快捷键 ⌥S:拖动框选屏幕区域,使用 Apple Vision 在本机 OCR 后自动翻译
- 通过 macOS Accessibility API 读取焦点元素的选中文本与选区范围;系统级焦点不可用时按前台应用回退,并兼容部分将选区暴露在父元素上的控件
- 辅助功能无法直接提供选区时,定向调用原应用的复制命令取词,读取后恢复原剪贴板
- Apple Translation framework 本地翻译,支持系统语言模型的准备与下载流程
- 设置中的“语言模型”页面可查看各语言组合的安装状态、提前下载中英模型,并跳转系统设置管理已下载模型
- 自动识别源语言:中文(含简繁体、粤语)译为英文,其他语言译为简体中文;源语言、默认目标语言与自动反向目标语言均可自定义,语言列表来自当前系统的 Apple Translation
- 翻译窗口顶部的“源语言 → 目标语言”可直接点击切换,选择结果自动保存并在下次翻译时沿用
- 菜单栏常驻,不显示 Dock 图标(
LSUIElement) - 非激活式
NSPanel,支持多显示器、Space 与全屏应用 - 新请求自动取消旧请求,过期结果不会覆盖当前结果
- 翻译窗口默认 640 × 500,可拖拽右下角调整大小并自动记忆
- 原文可直接编辑并重新翻译(支持 ⌘Return),原文与译文均可单独复制
- 界面完整支持简体中文与英文,跟随 macOS 应用语言设置
| 项目 | 要求 |
|---|---|
| 操作系统 | macOS 15.0 或更高版本 |
| 开发工具 | 支持 Swift 6 与 macOS 15 SDK 的 Xcode(建议 Xcode 16+) |
| 已验证环境 | Xcode 26.2 / Swift 6.2.3 |
| 架构 | Apple Silicon 与 Intel(标准构建设置,无 Intel 专用逻辑) |
依赖:KeyboardShortcuts(≥ 3.1.0,经 Swift Package Manager 管理,Xcode 首次打开时自动解析)。
- 使用 Xcode 打开
TranslateDot.xcodeproj。 - 选择
TranslateDotscheme 与My Mac目标。 - 在 Target → Signing & Capabilities 中选择你的 Development Team。项目有意关闭 App Sandbox,以便直接分发版本访问其他应用的 Accessibility 元素。
- 点击 Run。应用启动后仅在菜单栏显示字符气泡图标。
- 在 TextEdit 等应用中选中文本并按 ⌥D;无法选中的图片、PDF 或视频字幕可按 ⌥S 框选截图翻译。
- 首次使用时,按面板提示前往"系统设置 → 隐私与安全性 → 辅助功能"启用 TranslateDot,返回原应用后重新选择文本并再次按 ⌥D。
- 若对应语言模型尚未安装,macOS 会弹出系统下载/授权界面,完成后翻译自动继续。
xcodebuild -project TranslateDot.xcodeproj \
-scheme TranslateDot \
-destination 'platform=macOS' \
-derivedDataPath .build/DerivedData \
CODE_SIGNING_ALLOWED=NO build
xcodebuild -project TranslateDot.xcodeproj \
-scheme TranslateDot \
-destination 'platform=macOS' \
-derivedDataPath .build/DerivedData \
CODE_SIGNING_ALLOWED=NO testmacOS 不允许普通应用直接读取其他应用的当前选区。TranslateDot 使用 AXFocusedUIElement、AXSelectedText、AXSelectedTextRange 与 AXBoundsForRange,且仅在用户主动按下快捷键时读取当前选区及其位置;权限被拒绝或撤销时,应用会显示引导界面,不会崩溃。
截图翻译需要 macOS 的“屏幕与系统音频录制”权限。TranslateDot 仅在用户按下截图快捷键并主动框选后捕获该区域,不持续录屏,也不申请输入监控权限。全局快捷键由 Carbon hot key 机制的封装库提供,而非全局键盘事件监听。
- 翻译由 Apple Translation framework 与系统本地语言模型完成,不接入云端翻译 API,无需 API Key
- 截图 OCR 使用 Apple Vision 在本机完成,截图不会上传,也不会保存
- 不保存翻译历史、原文或译文
- 日志仅记录权限状态、错误类型、状态切换与请求耗时,不记录选择内容
- 直接取词失败时短暂调用原应用的复制命令,读取后恢复原剪贴板,原文不会保留在剪贴板中;仅当点击"复制译文"后译文才会进入系统剪贴板
默认 Bundle ID 为 com.simon.translatedot,可在 Xcode 的 Target → Signing & Capabilities → Bundle Identifier 中修改。若之后重新运行工程生成脚本,请同步修改 scripts/generate_project.rb 中的 PRODUCT_BUNDLE_IDENTIFIER。
修改 Bundle ID 后,macOS 会将其视为新的应用身份,需要重新授予辅助功能权限。
退出 TranslateDot 后执行:
tccutil reset Accessibility com.simon.translatedot再次运行并按 ⌥D 即可重新走授权流程。若修改过 Bundle ID,请替换命令中的标识符。
不要同时运行 Xcode DerivedData 与 /Applications 中的两份 TranslateDot。先停止 Xcode 中的进程并退出所有 TranslateDot 实例,然后执行上述 tccutil reset 命令,从 /Applications/TranslateDot.app 重新启动并授权。
应用每次启动最多主动请求一次系统授权弹窗,并在系统设置打开期间自动复检权限。如果同一次启动中持续出现多个授权弹窗,通常表示还有另一份 TranslateDot 正在运行。
-
scripts/generate_project.rb:使用本机xcodeprojRuby gem 重建工程文件,日常构建不需要运行 -
scripts/generate_app_icons.swift:从品牌源图重新生成应用图标尺寸集swift scripts/generate_app_icons.swift \ TranslateDot/Resources/Brand/TranslateDotIconMaster.png \ TranslateDot/Resources/Assets.xcassets/AppIcon.appiconset
- 登录时启动
- Developer ID 签名、公证与直接分发流程