背景
原标题"加入繁体输出及更改快捷键"——但与其逐个维护语言列表(简体 / 繁体 / 英文 / 日文…),不如做一个 Claude Code 式的开放设计:用户在设置里用任意自然语言文本描述目标语言,prompt 注入交给 LLM 处理,App 不维护任何语言枚举。
这同时也覆盖 #7 提的"中文语音自动翻译为英文插入"——本 issue 是它的通用版本。
设计
触发方式
录音键 + Shift 组合键。即用户按住快捷键说话时,同时按下 Shift,结束录音后走"翻译输出"管线而不是普通润色管线。
- 单按录音键:原行为(润色 → 插入)
- 录音键 + Shift:翻译输出(按目标语言转换 → 插入)
具体的"是否同时按下 Shift"在 hotkey 边沿事件里捕获 modifier flag 即可。
设置项
Settings → 录音 里加一个文本输入框:
```
翻译目标语言: [ 繁体中文 ]
e.g. English / 日本語 / 繁体中文 / 美式英语 / 学术正式英文
```
字段名:`translationTargetLanguage: string`,默认空字符串(关闭翻译模式 → Shift 组合键无效或回落到普通润色)。
用户填什么就直接拼进 LLM prompt,App 不解析、不查表、不映射。这样:
- "繁体中文" / "Traditional Chinese" / "台湾用语的繁体中文" 都能用
- "美式英语,正式邮件风格" 这种带风格的描述也能用
- 加新语言不需要发版
Prompt 注入
LLM polish 调用增加一个新 mode:`translate`。Prompt 模板大致:
```
你刚收到一段语音转写。请把它翻译成 `{translationTargetLanguage}`,
保持原意和语气,不增不减。直接输出翻译结果,不要任何解释或前缀。
转写:
{transcript}
```
走现有 Ark / OpenAI 兼容通道,复用 `polish.rs` 已有的 chat completions 接口,只是 prompt 不同。
UI 提示
胶囊窗口在翻译模式下顶部显示"翻译 → `{language}`"短标签,跟普通听写区分(同 #7 的 UI 设计)。
实现要点
- `UserPreferences` 增字段 `translation_target_language: String`(默认空)
- `HotkeyMonitor` 在边沿事件里附带 modifier 状态(Shift held 与否)
- `Coordinator::end_session` 根据 modifier 决定走 `PolishMode::*` 还是新的 `PolishMode::Translate`
- `polish.rs` 新增 translate prompt 模板
- 前端 Settings → 录音 加一行输入框 + 简单 placeholder 例子
- 胶囊 UI 增加翻译模式标签
默认 / Fallback
- `translationTargetLanguage` 为空 → Shift 组合不生效,行为等同单按录音键(普通润色)
- LLM 调用失败 → 回落到原始转写直接插入(保持 CLAUDE.md "用户的话不会丢"约定)
Closes
合并并取代 #7(#7 原方案是固定中→英 + 任意双键,本 issue 扩展为通用目标语言 + 固定 Shift 组合键)。
背景
原标题"加入繁体输出及更改快捷键"——但与其逐个维护语言列表(简体 / 繁体 / 英文 / 日文…),不如做一个 Claude Code 式的开放设计:用户在设置里用任意自然语言文本描述目标语言,prompt 注入交给 LLM 处理,App 不维护任何语言枚举。
这同时也覆盖 #7 提的"中文语音自动翻译为英文插入"——本 issue 是它的通用版本。
设计
触发方式
录音键 + Shift 组合键。即用户按住快捷键说话时,同时按下 Shift,结束录音后走"翻译输出"管线而不是普通润色管线。
具体的"是否同时按下 Shift"在 hotkey 边沿事件里捕获 modifier flag 即可。
设置项
Settings → 录音里加一个文本输入框:```
翻译目标语言: [ 繁体中文 ]
e.g. English / 日本語 / 繁体中文 / 美式英语 / 学术正式英文
```
字段名:`translationTargetLanguage: string`,默认空字符串(关闭翻译模式 → Shift 组合键无效或回落到普通润色)。
用户填什么就直接拼进 LLM prompt,App 不解析、不查表、不映射。这样:
Prompt 注入
LLM polish 调用增加一个新 mode:`translate`。Prompt 模板大致:
```
你刚收到一段语音转写。请把它翻译成 `{translationTargetLanguage}`,
保持原意和语气,不增不减。直接输出翻译结果,不要任何解释或前缀。
转写:
{transcript}
```
走现有 Ark / OpenAI 兼容通道,复用 `polish.rs` 已有的 chat completions 接口,只是 prompt 不同。
UI 提示
胶囊窗口在翻译模式下顶部显示"翻译 → `{language}`"短标签,跟普通听写区分(同 #7 的 UI 设计)。
实现要点
默认 / Fallback
Closes
合并并取代 #7(#7 原方案是固定中→英 + 任意双键,本 issue 扩展为通用目标语言 + 固定 Shift 组合键)。