Cavalry Language Switcher for Cavalry 2.7.2 patch 3
Cavalry Language Switcher
Cavalry Language Switcher 是一个面向 Cavalry 2.7.2 的 macOS 语言切换工具。它可以把本机已安装的 Cavalry 在 English、简体中文、繁體中文、日本語之间切换,并继续从原来的 Cavalry.app 启动。
它会处理两类翻译表面:Cavalry 的 JSON 资源文件,以及内置在 Qt/UI 二进制里的菜单、面板、按钮和控件文字。应用语言时,工具会 patch 本地 Cavalry app bundle,安装 runtime injector,重新签名,并清理 Gatekeeper quarantine。
Cavalry Language Switcher 是独立社区工具,不隶属于 Scene Group、Cavalry 或 Canva。
p3 更新内容
p3 重写了运行时翻译热路径与 Apply/签名流水线。目标不是用翻译可靠性换速度,而是消除普通交互和重复 Apply 中本来就不该发生的全局扫描、磁盘写入、资源复制与全量重签。
性能结果
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 交互阶段最大 timer jitter¹ | 87.893 ms | 0.299 ms | 降低 99.7% |
| 启动阶段最大 timer jitter¹ | 246.537 ms | 171.968 ms | 降低 30.2% |
交互 user CPU¹ |
1.350 s | 0.500 s | 降低 63.0% |
| 普通运行 inventory 导出¹ | 47 次 | 0 次 | 完全消除 |
| 常见签名阶段² | 6.28 s | 0.22–0.31 s | 约快 20–29 倍 |
| Injector 体积 | 2,646,208 B | 2,337,536 B | 缩小 11.7% |
真实 Cavalry 副本的完整 Apply 约为 1.59–1.82 秒。其中仍保留 codesign --verify --deep --strict,签名完整性验证本身约占 1.4 秒,这是有意保留的安全成本。
¹ 同机 Qt 夹具:1000 个 QLabel、10 次点击、两轮平均。
² 日常变更只签实际变化的代码;任何快路径签名或验签失败都会自动进入全量 repair fallback。
Runtime Injector
- 普通运行不再为点击、
Show、ChildAdded等事件扫描全部 widget,也不再反复生成 session UUID 或写 inventory;只有显式 capture session 才允许导出。 - 运行时刷新从全局遍历收敛为 dirty object、直接子控件与 item model 局部补译;菜单仍在
aboutToShow、ActionAdded、Show首次绘制前同步翻译。 (context, source)精确翻译查找从约 4,400 条线性扫描改为QHash索引,同时保留生成表原有的 first-match-wins 语义。- QLabel/QLineEdit 使用文本 fingerprint 避免重复写回;正则静态复用,dirty queue 批量处理。
- Injector 构建启用
-O2,最终 universal dylib 缩小 11.7%。 - 发布 dylib 使用
@loader_path解析 Cavalry 自带 Qt,不再把构建机 SDK 写入 runtime RPATH,避免双 Qt 导致的启动崩溃。
Apply 与签名
extract_english、apply_language从 Tauri 主线程移入阻塞任务,切换语言时窗口不再被文件操作与签名工作卡住。- extract、apply、restart 共用进程内
AtomicBool和跨进程 macOSflock;两个切换器不能同时修改或重启同一个 Cavalry 安装。 - staging 按文件内容和 mode 跳过无变化资源,避免重复复制。
- 旧路径一次 Apply 至少会启动约 189 个
codesign子进程;现在只签实际变化的 Injector、ExtensionLayer 和外层 app。 - 无变化 Apply 仍执行 deep/strict 验签;发现损坏 seal、快路径签名失败或验签失败时,自动回退到按 canonical path 与 inode 去重的完整 nested repair。
- Keychain patch 直接消费 owned buffer,移除了约 46.5MB 的无意义 dylib 内存复制。
功能与兼容性验证
- 对比优化前后 12,994 个
(context, source)exact keys:0 mismatch。 - 对比 71 个 normalized-source 冲突 key:0 mismatch。
- 简体中文、繁體中文、日本語均完成真实 Cavalry 2.7.2 进程注入,首屏菜单哨兵与
live-injectorinventory 正常。 - APFS 副本完成三语 Apply、重复 Apply、English 恢复,并全部通过
codesign --verify --deep --strict。 - 发布候选通过 121/121 Node contracts、24 个 Rust unit tests、38 个 Rust integration tests、Tauri app/DMG 构建、packaged checks、DMG layout 与真实 packaged window 回归。
- 测试没有覆盖或修改用户真实的
/Applications/Cavalry.app;关键文件前后快照保持一致。
下载
macOS
macOS 首次打开
当前 DMG 使用 ad-hoc 签名,尚未经过 Apple Developer ID notarization。如果从浏览器下载后,macOS 提示 "Apple could not verify Cavalry Language Switcher is free of malware",请先把应用拖入 Applications,然后运行:
xattr -dr com.apple.quarantine "/Applications/Cavalry Language Switcher.app"
open "/Applications/Cavalry Language Switcher.app"开发者也可以按仓库内的 LOCAL_BUILD_SOP.md 从源码本地构建;本地构建产物不会携带浏览器下载写入的 quarantine 标记。
可把这段话发给你的 AI agent:
请从源码本地构建 Cavalry Language Switcher:
1. 打开仓库 /Users/luo/Desktop/ClaudeCode/web/Cavalry-i18n。
2. 严格按照 LOCAL_BUILD_SOP.md 执行。
3. 运行标准 Tauri build、执行 DMG 卷宗图标盖章,并运行 SOP 里的 packaged checks。
4. 完成后告诉我最终 DMG 路径。
支持语言
- English
- 简体中文
- 繁體中文
- 日本語
使用前须知
- 当前 release 尚未经过 Apple Developer ID notarization;浏览器下载后首次打开可能需要手动清除 quarantine。
- 首次应用语言包时,macOS 可能要求授予 App Management 权限。
- 建议保留一份干净的 Cavalry 安装包或备份;恢复到完全原始状态时,重新安装 Cavalry 是最稳妥的方式。
- 当前 release 同时发布 macOS Apple Silicon 与 Intel 两个版本,请按芯片类型下载对应 DMG。
日本語
Cavalry Language Switcher は、Cavalry 2.7.2 向けの macOS 用言語切り替えツールです。インストール済みの Cavalry を English、簡体字中国語、繁体字中国語、日本語の間で切り替えられます。
初回適用時に macOS の App Management 権限が求められる場合があります。完全に元の状態へ戻すには、Cavalry を再インストールするのが最も安全です。
English
Cavalry Language Switcher is an independent community tool for switching the UI language of Cavalry 2.7.2 on macOS. It is not affiliated with Scene Group, Cavalry, or Canva.