Files

1 line
9.3 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "camel-prince/translateapp", "files": {"PROMPT.md": {"b2ed16c9ba3dcab2d5e4aad3ae3780e782f13358": {"t": 1785746542.042506, "n": 2622, "h": "ada8eabf5ebdccac", "c": "# 项目启动 Prompt — 极简划词翻译工具\n\n## 项目概述\n\n构建一个 macOS 极简划词翻译工具,利用本地已部署的 DeepSeek HTTP 代理(`http://localhost:8765/v1/chat/completions`)实现全局划词翻译。要求能在 **任意应用**(WPS、VS Code、Chrome、Safari、Finder、Terminal 等)中通过全局快捷键触发翻译,并以浮窗形式展示结果。\n\n## 技术架构\n\n- **语言**: Swift + AppKit(原生 macOS,轻量无依赖)\n- **翻译后端**: 本地 DeepSeek 代理 `POST http://localhost:8765/v1/chat/completions`\n- **取词方式**: 模拟 Cmd+C 获取选中文本(通过 Pasteboard),无需 Accessibility API 权限\n- **展示方式**: 无边框悬浮 NSPanel,显示在鼠标附近\n- **交互方式**: 全局快捷键 `Option+D`(可自定义)触发翻译\n\n## API 调用规格\n\n```bash\ncurl -X POST http://localhost:8765/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer sk-placeholder\" \\\n -d '{\n \"model\": \"deepseek-chat\",\n \"messages\": [\n {\"role\": \"system\", \"content\": \"你是一个翻译助手。将用户输入翻译为中文(如果输入是中文则翻译为英文)。只输出翻译结果,不要解释。\"},\n {\"role\": \"user\", \"content\": \"要翻译的文本\"}\n ],\n \"max_tokens\": 2048,\n \"stream\": false\n }'\n```\n\n- Authorization header 中的 key 可以是任意值(代理会覆盖为真实 key)\n- `stream: false` 简化实现,一次性返回结果\n- 响应格式为标准 OpenAI `choices[0].message.content`\n\n## 核心功能需求\n\n### 1. 全局快捷键监听\n- 注册全局热键 `Option+D`\n- 使用 `CGEvent` tap 或 `NSEvent.addGlobalMonitorForEvents` 实现\n- 需要在 Info.plist 声明辅助功能权限(或引导用户授权)\n\n### 2. 获取选中文本\n- 触发快捷键后:\n 1. 保存当前剪贴板内容\n 2. 模拟 `Cmd+C`(使用 CGEvent 模拟按键)\n 3. 短暂延迟(50-100ms)后读取剪贴板\n 4. 恢复原始剪贴板内容\n- 如果剪贴板无变化(未选中文本),不做任何操作\n\n### 3. 翻译请求\n- 检测输入语言:纯 ASCII/拉丁字符 → 翻译为中文;含 CJK 字符 → 翻译为英文\n- 调用本地代理 API,超时 10 秒\n- 支持翻译中显示 loading 状态\n\n### 4. 结果展示浮窗\n- 无标题栏 NSPanel(`NSPanel.StyleMask = [.nonactivatingPanel, .borderless]`)\n- 圆角 + 阴影 + 半透明背景(vibrancy effect)\n- 显示位置:鼠标光标附近(避免超出屏幕)\n- 内容:原文(灰色小字)+ 译文(正常大小)\n- 点击浮窗外任意位置自动关闭\n- 按 Esc 关闭\n- 支持选中译文复制\n\n### 5. 菜单栏图标\n- 状态栏显示一个翻译图标(📖 或自定义 SF Symbol)\n- 右键菜单:「设置快捷键」「退出」\n- 左键单击:无操作或显示最近翻译\n\n## 项目结构\n\n```\ntranslate/\n├── TranslateApp/\n│ ├── AppDelegate.swift # 应用入口,菜单栏图标\n│ ├── HotkeyManager.swift # 全局快捷键注册与监听\n│ ├── TextGrabber.swift # 模拟 Cmd+C 获取选中文本\n│ ├── TranslateService.swift # 调用 DeepSeek API\n│ ├── PopupPanel.swift # 悬浮翻译结果窗口\n│ ├── Assets.xcassets/ # 图标资源\n│ └── Info.plist # 权限声明\n├── TranslateApp.xcodeproj/\n└── README.md\n```\n\n## 非功能需求\n\n- **极简**:无多余功能,启动即用,代码量控制在 500 行以内\n- **低资源占用**:常驻内存 < 20MB,无 Electron/WebView\n- **快速响应**:从按下快捷键到显示结果 < 2 秒(取决于 API 延迟)\n- **无需配置**:硬编码 `localhost:8765`,开箱即用\n- **macOS 13+**:使用现代 Swift 并发(async/await)\n\n## 注意事项\n\n1. 模拟按键需要「辅助功能」权限,首次启动需引导用户在系统设置中授权\n2. 浮窗使用 `.nonactivatingPanel` 确保不抢焦点(用户可以继续在原 App 操作)\n3. 剪贴板操作要做好 save/restore,避免覆盖用户正在使用的剪贴板内容\n4. API 请求失败时显示简短错误提示(如\"翻译服务不可用\")\n5. 应用应作为 LSUIElement(后台应用),不显示 Dock 图标\n\n## 启动指令\n\n请先创建完整的 Xcode 项目结构,实现上述所有功能。优先确保核心流程跑通(快捷键 → 取词 → 翻译 → 浮窗),再美化 UI。\n"}, "c6b0ce6b8f2af04a9fb0801e41beadb73762a778": {"t": 1785765475.1436963, "n": 2622, "h": "ada8eabf5ebdccac", "c": "# 项目启动 Prompt — 极简划词翻译工具\n\n## 项目概述\n\n构建一个 macOS 极简划词翻译工具,利用本地已部署的 DeepSeek HTTP 代理(`http://localhost:8765/v1/chat/completions`)实现全局划词翻译。要求能在 **任意应用**(WPS、VS Code、Chrome、Safari、Finder、Terminal 等)中通过全局快捷键触发翻译,并以浮窗形式展示结果。\n\n## 技术架构\n\n- **语言**: Swift + AppKit(原生 macOS,轻量无依赖)\n- **翻译后端**: 本地 DeepSeek 代理 `POST http://localhost:8765/v1/chat/completions`\n- **取词方式**: 模拟 Cmd+C 获取选中文本(通过 Pasteboard),无需 Accessibility API 权限\n- **展示方式**: 无边框悬浮 NSPanel,显示在鼠标附近\n- **交互方式**: 全局快捷键 `Option+D`(可自定义)触发翻译\n\n## API 调用规格\n\n```bash\ncurl -X POST http://localhost:8765/v1/chat/completions \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer sk-placeholder\" \\\n -d '{\n \"model\": \"deepseek-chat\",\n \"messages\": [\n {\"role\": \"system\", \"content\": \"你是一个翻译助手。将用户输入翻译为中文(如果输入是中文则翻译为英文)。只输出翻译结果,不要解释。\"},\n {\"role\": \"user\", \"content\": \"要翻译的文本\"}\n ],\n \"max_tokens\": 2048,\n \"stream\": false\n }'\n```\n\n- Authorization header 中的 key 可以是任意值(代理会覆盖为真实 key)\n- `stream: false` 简化实现,一次性返回结果\n- 响应格式为标准 OpenAI `choices[0].message.content`\n\n## 核心功能需求\n\n### 1. 全局快捷键监听\n- 注册全局热键 `Option+D`\n- 使用 `CGEvent` tap 或 `NSEvent.addGlobalMonitorForEvents` 实现\n- 需要在 Info.plist 声明辅助功能权限(或引导用户授权)\n\n### 2. 获取选中文本\n- 触发快捷键后:\n 1. 保存当前剪贴板内容\n 2. 模拟 `Cmd+C`(使用 CGEvent 模拟按键)\n 3. 短暂延迟(50-100ms)后读取剪贴板\n 4. 恢复原始剪贴板内容\n- 如果剪贴板无变化(未选中文本),不做任何操作\n\n### 3. 翻译请求\n- 检测输入语言:纯 ASCII/拉丁字符 → 翻译为中文;含 CJK 字符 → 翻译为英文\n- 调用本地代理 API,超时 10 秒\n- 支持翻译中显示 loading 状态\n\n### 4. 结果展示浮窗\n- 无标题栏 NSPanel(`NSPanel.StyleMask = [.nonactivatingPanel, .borderless]`)\n- 圆角 + 阴影 + 半透明背景(vibrancy effect)\n- 显示位置:鼠标光标附近(避免超出屏幕)\n- 内容:原文(灰色小字)+ 译文(正常大小)\n- 点击浮窗外任意位置自动关闭\n- 按 Esc 关闭\n- 支持选中译文复制\n\n### 5. 菜单栏图标\n- 状态栏显示一个翻译图标(📖 或自定义 SF Symbol)\n- 右键菜单:「设置快捷键」「退出」\n- 左键单击:无操作或显示最近翻译\n\n## 项目结构\n\n```\ntranslate/\n├── TranslateApp/\n│ ├── AppDelegate.swift # 应用入口,菜单栏图标\n│ ├── HotkeyManager.swift # 全局快捷键注册与监听\n│ ├── TextGrabber.swift # 模拟 Cmd+C 获取选中文本\n│ ├── TranslateService.swift # 调用 DeepSeek API\n│ ├── PopupPanel.swift # 悬浮翻译结果窗口\n│ ├── Assets.xcassets/ # 图标资源\n│ └── Info.plist # 权限声明\n├── TranslateApp.xcodeproj/\n└── README.md\n```\n\n## 非功能需求\n\n- **极简**:无多余功能,启动即用,代码量控制在 500 行以内\n- **低资源占用**:常驻内存 < 20MB,无 Electron/WebView\n- **快速响应**:从按下快捷键到显示结果 < 2 秒(取决于 API 延迟)\n- **无需配置**:硬编码 `localhost:8765`,开箱即用\n- **macOS 13+**:使用现代 Swift 并发(async/await)\n\n## 注意事项\n\n1. 模拟按键需要「辅助功能」权限,首次启动需引导用户在系统设置中授权\n2. 浮窗使用 `.nonactivatingPanel` 确保不抢焦点(用户可以继续在原 App 操作)\n3. 剪贴板操作要做好 save/restore,避免覆盖用户正在使用的剪贴板内容\n4. API 请求失败时显示简短错误提示(如\"翻译服务不可用\")\n5. 应用应作为 LSUIElement(后台应用),不显示 Dock 图标\n\n## 启动指令\n\n请先创建完整的 Xcode 项目结构,实现上述所有功能。优先确保核心流程跑通(快捷键 → 取词 → 翻译 → 浮窗),再美化 UI。\n"}}}}