# OpenClaw 国际化 (I18N) 文档

## 概述

OpenClaw 仪表板支持多语言国际化，当前已实现：

- **中文 (zh)** - 默认语言
- **英文 (en)** - 备选语言

## 已汉化文件清单

### 后端文件

| 文件路径 | 汉化内容 |
|---------|---------|
| `src/openclaw/dashboard/app.py` | API 响应消息、警报标题、WebSocket 消息类型 |
| `src/openclaw/dashboard/models.py` | 字段描述（docstrings） |

### 前端文件

| 文件路径 | 汉化内容 |
|---------|---------|
| `src/openclaw/dashboard/templates/index.html` | 页面标题、导航、指标标签、图表标题、表格列头、状态文本 |
| `src/openclaw/dashboard/templates/config.html` | 页面标题、导航、配置项标签、按钮文本、状态消息 |
| `src/openclaw/dashboard/static/config.js` | 加载/保存状态消息、控制台日志、成功/错误提示 |

### 国际化工具

| 文件路径 | 说明 |
|---------|------|
| `src/openclaw/dashboard/i18n.py` | 国际化支持类，提供双语翻译字典 |

## 使用国际化工具

### 基础用法

```python
from openclaw.dashboard.i18n import I18n, t

# 创建实例（默认中文）
i18n = I18n()

# 获取翻译
title = i18n.t("status.agent_bankrupt")  # "代理破产"

# 切换语言
i18n.set_language("en")
title = i18n.t("status.agent_bankrupt")  # "Agent Bankrupt"
```

### 字符串插值

```python
# 支持变量替换
msg = i18n.t("alert.bankruptcy_msg", agent_id="bull_001")
# 中文: "代理 bull_001 已破产！"
# 英文: "Agent bull_001 has gone bankrupt!"
```

### 使用全局快捷函数

```python
from openclaw.dashboard.i18n import t, set_language

# 使用默认实例
text = t("metrics.system_equity")  # "系统权益"

# 切换全局语言
set_language("en")
text = t("metrics.system_equity")  # "System Equity"
```

## 翻译键值参考

### 状态消息 (`status`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `status.agent_bankrupt` | 代理破产 | Agent Bankrupt |
| `status.large_loss_detected` | 检测到重大损失 | Large Loss Detected |
| `status.config_saved` | 配置已保存 | Configuration Saved |
| `status.loading_config` | 正在加载配置... | Loading Configuration... |
| `status.confirm` | 已确认 | Confirmed |
| `status.not_found` | 未找到 | Not Found |
| `status.realtime` | 实时 | Realtime |
| `status.disconnected` | 已断开 | Disconnected |

### 导航 (`nav`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `nav.dashboard` | 仪表盘 | Dashboard |
| `nav.config` | 配置 | Configuration |
| `nav.overview` | 总览 | Overview |

### 指标 (`metrics`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `metrics.system_equity` | 系统权益 | System Equity |
| `metrics.total_pnl` | 总盈亏 | Total P&L |
| `metrics.active_agents` | 活跃 Agent | Active Agents |
| `metrics.total_trades` | 总交易数 | Total Trades |
| `metrics.avg_win_rate` | 平均胜率 | Avg Win Rate |

### 代理状态 (`agent`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `agent.status` | 状态 | Status |
| `agent.balance` | 余额 | Balance |
| `agent.win_rate` | 胜率 | Win Rate |
| `agent.trades` | 交易数 | Trades |
| `agent.thriving` | 🚀 繁荣 | 🚀 Thriving |
| `agent.stable` | 💪 稳定 | 💪 Stable |
| `agent.struggling` | ⚠️ 困难 | ⚠️ Struggling |
| `agent.critical` | 🔴 危急 | 🔴 Critical |
| `agent.bankrupt` | 💀 破产 | 💀 Bankrupt |

### 交易 (`trade`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `trade.recent_trades` | 最近交易 | Recent Trades |
| `trade.time` | 时间 | Time |
| `trade.symbol` | 交易对 | Symbol |
| `trade.side` | 方向 | Side |
| `trade.buy` | 买入 | BUY |
| `trade.sell` | 卖出 | SELL |
| `trade.pnl` | 盈亏 | P&L |

### 警报 (`alert`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `alert.title` | 警报 | Alert |
| `alert.critical` | 严重 | Critical |
| `alert.error` | 错误 | Error |
| `alert.warning` | 警告 | Warning |
| `alert.info` | 信息 | Info |
| `alert.bankruptcy_title` | 代理破产 | Agent Bankrupt |
| `alert.bankruptcy_msg` | 代理 {agent_id} 已破产！ | Agent {agent_id} has gone bankrupt! |
| `alert.large_loss_title` | 检测到重大损失 | Large Loss Detected |
| `alert.large_loss_msg` | 代理 {agent_id} 遭受重大损失: ${pnl:.2f} | Agent {agent_id} suffered large loss: ${pnl:.2f} |

### 配置 (`config`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `config.title` | 配置管理 | Configuration Management |
| `config.save` | 保存配置 | Save Configuration |
| `config.reset` | 重置 | Reset |
| `config.saving` | 保存中... | Saving... |
| `config.initial_capital` | 初始资金 | Initial Capital |
| `config.cost_structure` | 成本结构 | Cost Structure |
| `config.thresholds` | 生存阈值 | Survival Thresholds |
| `config.simulation` | 模拟设置 | Simulation Settings |
| `config.llm_providers` | LLM 提供商 | LLM Providers |

### WebSocket 消息 (`ws`)

| 键值 | 中文 | 英文 |
|-----|------|------|
| `ws.status_update` | 状态更新 | Status Update |
| `ws.initial_state` | 初始状态 | Initial State |
| `ws.agent_update` | 代理更新 | Agent Update |
| `ws.trade_update` | 交易更新 | Trade Update |
| `ws.alert` | 警报 | Alert |

## 添加新语言

要添加新语言（如日语），请按以下步骤操作：

### 1. 更新 Language 枚举

```python
# 在 i18n.py 中的 Language 类添加
class Language(str, Enum):
    CHINESE = "zh"
    ENGLISH = "en"
    JAPANESE = "jp"  # 新增
```

### 2. 添加翻译字典

```python
# 在 _translations 字典中添加
"jp": {
    "status": {
        "agent_bankrupt": "エージェント破産",
        "config_saved": "設定を保存しました",
        # ... 更多翻译
    },
    # ... 其他分类
}
```

### 3. 更新 get_available_languages 方法

```python
def get_available_languages(self) -> Dict[str, str]:
    return {
        "zh": "中文",
        "en": "English",
        "jp": "日本語",  # 新增
    }
```

### 4. 添加语言切换功能（前端）

如需前端语言切换，可添加 API 端点：

```python
@app.post("/api/language/{lang}")
async def set_language_endpoint(lang: str) -> Dict[str, str]:
    """切换仪表板语言。"""
    try:
        i18n.set_language(lang)
        return {"status": "success", "message": f"Language set to {lang}"}
    except ValueError as e:
        return {"status": "error", "message": str(e)}
```

## 扩展现有翻译

添加新的翻译键值：

```python
from openclaw.dashboard.i18n import I18n

i18n = I18n()

# 添加中文翻译
i18n.add_translation("zh", "new.category.key", "新的值")

# 添加英文翻译
i18n.add_translation("en", "new.category.key", "New Value")

# 使用新键值
text = i18n.t("new.category.key")
```

## 最佳实践

1. **键名规范**
   - 使用小写字母和下划线
   - 采用 `分类.子分类.键名` 的层级结构
   - 例如：`status.agent_bankrupt`, `trade.recent_trades`

2. **变量插值**
   - 使用 `{variable}` 语法
   - 确保所有语言版本包含相同的变量名
   - 示例：`"agent {agent_id} 已破产"`, `"Agent {agent_id} has gone bankrupt"`

3. **语言回退**
   - 如果当前语言缺少翻译，自动回退到中文
   - 确保中文翻译完整作为基准

4. **前端集成**
   - 前端可直接通过 API 获取翻译
   - 考虑将语言偏好存储在本地存储或用户配置中

## 集成示例

### FastAPI 集成

```python
from fastapi import FastAPI
from openclaw.dashboard.i18n import I18n

app = FastAPI()
i18n = I18n()

@app.get("/api/translations")
async def get_translations(lang: str = "zh"):
    """获取指定语言的完整翻译字典。"""
    i18n.set_language(lang)
    return i18n.get_all_translations()

@app.get("/api/translate/{key}")
async def translate(key: str, lang: str = "zh"):
    """翻译单个键值。"""
    i18n.set_language(lang)
    return {"key": key, "translation": i18n.t(key)}
```

### WebSocket 消息汉化

```python
# app.py 中使用示例
from openclaw.dashboard.i18n import t

# 使用国际化消息
alert = AlertMessage(
    alert_type=AlertType.BANKRUPTCY,
    level=AlertLevel.CRITICAL,
    title=t("alert.bankruptcy_title"),
    message=t("alert.bankruptcy_msg", agent_id=agent.agent_id),
)
```

---

## 更新日志

### 2024-02-25
- ✅ 创建 i18n.py 国际化工具类
- ✅ 完成 index.html 汉化
- ✅ 完成 config.html 汉化
- ✅ 完成 config.js 汉化
- ✅ 完成 app.py API 消息汉化
- ✅ 创建本文档

### 待办事项
- [ ] 添加前端语言切换 UI
- [ ] 添加更多语言支持（日语、韩语等）
- [ ] 将翻译持久化到配置文件
- [ ] 支持用户个性化语言设置
