Files
openless/USAGE.md
T
TRIPandbaiqing ecf2b0f6c2 feat: style pack i18n + 差量缓存 + 内置三包升级到 v2 (#460)
* docs(windows): 记录独占全屏游戏下 capsule overlay / hotkey 的 OS 级限制 (#457)

- coordinator.rs: 在 show_capsule_window_no_activate (Windows 路径) 上方加注释,
  说明 SetWindowPos(HWND_TOPMOST) 在独占全屏 DirectX/OpenGL 应用之上失效,以及
  UIPI 阻挡 hotkey 的同源现象,避免后续维护者再次尝试用户空间 workaround。
- USAGE.md: 给最终用户加 FAQ —— Minecraft 等全屏游戏下应切换到 borderless
  windowed fullscreen,对齐管理员权限,预先打开游戏聊天框。

此次仅文档与注释改动,不修改运行时行为。修复独占全屏 overlay 需要 DirectX
overlay 注入(Discord / MSI Afterburner 路线),工程量与风险都不在 surgical
修复范围。

* feat: style pack i18n + 差量缓存 + 内置三包升级到 v2

i18n(5 个 locale 全覆盖)
- 新增 style.pack.* 命名空间(~70 keys)覆盖 Style 页面所有 UI 文案。
- 扩展 marketplace.* 命名空间(~50 keys,含 myPacks/upload/oauth/state/modal/derivativeBadge/sortLiked/likedEmpty 等)。
- ja.ts / ko.ts 原本完全缺失 marketplace.* —— JP/KR 用户进风格市场会 fallback 看见中文,本次补齐。
- Style.tsx 删除 100+ 行 `isEnglish ? '...' : '...'` 三元 copy 对象,全走 t()。
- Marketplace.tsx + MarketplaceModal.tsx 把硬编码 '我赞过的'/'我的发布'/'确定上传'/'已下架'/'撤回发布'
  /'审核中'/'已上架'/'未通过'/'未登录'/'衍生自' 等 30+ 处全走 t(),含 statusLabel(state, t) 重构。

差量缓存(src/lib/ipc.ts + Marketplace.tsx)
- list cache 从 sessionStorage 升到 localStorage,跨重启秒呈现,TTL 24h。
- 新增 detail cache:按 (id, version, updatedAt) 三元组缓存 marketplace_detail;
  三元组等价于内容版本签名,version/updatedAt 任一变化即失效重拉。命中 = 0 请求。
- 自动驱逐:写入 list cache 时根据当前三元组集合 prune 不在列表里的 detail 条目
  —— 满足「云端哈希被移除时本机也移除」的语义。
- 安全审计:
  - 包 ID 必须匹配 UUID v4 正则(防 key 注入)。
  - detail.id 必须等于请求 packId(防服务端返回错位内容)。
  - 单条 prompt 长度上限 200KB(防 OOM)。
  - detail 条目上限 64,LRU 淘汰(防 localStorage 配额耗尽)。
- openDetail 先查本机三元组缓存,命中即渲染 + 跳过网络;未命中再走 IPC + 校验回写。

内置 style pack 升级到 v2.0(types.rs + polish.rs tests)
- 「轻度润色」「清晰结构」「正式表达」三个 builtin pack 整体替换为社区维护的 PRO v2 prompt
  (含独立角色 + {{HOTWORDS}} + 七/八节中文序号骨架 + 高密度示例 + ASR 纠错词表)。
- default_style_system_prompt_for_mode 对这三个 mode 早返回各自的 BUILTIN_PROMPT,
  跳过标准 ROLE_BLOCK + COMMON_RULES + OUTPUT_BLOCK wrapper,避免与 v2 内同名段落重复。
- StylePack literal 同步:name 保留中文短名(去掉 PRO 后缀),version → 2.0.0,
  description/examples/tags 同步 manifest。
- 老用户磁盘已有的 builtin pack 不会被自动覆盖(persistence migration 只填空字段,
  保护用户对内置包的编辑);要应用 v2 需在「风格」页面点一次「重置」;新装用户直接拿 v2。
- polish.rs 的 4 处依赖旧 heading 的断言更新为 v2 实际锚点;
  common_rules_include_auto_correction_and_natural_organization 拆为
  Raw(走 wrapper)+ Light/Structured/Formal(走 v2 PRO 自带 ASR 纠错段)两组。

后端服务(apic.openless.top)这次没动。

* feat: 英文翻译注入 EN 专用指引 + 修「我的发布」加载/计数/驱逐

英文翻译加专用补丁
- translate_system_prompt 检测 target_language == English(含 '美式英文' / '英文' / 'english'
  / 'British English' 等别名)时,在基础 prompt 末尾拼一段 EN 专用指引:
    · ASR 纠错优先策略(高/中/低置信度分级)
    · 中→英技术词规范化表(令牌→Token / 密钥→Secret Key / 应用ID→App ID /
      鉴权失败→authentication failure / 调用接口→call the API …)
    · 模型名 / 产品名还原(克劳德→Claude、双子座→Gemini、卡布奇诺→Cappuccino …)
    · 自然英文要求(idiomatic、avoid Chinglish、code/URL/版本号原样保留)
- 其它语言行为不变。
- 来源:社区贡献的「重写为英文」prompt,精简后避免与 base 重复。
- 新增 translate_prompt_appends_en_extras_only_for_english 单测覆盖 happy path + 别名 + 非英文。

修「我的发布」三个 bug
1. 数据拉取态:新增 myPacksLoading / myPacksError 状态机。
   原行为:拉取中显示「你还没有发布过风格包」,失败只弹 toast;用户分不清"empty"和"loading"。
   现行为:四态优先级 loading → error → empty → list;loading 显示「正在拉取,请稍后…」;
   error 单独成块带「重试」按钮(inline 比 toast 更稳定可达)。
2. 计数错位:visibleMyPacks 立即过滤 withdrawn / superseded(移除原 5 分钟可见窗口)。
   原 bug:发布 1 个删 1 个后,刚下架的那个还在 5 分钟窗口内 → 计数显示 2,跟实际不符。
   下架的反馈走 actionMsg toast 即可,不需要在列表里继续占位。
3. 计数源切换:'已发布 N 个'里的 N 改用 visibleMyPacks.length(active 包),
   跟列表里实际看到的卡片数对得上。pending 计数同样基于 visible。
4. 顺手清理:刷新按钮在 myPacksLoading=true 时 disabled,避免并发请求;
   删掉只为旧 5 分钟窗口存在的 nowTick / setInterval 状态与 effect。

i18n(5 个 locale):marketplace.myPacks 新增 loadingTitle / loadingHint /
loadErrorTitle / loadErrorRetry 四个 key。

* refactor(translate): EN 目标整段切到专用 prompt(不再走 append)

上一版是「通用 base + 末尾追加 EN 专用补丁」,两段重复 / 注意力被稀释。这版改为:
- target_language 命中 English 时(含 '美式英文' / '英文' / 'english' / 'British English' 别名)
  → translate_system_prompt 直接 return 新增的 EN_TRANSLATE_SYSTEM_PROMPT 整段,不再拼通用 base。
- 其它语言行为不变(继续走原通用 # 任务(翻译输出) base)。

新 EN_TRANSLATE_SYSTEM_PROMPT 自包含、~60 行精简版(来源:社区「重写为英文」prompt):
  · 角色 + 输入是 ASR 不可靠 + 任务定义(先纠错再翻译,结果直插光标)
  · 工作流程 6 步(不可换顺序)
  · ASR 纠错按高/中/低置信度分级
  · 中→英技术术语规范化表(Token / Secret Key / App ID / Access Token / Endpoint /
    Webhook / authentication failure / call the API / quota / front-end / back-end /
    Claude / Gemini / Cappuccino / Coder / LongCat …)
  · 翻译要求:自然 idiomatic、不要 Chinglish、保持原语气、英语写法的日期数字
  · 原样保留:代码标识符 / 命令 / 路径 / env vars / 布尔值 / 完整版本号 /
    大写缩略语(API SDK JWT OAuth …)/ 人名地名品牌名
  · 边界 case + 5 条禁止 + 输出约束

替换 translate_prompt_appends_en_extras_only_for_english 单测为
translate_prompt_swaps_to_en_dedicated_when_target_is_english:断言
- 英文目标命中 EN 专用 prompt("# 任务(中文转写 → 英文翻译)"),不再含通用 base 标题
- 非英文目标仍走通用 base
- 别名 '美式英文' / '英文' / 'english' / 'British English' 都解析为英文

cargo test 269 / 0 / 0;tsc clean。

---------

Co-authored-by: baiqing <lbx12309@icloud.com>
2026-05-17 09:45:28 +08:00

141 lines
5.1 KiB
Markdown
Raw 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.
# OpenLess 使用指南
## 安装
### macOS
1. 从 [Releases](https://github.com/appergb/openless/releases/latest) 下载 `OpenLess_<版本>_aarch64.dmg`。
2. 打开 dmg,将 OpenLess.app 拖入「应用程序」文件夹。
3. 双击启动。
### Windows
1. 从 [Releases](https://github.com/appergb/openless/releases/latest) 下载 `OpenLess_<版本>_x64-setup.exe`。
2. 运行安装程序,按提示完成安装。
3. 从开始菜单启动 OpenLess。
---
## 首次配置
### macOS 权限
首次启动后,在「系统设置 → 隐私与安全」中授予以下权限:
1. **麦克风** — 允许 OpenLess 录音。
2. **辅助功能** — 允许 OpenLess 读写当前焦点输入框。授权后须**完全退出并重新启动** OpenLess,快捷键才会生效。
### Windows 权限
1. 按系统提示授予**麦克风**权限。
2. 打开 OpenLess → 「设置 → 权限」,确认全局快捷键监听器状态显示为「已启动」。
### 填入凭据
不会配火山 ASR 的话,先看这篇图文引导:
[OpenLess 火山 ASR 配置](docs/volcengine-setup.md)
打开 OpenLess → **设置**,填入以下字段:
| 字段 | 说明 |
| --- | --- |
| 火山引擎 App ID | 语音识别服务的应用 ID |
| 火山引擎 Access Token | 语音识别访问凭据 |
| 火山引擎 Resource ID | 语音识别资源 ID |
| Ark API Key | 文本润色服务的 API Key |
| Ark Model ID | 使用的模型 ID(如 `doubao-pro-32k`) |
| Ark Endpoint | 接口地址,默认 `https://ark.cn-beijing.volces.com/api/v3/chat/completions` |
保存后设置立即生效,无需重启。
---
## 基本使用
### 开始录音
按下全局快捷键(默认 macOS 右 Option,Windows 右 Control)。
屏幕边缘会出现状态胶囊,显示「录音中」。
### 结束录音
再次按下同一快捷键。OpenLess 会:
1. 停止录音并发送音频进行转写。
2. 对转写结果按当前输出模式进行润色。
3. 将润色后的文字插入当前焦点输入框(失败时自动复制到剪贴板)。
### 取消录音
录音过程中按 `Esc`,当前录音内容会被丢弃,不做任何插入。
---
## 输出模式
在 OpenLess 主窗口的胶囊或「设置」中切换模式:
| 模式 | 说明 |
| --- | --- |
| 原文 | 直接输出转写文字,不做任何修改 |
| 轻度润色 | 修正语气词、标点、明显错字,保留原意 |
| 清晰结构(AI prompt 模式) | 把口语整理成有结构、有约束、有上下文的 prompt,适合直接喂给 ChatGPT / Claude / Cursor |
| 正式表达 | 将口语转换为正式书面语 |
---
## 词典
词典用于提高特定词汇的识别准确率(产品名、人名、专有名词等)。
1. 打开主窗口 → **词典**。
2. 点击「新建」,填入正确拼写、分类和备注。
3. 启用后,词条会作为热词注入 ASR 识别阶段,并在润色阶段辅助语义判断。
---
## 历史记录
主窗口 → **历史**,可查看所有录音记录,包括原始转写和润色结果。
---
## 更换快捷键
主窗口 → **设置 → 快捷键**,选择触发键。
macOS 支持右侧修饰键(Option / Control / Command / Shift);Windows 支持右 Control。
---
## 常见问题
**Q: 快捷键没反应?**
macOS:确认已授予辅助功能权限,且授权后重启过 OpenLess。
Windows:在「设置 → 权限」中检查监听器状态。
**Q: 识别结果为空或是占位文字?**
检查火山引擎 ASR 凭据是否填写正确。填写正确后识别才能正常工作。
**Q: 文字没有插入,只是复制到了剪贴板?**
当目标输入框不支持辅助功能写入时(如某些安全限制的应用),OpenLess 会自动回退到剪贴板复制,手动粘贴即可。
**Q: 在 Windows 玩 Minecraft 等全屏游戏时,OpenLess capsule 不弹出 / 字符无法输入?**
这是 **Windows 操作系统层面的限制**,OpenLess 应用本身无法绕过(详见 [issue #457](https://github.com/Open-Less/openless/issues/457)):
- **独占全屏(exclusive fullscreen)**:标准应用窗口(包括 OpenLess capsule)**不会绘制在独占全屏 DirectX/OpenGL 应用之上**。请把游戏切换到 **无边框窗口化全屏(Borderless Windowed Fullscreen)**。Minecraft:视频设置 → 全屏 关闭(保持窗口最大化即可)。
- **管理员权限不一致(UIPI)**:若游戏以管理员身份运行而 OpenLess 不是,Windows 阻止 OpenLess 接收游戏前台的按键,hotkey 完全不触发。让两者权限对齐(要么都以管理员运行,要么都以普通用户运行)。
- **游戏聊天框未打开**:识别字符通过模拟键盘事件落字。Minecraft 中必须先按 `T` 打开聊天框,OpenLess 的输入才会落到聊天里。
macOS 不存在独占全屏(所有"全屏"都是带 Spaces 的无边框窗口),所以此限制不适用。
**Q: 润色结果和预期不符?**
尝试切换输出模式,或在词典中添加相关专有名词。
---
## 社区与支持
欢迎通过 QQ 加入用户群,反馈问题或交流使用体验:
**QQ 群:1078960553**