Files
clawpanel/docs/i18n-plan.md
2026-03-12 03:22:57 +08:00

8.0 KiB
Raw Blame History

ClawPanel i18n 国际化方案

本文档是 ClawPanel 多语言国际化的完整技术方案和实施指南。 任何后续会话开始 i18n 工作时,请先阅读本文档。

一、现状评估

  • 硬编码中文行数3508 行(分布在 25+ 个 JS 文件中)
  • 预估翻译字符串数:约 1500+ 个
  • 技术栈:纯 Vanilla JS无 React/VueTauri v2 桌面应用
  • 当前语言:仅中文

文件中文行数分布Top 15

行数 文件 模块
838 assistant.js AI 助手(含内嵌知识库)
312 docker.js Docker 集群管理
243 models.js 模型配置
183 chat.js 实时聊天
156 chat-debug.js 系统诊断
148 openclaw-kb.js 知识库文本
142 setup.js 初始安装引导
136 channels.js 消息渠道
136 main.js 主入口/路由/横幅
120 services.js 服务管理
105 about.js 关于页面
93 cron.js 定时任务
88 dashboard.js 仪表盘
72 extensions.js 扩展工具
68 gateway.js 网关配置

二、技术架构

核心模块:src/lib/i18n.js

// 使用方式
import { t, setLocale, getLocale } from '../lib/i18n.js'

// 简单翻译
t('common.save')           // → "保存" / "Save"
t('common.cancel')         // → "取消" / "Cancel"

// 带参数插值
t('chat.messageCount', { count: 5 })  // → "5 条消息" / "5 messages"

// 嵌套 key
t('dashboard.gateway.running')  // → "运行中" / "Running"

// 切换语言
setLocale('en')  // 存 localStorage触发页面重渲染

语言检测优先级

  1. localStorage 中存储的用户选择 (clawpanel-locale)
  2. 浏览器 navigator.languagezh-CNzh-CNen-USen
  3. 默认值:zh-CN

缺失翻译 fallback

  1. 查找当前语言包
  2. 查找 zh-CN 兜底(中文作为最完整的语言)
  3. 返回 key 本身(如 common.save
  4. 开发模式下 console.warn 提示缺失翻译

三、语言包结构

src/locales/
  zh-CN.json    — 中文简体(默认,最完整)
  en.json       — English
  zh-TW.json    — 中文繁体(未来)
  ja.json       — 日本語(未来)
  ko.json       — 한국어(未来)

JSON 格式规范

按模块/页面分组,使用扁平化嵌套结构:

{
  "common": {
    "save": "保存",
    "cancel": "取消",
    "delete": "删除",
    "confirm": "确定",
    "close": "关闭",
    "loading": "加载中...",
    "error": "错误",
    "success": "成功",
    "warning": "警告",
    "retry": "重试",
    "refresh": "刷新",
    "edit": "编辑",
    "create": "创建",
    "back": "返回",
    "next": "下一步",
    "search": "搜索",
    "copy": "复制",
    "download": "下载",
    "upload": "上传",
    "enable": "启用",
    "disable": "禁用",
    "start": "启动",
    "stop": "停止",
    "restart": "重启",
    "status": "状态",
    "running": "运行中",
    "stopped": "已停止",
    "unknown": "未知",
    "noData": "暂无数据",
    "operationFailed": "操作失败: {error}",
    "confirmDelete": "确定删除 {name}",
    "savedSuccessfully": "已保存"
  },
  "sidebar": {
    "dashboard": "仪表盘",
    "assistant": "晴辰助手",
    "chat": "实时聊天",
    "services": "服务管理",
    "logs": "日志查看",
    "models": "模型配置",
    "agents": "Agent 管理",
    "memory": "记忆文件",
    "channels": "消息渠道",
    "gateway": "网关配置",
    "skills": "Skills 工具",
    "docker": "Docker 集群",
    "cron": "定时任务",
    "extensions": "扩展工具",
    "about": "关于",
    "setup": "初始设置",
    "chatDebug": "系统诊断"
  },
  "dashboard": { ... },
  "chat": { ... },
  "models": { ... },
  ...
}

四、迁移步骤(每个页面)

Step 1: 提取中文字符串

使用正则或手动扫描,将所有中文文本提取到对应的语言包 key 下。

需要翻译的内容

  • UI 文本(按钮文字、标题、描述、提示)
  • toast 消息
  • 错误消息
  • placeholder 文本
  • confirm 对话框文本
  • tooltip 文本

不需要翻译的内容

  • 代码注释(保持中文)
  • console.log 调试信息
  • 技术标识符(如 GatewayAgentOpenClaw
  • API 错误消息(后端返回的)
  • 知识库内容 openclaw-kb.js(这个特殊处理,按语言版本分文件)

Step 2: 替换代码中的硬编码

// Before
toast('保存成功', 'success')

// After
toast(t('common.savedSuccessfully'), 'success')
// Before (HTML 模板)
`<button class="btn">${icon('save', 14)} 保存</button>`

// After
`<button class="btn">${icon('save', 14)} ${t('common.save')}</button>`

Step 3: 编写英文翻译

逐 key 翻译到 en.json

Step 4: 测试

切换语言,检查每个页面的显示是否正常。

五、迁移顺序

第一批(基础 + 框架层,约 80 个字符串)

  1. src/lib/i18n.js — 创建核心模块
  2. src/locales/zh-CN.json — 初始化中文包
  3. src/locales/en.json — 初始化英文包
  4. src/components/sidebar.js — 导航菜单(~20 个)
  5. src/components/modal.js — 公共弹窗(~10 个)
  6. src/components/toast.js — 提示组件
  7. src/pages/about.js — 关于页面 + 语言切换 UI~30 个)

第二批(核心页面,约 250 个字符串)

  1. src/pages/dashboard.js — 仪表盘(~50 个)
  2. src/pages/setup.js — 初始设置(~80 个)
  3. src/pages/chat.js — 实时聊天(~100 个)
  4. src/main.js — 主入口/横幅(~20 个)

第三批(配置页面,约 350 个字符串)

  1. src/pages/models.js — 模型配置(~120 个)
  2. src/pages/channels.js — 消息渠道(~80 个)
  3. src/pages/services.js — 服务管理(~70 个)
  4. src/pages/gateway.js — 网关配置(~40 个)
  5. src/pages/agents.js — Agent 管理(~40 个)

第四批(功能页面,约 250 个字符串)

  1. src/pages/cron.js — 定时任务(~50 个)
  2. src/pages/memory.js — 记忆管理(~30 个)
  3. src/pages/extensions.js — 扩展工具(~40 个)
  4. src/pages/logs.js — 日志查看(~20 个)
  5. src/pages/skills.js — Skills 工具(~60 个)
  6. src/pages/chat-debug.js — 系统诊断(~50 个)

第五批(大型页面 + 特殊处理,约 600 个字符串)

  1. src/pages/docker.js — Docker 管理(~150 个)
  2. src/pages/assistant.js — AI 助手(~400 个,含系统提示词)
  3. src/lib/openclaw-kb.js — 知识库(按语言分文件)
  4. src/lib/error-diagnosis.js — 错误诊断(~30 个)
  5. src/components/engagement.js — 推荐弹窗(~15 个)

第六批(官网 + 文档)

  1. docs/index.html — 官网英文版
  2. README.mdREADME_en.md
  3. CONTRIBUTING.mdCONTRIBUTING_en.md

六、语言切换 UI 设计

位置

  1. 关于页面底部 — 语言选择下拉框
  2. 侧边栏底部 — 语言图标 + 当前语言缩写(如 / EN

交互

  • 选择语言 → 存入 localStorage → 页面自动刷新
  • 首次访问自动检测浏览器语言

七、注意事项

技术品牌词不翻译

以下词保持原样,不翻译:

  • OpenClaw
  • ClawPanel
  • Gateway
  • AgentAgent 管理不翻译为"代理"
  • MCP
  • Skills
  • Docker
  • Tauri

参数插值语法

使用 {param} 语法:

{
  "chat.sessions": "{count} sessions",
  "models.providers": "Based on {count} providers"
}

复数形式

英文需要处理复数,但 MVP 阶段可以用简单方式:

{
  "chat.messageCount": "{count} message(s)"
}

Rust 后端

后端错误消息暂不国际化(工作量大且用户较少直接看到),保持中文。

八、验证清单

每批迁移完成后检查:

  • 中文模式下所有功能正常
  • 英文模式下所有功能正常
  • 语言切换后页面正确刷新
  • 没有遗漏的硬编码中文
  • 参数插值正确显示
  • 长英文文本不溢出布局
  • toast/modal/confirm 文本正确