背景
目前 OpenLess 全部用户可见字符串硬编码为简体中文(参见 CLAUDE.md:"Comments, log messages, user-facing strings, and most docs are in Simplified Chinese")。要服务非中文用户、并为后续语言扩展打底,需要引入 i18n 基础设施 + 至少一份英文语言包。
目标
- 统一的语言包机制:所有用户可见字符串走 key → 翻译查找,不再硬编码
- 至少提供 简体中文(zh-CN) 与 English(en) 两份完整语言包
- 用户可在「设置」页切换语言,无需重启
- 首次启动按系统语言自动选择,未命中则回落到 zh-CN
- 选择持久化到
preferences.json
受影响范围
前端(React/TS,openless -all/app/src/)
components/Capsule.tsx:胶囊各状态文案
components/Onboarding.tsx、SettingsModal.tsx、WindowChrome.tsx
pages/Overview.tsx / History.tsx / Vocab.tsx / Style.tsx / Settings.tsx
- 错误提示、Toast、权限引导文案
后端(Rust,openless -all/app/src-tauri/src/)
- 托盘菜单项(
lib.rs / commands.rs)
- 系统通知、TCC 权限引导
- 错误信息回传给前端时,建议返回 i18n key 而非已翻译字符串,由前端渲染
Swift 旧版
- 不在本 issue 范围内(仅维护 Sparkle 兼容,参见
CLAUDE.md)
建议方案(非强制)
- 前端选型:
react-i18next 或 @lingui/react,JSON 资源文件放 src/locales/{en,zh-CN}.json
- 命名空间按页面拆分(
overview、settings、capsule …)避免单文件过大
- 后端:Rust 侧维护一个轻量 key 表,在创建托盘菜单前由前端通过 IPC 把当前 locale 推过去
- 设置页新增「语言 / Language」下拉,热切换通过 i18n 实例
changeLanguage() 实现
验收标准
非目标(先不做)
- 翻译用户生成内容(历史记录、词汇表)
- RTL 语言(阿拉伯语 / 希伯来语)支持
- Polish prompt 多语言适配(LLM 可跨语种处理用户内容,暂不动)
- 旧版 Swift 应用的本地化
参考
- 现有 zh-CN 字符串密度示例:
src/pages/Settings.tsx 含 8+ 处直写中文
- 目录结构:
docs/openless-development.md、docs/openless-overall-logic.md
背景
目前 OpenLess 全部用户可见字符串硬编码为简体中文(参见
CLAUDE.md:"Comments, log messages, user-facing strings, and most docs are in Simplified Chinese")。要服务非中文用户、并为后续语言扩展打底,需要引入 i18n 基础设施 + 至少一份英文语言包。目标
preferences.json受影响范围
前端(React/TS,
openless -all/app/src/)components/Capsule.tsx:胶囊各状态文案components/Onboarding.tsx、SettingsModal.tsx、WindowChrome.tsxpages/Overview.tsx/History.tsx/Vocab.tsx/Style.tsx/Settings.tsx后端(Rust,
openless -all/app/src-tauri/src/)lib.rs/commands.rs)Swift 旧版
CLAUDE.md)建议方案(非强制)
react-i18next或@lingui/react,JSON 资源文件放src/locales/{en,zh-CN}.jsonoverview、settings、capsule…)避免单文件过大changeLanguage()实现验收标准
preferences.json中保存locale字段,下次启动沿用dictionary.json/history.json等用户数据不被翻译或迁移(保持原样)非目标(先不做)
参考
src/pages/Settings.tsx含 8+ 处直写中文docs/openless-development.md、docs/openless-overall-logic.md