{"id":48646763,"url":"https://github.com/uxwangy-code/dumbtranspro","last_synced_at":"2026-06-14T04:01:04.465Z","repository":{"id":350378764,"uuid":"1206573300","full_name":"uxwangy-code/DumbTransPro","owner":"uxwangy-code","description":"瞎翻 Pro — macOS 菜单栏 AI 翻译工具：支持中文转英文、划词翻译、翻译风格和辅助功能授权流程","archived":false,"fork":false,"pushed_at":"2026-05-31T01:51:07.000Z","size":7631,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-31T03:19:22.186Z","etag":null,"topics":["accessibility","macos","macos-app","menu-bar","openai-api","swift","translation"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/uxwangy-code.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-10T03:37:33.000Z","updated_at":"2026-05-31T01:51:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"8703cc63-b0ac-4150-b583-cd3c5165230c","html_url":"https://github.com/uxwangy-code/DumbTransPro","commit_stats":null,"previous_names":["uxwangy-code/dumbtranspro"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/uxwangy-code/DumbTransPro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uxwangy-code%2FDumbTransPro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uxwangy-code%2FDumbTransPro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uxwangy-code%2FDumbTransPro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uxwangy-code%2FDumbTransPro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uxwangy-code","download_url":"https://codeload.github.com/uxwangy-code/DumbTransPro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uxwangy-code%2FDumbTransPro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34308622,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility","macos","macos-app","menu-bar","openai-api","swift","translation"],"created_at":"2026-04-10T05:56:46.030Z","updated_at":"2026-06-14T04:01:04.458Z","avatar_url":"https://github.com/uxwangy-code.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 瞎翻 Pro · DumbTrans Pro\n\n\u003e 选中文字 + 一个快捷键 = 翻译。常驻 macOS 菜单栏的小工具，不抢焦点、不占 Dock。\n\n```\n好好学习         →  ⌘⇧R  →  study-hard          （正翻 = 默认自然风格）\n好好学习         →  ⌘⇧R  →  good-good-study      （土翻 = 中式直译,差生专用）\nselect english   →  ⌘⇧F  →  浮动面板给出中文译文   （划词翻译）\n```\n\n---\n\n## 为什么做这个\n\n起项目名挡住了太多次\"就写两行玩一下\"的冲动：\n\n- 打开浏览器 → 开翻译 → 复制中文 → 粘贴 → 复制结果 → 切回 Finder → 粘贴 → 再把空格改成 `-`\n- 或者干脆随便敲个 `test2`、`new_project_final_v3`，三个月后自己都找不到\n\n后来发现这套快捷键还能用在另一个高频场景：**在英文设计平台搜素材**——上 Dribbble / Behance / Pinterest 这类网站找参考时，脑子里只有中文关键词，想不起来对应英文怎么写。在搜索框里输入中文 → `⌘⇧R` → 直接翻译成英文关键词 → 回车搜索。中间不用切翻译网页、不用复制粘贴，几乎无感。\n\n再后来 `⌘⇧F` 划词翻译被加进来——日常看英文资料 / 文档时一键查中文意思，比开词典 / 复制到翻译网站快得多。\n\n---\n\n## 功能\n\n- 🎯 **中文转英文**（`⌘⇧R`）：任何 app 的任何输入框都能用；短词/命名自动整理成 kebab-case，句子/长文本输出正常英文\n- 🔍 **划词翻译**（`⌘⇧F`）：选中外文，弹出浮动面板显示中文译文，原文 / 译文都各自限高可滚动，长文自动折叠\n- 🎭 **三种翻译风格**：**土翻 / 正翻 / 装翻**——日常用正翻；想搞点乐子时切土翻（`好好学习 → good good study`）；想装一下时切装翻（中文出文言文 / 古诗，英文混拉丁）\n- 🛡 **风格化兜底**：土翻 / 装翻 偶尔抽风(模型乱续示例)时，自动用正翻翻译并在前面挂一行小蓝字「😅 太难了,我实在装不下去了…」，不会留你一个空响应\n- ✂️ **智能格式化流程**：读取选中文字 → 判断短词还是长文本 → 调 AI 翻译 → 自动粘贴回去\n- 🍱 **多家 AI 服务商**：OpenAI、智谱 GLM、DeepSeek、Kimi、MiniMax、通义千问、豆包，以及任意 OpenAI 兼容 endpoint\n- 🎚 **每家独立配置**：API Key / endpoint / 模型分别按 provider 保存，切换后原值自动回填；endpoint 与模型都有「快捷选择」预设\n- 🔐 **API Key 存 Keychain**，不落盘在任何明文配置里；输入框右侧可一键切换显示 / 隐藏\n- 👻 **纯菜单栏常驻**，不占 Dock 格子，菜单栏图标是一条会心一笑的小鱼\n- ⚡ **原生 Swift**，冷启动快，内存占用低，无第三方依赖\n\n---\n\n## 安装\n\n### 直接下载（推荐普通用户）\n\n从 [GitHub Releases](https://github.com/uxwangy-code/DumbTransPro/releases/latest) 下载最新的 `.zip`，解压后将 `DumbTransPro.app` 拖到「应用程序」文件夹即可。\n\nmacOS 13+ 可用。\n\n### 从源码构建（推荐开发者）\n\n```bash\ngit clone https://github.com/uxwangy-code/DumbTransPro.git\ncd DumbTransPro\n\n# 一次性：在本机生成自签代码签名证书\n# （没有这一步会 fallback 到 adhoc，TCC 授权每次 rebuild 会失效）\nbash scripts/setup-signing.sh\n\n# 构建、签名并安装到「应用程序」\nbash scripts/bundle.sh --install --launch\n```\n\n依赖：macOS 13+ · Xcode Command Line Tools（`xcode-select --install`）· OpenSSL（macOS 自带）。\n\n\u003e 📌 `setup-signing.sh` 会在 `~/Library/Keychains/dumbtrans-signing.keychain-db` 创建一张 10 年期的本地 self-signed 证书。这张证书**不会进 git**（私钥不能进仓库），所以**每台开发机都要跑一次**。换电脑或重装系统后再跑一次即可。\n\n`--install` 默认会把应用安装到 `/Applications/瞎翻 Pro.app`，并刷新 Launch Services，让「应用程序」文件夹、Launchpad 和 Spotlight 能找到它。如果没有 `/Applications` 写入权限，可以改装到当前用户应用目录：\n\n```bash\nDUMBTRANS_INSTALL_DIR=\"$HOME/Applications\" bash scripts/bundle.sh --install --launch\n```\n\n### 首次启动授权\n\n第一次启动会在菜单栏小鱼图标下拉里看到 `⚠ 请授权辅助功能（点击打开设置）`：\n\n1. 点击该菜单项，自动跳转到 **系统设置 → 隐私与安全性 → 辅助功能**\n2. 启用 `DumbTransPro` 的开关\n3. 回到 app，菜单里的警告会在 2 秒内自动消失\n\n只需授权这一次。之后 rebuild 不用再操作（前提是用了 `setup-signing.sh` 的稳定签名）。\n\n如果要取消授权：点击菜单栏小鱼图标 → `辅助功能权限：已授权（点击管理/取消）`，在系统设置里关闭 `瞎翻 Pro` / `DumbTransPro` 即可。\n\n如果系统设置的辅助功能列表里看不到应用，先确认已安装到 `/Applications/瞎翻 Pro.app` 或 `~/Applications/瞎翻 Pro.app`。必要时可以重置旧授权记录后重新启动安装版：\n\n```bash\ntccutil reset Accessibility com.whimsycode.dumbtrans-pro\nopen \"/Applications/瞎翻 Pro.app\"\n```\n\n---\n\n## 配置\n\n点击菜单栏的小鱼图标 → **设置**，填入 API Key：\n\n| 服务商 | 默认模型 | 申请地址 |\n|--------|---------|---------|\n| 智谱 GLM | `glm-4-flash`（免费额度够用） | https://open.bigmodel.cn |\n| OpenAI | `gpt-4o-mini` | https://platform.openai.com |\n| DeepSeek | `deepseek-v4-flash` | https://platform.deepseek.com |\n| Kimi | `moonshot-v1-8k` | https://platform.moonshot.cn |\n| MiniMax | `MiniMax-M2.7-highspeed` | https://platform.minimax.io |\n| 通义千问 | `qwen-turbo` | https://bailian.console.aliyun.com |\n| 豆包 | `doubao-lite-32k` | https://www.volcengine.com/product/ark |\n| 自定义 | 任意 OpenAI 兼容 API | — |\n\n\u003e 推荐新手从 **智谱 GLM** 开始，注册即送额度，`glm-4-flash` 本身也是免费的。\n\n设置面板的几个细节：\n\n- **Endpoint** 与 **Model** 字段都可以手输入，也可点旁边的「快捷选择」用预设值（如智谱 Coding Plan 端点、Kimi 国内/国际、千问海外区域、DeepSeek beta 等）\n- 每家 provider 的 API Key、endpoint、模型**独立保存**；切到别家再切回来时，原本填的值会自动回填\n- 模型「快捷选择」只列**非推理模型**——推理模型对翻译质量收益小、却慢且贵；如要使用，手输入模型名即可\n- 国内 provider 都有内容安全过滤，敏感话题会被服务端 400 拒绝并给出明确提示，可切到 OpenAI 重试\n\n翻译风格可在设置中切换：\n\n| 风格 | 提示文案 | 调性 |\n|------|---------|------|\n| 土翻 | 中式直译,差生专用,会英语的不要选 | 「好好学习 → good good study」「加油 → add oil」「人山人海 → people mountain people sea」逐字直译,中文骨架透过英文皮肤 |\n| 正翻 | 默认推荐,追求自然准确,正常人首选 | 母语者风格,日常推荐 |\n| 装翻 | 偶尔抽风会出文言文或者散文,没有文学修养不要轻易尝试 | 中→英 混拉丁与古英语(`项目→opus magnum`);英→中 按输入自选文言词 / 文言文段 / 五言七言诗 / 散文诗 |\n\n\u003e 翻译风格在「中文转英文」和「划词翻译」两个动作里都生效。土翻 / 装翻 模型抽风时会自动用正翻兜底,前面会出现一行小蓝字提示「😅 太难了,我实在装不下去了…」,不会让你看见模型乱续示例的翻车场面。\n\n---\n\n## 使用\n\n### 中文转英文（`⌘⇧R`）\n\n在 **任何** 输入框里都能用,常见场景:\n\n- **文件命名**: Finder 选中文件名 → 输中文 → `⌘⇧R` → 自动替换成 `study-hard` 这种 kebab-case\n- **英文关键词搜索**: Dribbble / Behance / Pinterest 这类英文设计平台搜素材时,搜索框里输中文 → `⌘⇧R` → 直接拿到英文关键词回车搜\n- **变量 / 函数名**: IDE 里给变量起名,中文想好了不会翻 → 选中 → `⌘⇧R` → 出 kebab-case,稍微改改就能用\n- **句子 / 长文本**: 聊天框、文档、需求描述里选中中文 → `⌘⇧R` → 输出正常英文句子,不会强行串成 kebab-case\n- **任意要英文的输入框**: 终端、浏览器地址栏、聊天框,只要能选中文字、能粘贴英文,都行\n\n操作:选中中文 → 按 `⌘⇧R` → 等菜单栏小鱼变 ⏳ 再变回来(一般 500ms 内) → 选中的内容会按短词/长文本自动替换成英文。\n\n### 划词翻译（外文 → 中文）\n\n在 **任何** app 里看英文资料/文档时：\n\n1. 鼠标选中要查的句子或段落\n2. 按 `⌘⇧F`\n3. 屏幕中央弹出浮动面板，上方原文（\u003e100 字自动折叠 + 展开按钮），下方按当前翻译风格显示中文译文，右下角显示当前用的模型名\n4. 点面板右上角 × 关闭\n\n### 自定义快捷键\n\n不喜欢默认的 `⌘⇧R` / `⌘⇧F`？菜单栏 → 设置… → **快捷键** 分区可以为两个动作各自重新录入：\n\n- 点击芯片进入录制态，按下任意 **≥1 个 ⌘/⌃/⌥ + 主键** 的组合，松手自动保存生效（不走「保存」按钮）\n- 点 `×` 清空快捷键 —— 菜单栏 dropdown 里对应行会变成可点击触发，保证功能不丢\n- 录制态按 `Esc` 取消，按 `Delete` 清空，点 ↺ 重置回默认值\n- 撞到当前 app 主菜单项（比如 `⌘Q`）或者系统已注册的快捷键（比如 `⌘Space` Spotlight），会出黄色软警告，仍允许保存（前台 app 会优先吞掉事件）\n- 两个动作不能用同一个组合 —— 撞了会出红色提示，需重录\n\n---\n\n## 开发\n\n### 跨机器迁移开发\n\n```bash\n# 新机器\ngit clone https://github.com/uxwangy-code/DumbTransPro.git\ncd DumbTransPro\n\n# 必跑一次：生成本机自签证书\nbash scripts/setup-signing.sh\n```\n\n之后正常开发即可。\n\n### 常用命令\n\n```bash\n# 跑测试\nswift test\n\n# 开发期直接从终端跑（stderr log 直接看见）\nswift run DumbTransPro\n\n# 完整 build + sign + 打包 .app\nbash scripts/bundle.sh\n\n# 完整 build + sign + 安装到「应用程序」\nbash scripts/bundle.sh --install\n\n# 启动安装版\nopen \"/Applications/瞎翻 Pro.app\"\n\n# 一次性：生成 Sparkle 自动更新签名 key（私钥只进本机 Keychain）\nbash scripts/setup-sparkle.sh\n\n# 发布更新包 + 生成 docs/appcast.xml\nbash scripts/release-update.sh 1.2.0 120 RELEASE_NOTES.md\n```\n\n### Git workflow\n\n```bash\ngit pull                              # 同步远端\n# 改代码\nswift test                            # 跑测试\ngit add -A \u0026\u0026 git commit -m \"...\"     # 提交\ngit push origin main                  # 推到 GitHub\n```\n\n仓库：https://github.com/uxwangy-code/DumbTransPro\n\n### 项目结构\n\n```\nSources/\n├── DumbTransPro/main.swift           # NSApplication 入口\n└── DumbTransProCore/                 # 核心逻辑（可测）\n    ├── MenuBarManager.swift          # 菜单栏 + 辅助功能自检\n    ├── HotkeyManager.swift           # Carbon RegisterEventHotKey\n    ├── ClipboardManager.swift        # ⌘C/⌘V 模拟 + 选中文字捕获\n    ├── TranslateService.swift        # OpenAI 兼容 API 调用\n    ├── TranslationStyle.swift        # 翻译风格 + 快捷键动作\n    ├── TextFormatter.swift           # kebab-case 格式化\n    ├── SettingsStore.swift           # 配置持久化（Keychain + UserDefaults）\n    ├── SettingsView.swift            # 设置面板 SwiftUI\n    ├── UpdateManager.swift           # Sparkle 自动更新入口\n    ├── KeychainHelper.swift          # API Key 安全存储\n    ├── LookupPanelState.swift        # 划词翻译面板状态\n    ├── LookupPanelView.swift         # 划词翻译面板 UI\n    └── LookupPanelManager.swift      # 划词翻译面板窗口管理\nTests/                                # Swift Testing 单元测试(含 prompt 泄露检测 + 兜底链路)\nResources/                            # AppIcon.icns + MenuBarIcon*.png + Info.plist\nscripts/\n├── setup-signing.sh                  # 一次性创建本机自签代码签名证书\n├── setup-sparkle.sh                  # 一次性创建 Sparkle 更新签名 key\n├── release-update.sh                 # 构建更新 zip + 生成 appcast.xml\n├── bundle.sh                         # build + sign + package\n└── process-menubar-icon.py           # 把生成的剪影 PNG 转成 macOS template image\n```\n\n技术栈：Swift 6 · SwiftUI · Carbon RegisterEventHotKey · NSPasteboard + CGEvent · URLSession · Combine · Sparkle。\n\n---\n\n## 关于代码签名\n\n`bundle.sh` 会**自动检测**是否有 `DumbTransPro Dev` 这张本地证书：\n\n- **有** → 用它签名。Designated Requirement 基于证书指纹 + bundle id，**TCC 授权跨 rebuild 持久有效**\n- **没有** → fallback 到 adhoc 签名，每次 rebuild 都要重新去系统设置里加一次辅助功能授权\n\n`setup-signing.sh` 用 OpenSSL 生成一张 10 年期 self-signed code-signing 证书，存到独立 keychain（`~/Library/Keychains/dumbtrans-signing.keychain-db`），并通过 `set-key-partition-list` 预授权 codesign 访问，整个过程无 GUI 弹窗。\n\n## 关于自动更新\n\n菜单栏里的 `检查更新…` 由 Sparkle 2 驱动。发布版需要同时满足三件事：\n\n1. `Info.plist` 里有 `SUFeedURL` 和 `SUPublicEDKey`\n2. GitHub Pages 从 `docs/` 目录发布，并能访问 `docs/appcast.xml`\n3. GitHub Release 里上传了对应版本的 `DumbTransPro-x.y.z.zip`\n\n第一次发布前先生成 Sparkle EdDSA key：\n\n```bash\nbash scripts/setup-sparkle.sh\n```\n\n私钥会存在本机 Keychain，不进仓库；脚本会打印 `SUPublicEDKey`。之后发布新版本：\n\n```bash\nbash scripts/release-update.sh 1.2.0 120 RELEASE_NOTES.md\n```\n\n脚本会：\n\n- 用 `DUMBTRANS_VERSION` / `DUMBTRANS_BUILD` 写入版本号\n- 注入 Sparkle 公钥\n- 打包 `build/sparkle-release/v1.2.0/DumbTransPro-1.2.0.zip`\n- 生成或更新 `docs/appcast.xml`\n\n然后在 GitHub 创建 `v1.2.0` release，上传 zip，并提交 `docs/appcast.xml`。如果在 CI 里发布，需要用 `DUMBTRANS_SPARKLE_PUBLIC_ED_KEY` 注入公钥，并用 `DUMBTRANS_SPARKLE_ED_KEY_FILE` 或 Sparkle 支持的 stdin key 方案提供私钥；不要把私钥写进仓库。\n\n---\n\n## Roadmap\n\n- [x] GitHub Releases 提供签名好的 `.app` 下载，免去源码构建\n- [x] 菜单栏检查更新（Sparkle）\n- [x] 划词翻译（外文 → 中文）浮动面板\n- [x] 稳定本地签名身份，TCC 授权一次永久\n- [ ] 支持更多输出格式：`camelCase` / `PascalCase` / `snake_case`\n- [x] 可自定义快捷键\n- [ ] 可自定义翻译 Prompt / 少样本示例\n- [ ] 历史记录 + 一键复用\n\n欢迎开 issue 提想法。\n\n---\n\n## 免费版与 Pro\n\n| | 免费版 | Pro（$14.99 一次买断） |\n|---|---|---|\n| 快捷键与三种翻译风格 | ✓ 全部 | ✓ 全部 |\n| AI 服务商 | OpenAI、智谱 GLM | 全部 8 家 + 自定义 endpoint |\n| 每日翻译次数 | 30 次 | 不限 |\n\nPro license 在 [官网](https://uxwangy-code.github.io/DumbTransPro/) 购买，购买后在 设置 → Pro 输入 License Key 激活。license 离线可用，验证由 Gumroad 托管，app 本身不收集任何数据。\n\n## License\n\n[Source-Available](./LICENSE) © 2026 WhimsyCode (Thirty)\n\n代码公开，欢迎阅读、学习、提 PR；个人可自行编译在自己的设备上使用。不允许分发二进制或商用。v1.2.3 及更早版本仍为 MIT。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuxwangy-code%2Fdumbtranspro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuxwangy-code%2Fdumbtranspro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuxwangy-code%2Fdumbtranspro/lists"}