Skip to content

feat: 引入语言包系统,支持 English 等多语言切换 #40

Description

@appergb

背景

目前 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.tsxSettingsModal.tsxWindowChrome.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
  • 命名空间按页面拆分(overviewsettingscapsule …)避免单文件过大
  • 后端:Rust 侧维护一个轻量 key 表,在创建托盘菜单前由前端通过 IPC 把当前 locale 推过去
  • 设置页新增「语言 / Language」下拉,热切换通过 i18n 实例 changeLanguage() 实现

验收标准

  • 切换到 English 后,主窗口(Overview / History / Vocab / Style / Settings)、胶囊、托盘菜单、设置弹窗、Onboarding 全部为英文,无中文残留
  • 切换到简体中文后行为不退化,与当前版本视觉一致
  • 首次启动在 macOS 系统语言为英文时默认进入 English
  • 切换语言无需重启 app
  • preferences.json 中保存 locale 字段,下次启动沿用
  • dictionary.json / history.json 等用户数据被翻译或迁移(保持原样)

非目标(先不做)

  • 翻译用户生成内容(历史记录、词汇表)
  • RTL 语言(阿拉伯语 / 希伯来语)支持
  • Polish prompt 多语言适配(LLM 可跨语种处理用户内容,暂不动)
  • 旧版 Swift 应用的本地化

参考

  • 现有 zh-CN 字符串密度示例:src/pages/Settings.tsx 含 8+ 处直写中文
  • 目录结构:docs/openless-development.mddocs/openless-overall-logic.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions