Skip to content

Repository files navigation

LocalTranslate

LocalTranslate 是一个面向 macOS 的本机轻量工具箱,把划词翻译、截图 OCR 翻译、 本机助手、系统音频实时字幕和 AI 用量看板放在同一个菜单栏 App 中。翻译与语音 内容默认只发送到本机 Ollama;本机助手默认经 agy 发往 Antigravity。

当前已发布版本:v1.8.0

功能

本机翻译

  • ⌥⇧T:读取当前选中文本并打开完整翻译面板;支持编辑、翻译风格、复制和置顶。
  • ⌥⇧D:在鼠标附近显示轻量翻译气泡。
  • ⌥⇧S:调用 macOS 交互式框选,使用 Apple Vision 在本机 OCR,再交给 Ollama 翻译。
  • 源语言由原文自动识别,无需选择;目标语言可在设置中选择(简体中文、繁體中文、 英、日、韩、法、德、西、俄)。原文本身已是目标语言时,中文与英文互译, 其余语言译为简体中文。
  • 原文与译文各有一个朗读按钮,使用系统语音在本机合成,不联网。译文的语音语言即目标 语言;原文按字形与识别结果判定,单个拉丁词识别不可靠时按英文朗读。
  • 默认 Ollama 地址是 http://127.0.0.1:11434,默认模型是 qwen3.5:4b;地址、模型、keep-alive 和翻译风格可在设置中修改。

本机助手

  • ⌥⇧E:打开输入框,并在后台拉起 agy(等到 init,不发提问)。 有选中文本就预填进去(报错栈、日志、代码、术语),没有选中就空着; 都可以改,⌘↩ 才提交。可钉住,钉住后点击外部不关闭。不额外要求辅助功能权限。 菜单栏也可「启动助手」。
  • 输出三类之一:可直接执行的命令、报错栈的直接原因与该看哪一行、 选中内容的三句解释。命令只复制到剪贴板,不会自动执行或粘贴进终端
  • 破坏性由代码判定,不采信模型自述rm -rfgit reset --hardpush --forcesed -iDROP TABLE 等命中即在命令正下方标红且不可折叠; 不可撤销的额外标注"这一步没有本地退路"。
  • 需要外部核对时,可预览并复制有长度上限、带注入防护的交接内容,再打开 ChatGPT 或 Antigravity;网页不会自动粘贴或发送。
  • 默认经本机 agy 把问题发给 Antigravity(--model gemini-3.8-flash --effort medium)。agy 不可用、 超时或未登录时降到本机 Ollama,并在面板上写明来源。设置里有「只用本地」总开关。

实时字幕

  • ⌥⇧C:打开、暂停或恢复实时字幕。
  • 源语言、字幕呈现与字号可在字幕条工具栏或设置的「实时字幕」页调整。
  • 使用 Core Audio private process tap 捕获系统输出,不安装虚拟声卡,也不创建屏幕共享流。
  • 使用 Apple SpeechAnalyzer / SpeechTranscriber 做端侧增量 ASR,再使用本地 Ollama 翻译。
  • 支持英语、日语、韩语、普通话、粤语、法语、德语、西班牙语和俄语;可切换双语、仅译文或仅原文。
  • 字幕条是固定的三行:上一句译文降权在最上,当前译文居中高亮,当前原文在最下。 三行的位置和高度全程不变,不会因为有没有译文而跳动。
  • 当前译文以续写方式增长——已经显示出来的字不会被改写。整句定稿是唯一一次可以 推翻先前措辞的机会,它定稿后进入上一行,主行随之翻到下一句。
  • 已确认的历史字幕不因后续识别 revision 被改写。

实时链路不是“每次 partial 全文重翻”,而是两个并行状态:

system audio -> ASR -> committed transcript + volatile partial
                          ├─ semantic window planner (翻译单元) -> 整句定稿
                          └─ caption pager           (显示单元) -> preview
                    -> committed translation + preview translation
                    -> immutable history + highlighted current caption

翻译单元和显示单元是分开的:planner 按标点、时长和词数切出送去翻译的窗口, 主行显示到哪由字幕自己攒页决定。两者共用边界时,planner 每切走一段主行就会 凭空缩水。

audio range 用于消除 rolling overlap;sessionID / segmentID / revision 用于拦截旧 Ollama 响应。preview 请求把已显示的译文作为末尾 assistant 消息送出,模型只能往后写,因此屏幕上的字不会被改写。

调整字幕节奏时可以在设置的「实时字幕」页打开「节奏诊断日志」,会话总表写到 ~/.localtranslate/live-subtitles/,记录每句在屏幕上变了几次、被擦掉重写多少字 以及字幕落后语音多少秒。默认关闭——不写盘是实时字幕的资源基线。

AI 用量看板

  • 汇总本机 Codex、Claude、Antigravity、Grok 与百炼 Token Plan 数据源。
  • 账号来源可配置:Codex 账号可增删改(每个对应一个 CODEX_HOME 目录), 其余固定路径来源可单独启停。入口在用量页右上角「账号来源」。
  • 模型用量按 modelID 全局归一,账号卡片聚焦配额窗口和时间汇总。
  • Antigravity 运行时优先从其本机 language server 读取 Gemini 与 Claude/GPT 的 5 小时、每周额度;本机会话库提供可验证时间时统计模型 Token,尚无事件时间时 只保留零 Token 模型证据并标明等待落盘。
  • 使用内存与磁盘增量缓存;单个 Provider 失败时保留其他可用数据。
  • 首次索引大量历史日志时分片进行,卡片上显示「已索引 x/y 个文件」并标明当前 数字尚不完整,补齐完成后自动消失。

环境要求

  • macOS 26 或更高版本;
  • Xcode 26.x(从源码构建时);
  • 已安装并运行 Ollama
  • 至少一个本地翻译模型。

首次使用可以准备默认模型:

ollama pull qwen3.5:4b
ollama serve

如果 Ollama 已由桌面 App 启动,不需要重复执行 ollama serve

安装与运行

Releases 下载 DMG 或 ZIP。当前自动发布产物未签名、未公证,首次打开可能被 Gatekeeper 阻止;可在 Finder 中按住 Control 点击 App,选择“打开”,并确认来源。

也可以在 Xcode 26 中打开 LocalTranslate.xcodeproj,选择 LocalTranslate scheme 后运行。

权限边界

权限 触发功能 用途
辅助功能 划词翻译 读取当前选中文本;必要时模拟复制并恢复剪贴板
屏幕与系统音频录制 截图 OCR 仅在用户按 ⌥⇧S 框选屏幕时请求
系统音频录制 实时字幕 通过 Core Audio process tap 读取系统输出
语音识别 实时字幕 将系统音频转换为增量源文本

实时字幕不使用麦克风,也不使用 ScreenCaptureKit display stream。截图 OCR 的屏幕权限与实时字幕链路相互独立。

快捷键

快捷键 功能
⌥⇧T 划词翻译 / 完整面板
⌥⇧D 划词翻译气泡
⌥⇧E 本机助手:有选区预填进输入框,⌘↩ 提交
⌥⇧S 截图 OCR 翻译
⌥⇧C 实时字幕
⌘↩ 在翻译面板中立即翻译
Esc 隐藏浮窗或取消截图
⌘, 打开设置

快捷键当前不可自定义。若某个组合已被其他 App 占用,设置页的「全局快捷键」会标记为「已被占用」。

隐私与资源

  • 文本、截图 OCR 结果和语音转录默认只发送到 127.0.0.1 的 Ollama;如果修改 Ollama Base URL,数据边界随该配置变化。
  • 翻译、划词、实时字幕只发送到 127.0.0.1 的 Ollama。本机助手默认经 agy 发往 Antigravity;打开设置里的「只用本地」后助手也只走 Ollama。 点击交接按钮时,才把输入、上下文和答案复制到剪贴板并打开目标网站。 网页不会自动粘贴或提交。LocalTranslate 自身不保存提问;走 agy 时 CLI 会在 ~/.gemini/antigravity-cli/ 留下会话记录,会话结束时按 ID 删除本 App 创建的那些。 CLI 全局日志(log/cli-*.log)不动。菜单栏显示未运行 / 启动中 / 运行中, 可启动或停止助手。
  • 截图在临时目录中生成,读取后删除。
  • 实时字幕暂停或关闭时会结束识别输入,并销毁 IOProc、aggregate device 和 process tap,同时取消翻译任务并请求卸载模型。
  • AI 用量活动读取本机客户端数据;刷新额度时,Codex 可能通过本机 app-server 使用现有登录态,Grok 会访问其官方额度服务。Antigravity 额度请求只连接 127.0.0.1 上已运行的 language server。LocalTranslate 不代用户登录账号。

已知限制

  • v1.2.0 已优先解决 partial/final 混合、源转录重复、stale response 覆盖和字幕全文闪烁。
  • v1.5.0 修复 AGY 用量的事件时间来源:Token 此前因时间戳解析落空而无法归入当日, 现按会话库 steps 表的事件时间归日。
  • 快速访谈与长句场景仍可能感知约 2 秒端到端时差,后续优化记录在 Issue #3。优化不会以恢复全文跳变或修改 committed 字幕为代价。
  • Release 产物尚未做 Developer ID 签名与 Apple notarization。

开发

状态测试(实时字幕增量契约、AI 用量与助手安全规则):

./Scripts/run-state-tests.sh

Release 构建:

xcodebuild -project LocalTranslate.xcodeproj \
  -scheme LocalTranslate \
  -configuration Release \
  -destination 'generic/platform=macOS' \
  build \
  CODE_SIGN_IDENTITY="" \
  CODE_SIGNING_REQUIRED=NO \
  CODE_SIGNING_ALLOWED=NO

GitHub Actions 在 macos-15 runner 上显式选择 Xcode 26.x,先跑状态测试再执行 Release 构建。推送到 main 会执行 CI;推送 v* 标签会生成 DMG 和 ZIP,并创建 GitHub Release。

架构不变量、实时字幕增量契约、权限检查和发布流程见 AGENTS.md

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages