Skip to content

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

@appergb

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions