Files
awoooi/docs/design/I18N_STRUCTURE.md
OG T 7478dc0254 feat(phase6-9): Complete modular architecture and Agent Teams
Phase 6.4 - Modular Architecture:
- Add lewooogo-brain adapters for LLM providers
- Add lewooogo-data dual memory (Redis + PostgreSQL)
- Implement consensus engine for multi-agent decisions
- Add incident memory service for historical context

Phase 9 - Agent Teams (Claude Agent SDK):
- Add base agent class with Claude Sonnet 4 integration
- Implement action planner, blast radius, and security agents
- Add agent API endpoints and proposal workflow
- Integrate ADR-009 OpenClaw Agent Teams architecture

DevOps & CI/CD:
- Add GitHub Actions CI/CD workflows (ci.yaml, cd.yaml)
- Add pre-commit hooks and secrets baseline
- Add docker-compose for local development
- Update Kubernetes network policies

Frontend Improvements:
- Add auto-healing error boundary component
- Update i18n messages for agent features
- Enhance dual-state incident card with execution feedback

Documentation:
- Add 7 ADRs covering MCP, design system, architecture decisions
- Update ARCHITECTURE_MEMORY.md with modular design
- Add GLOBAL_RULES.md and SOUL.md for project identity

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-23 18:40:36 +08:00

9.8 KiB
Raw Permalink Blame History

AWOOOI i18n 字典檔結構規範

版本: v1.0 建立日期: 2026-03-20 負責人: CPO 框架: next-intl


概述

🎯 顧問深度討論 #4: 語意化 Key 命名學

此文件定義 AWOOOI 國際化字典檔的結構規範,採用語意化樹狀命名, 確保 500+ 個翻譯項目在工程師與翻譯員之間有明確的上下文。


命名規範

Key 命名格式

[頁面].[組件].[元素]_[動作/狀態]

正確與錯誤範例

// ❌ 錯誤: 無上下文,容易混淆
{
  "approve": "批准",
  "cancel": "取消",
  "error": "發生錯誤",
  "warning": "警告"
}

// ✅ 正確: 語意化命名,清楚上下文
{
  "dashboard": {
    "approval_card": {
      "btn_approve": "批准執行",
      "btn_reject": "拒絕",
      "btn_request_info": "詢問更多",
      "label_blast_radius": "爆炸半徑",
      "status_pending": "等待簽核",
      "status_approved": "已批准"
    }
  }
}

字典檔結構

目錄結構

apps/web/messages/
├── zh-TW.json    # 繁體中文 (主要)
└── en.json       # English

頂層分類

{
  "common": {},       // 共用元素 (按鈕、狀態、錯誤)
  "layout": {},       // 佈局元素 (導航、側邊欄、頁尾)
  "dashboard": {},    // 戰情室頁面
  "monitor": {},      // 監控模組
  "security": {},     // 安全模組
  "deploy": {},       // 部署模組
  "tickets": {},      // 工單模組
  "billing": {},      // 帳單模組
  "settings": {},     // 設定模組
  "ai_copilot": {},   // AI 助手
  "errors": {},       // 錯誤訊息
  "validation": {}    // 表單驗證
}

完整字典檔範本

zh-TW.json

{
  "common": {
    "btn": {
      "save": "儲存",
      "cancel": "取消",
      "confirm": "確認",
      "delete": "刪除",
      "edit": "編輯",
      "view": "查看",
      "back": "返回",
      "next": "下一步",
      "previous": "上一步",
      "submit": "送出",
      "reset": "重設",
      "search": "搜尋",
      "filter": "篩選",
      "export": "匯出",
      "import": "匯入",
      "refresh": "重新整理"
    },
    "status": {
      "loading": "載入中...",
      "success": "成功",
      "error": "失敗",
      "pending": "處理中",
      "active": "啟用",
      "inactive": "停用",
      "healthy": "健康",
      "warning": "警告",
      "critical": "嚴重",
      "unknown": "未知"
    },
    "time": {
      "just_now": "剛剛",
      "minutes_ago": "{count} 分鐘前",
      "hours_ago": "{count} 小時前",
      "days_ago": "{count} 天前",
      "today": "今天",
      "yesterday": "昨天"
    },
    "pagination": {
      "page": "第 {current} 頁,共 {total} 頁",
      "showing": "顯示 {from}-{to},共 {total} 筆",
      "per_page": "每頁顯示"
    }
  },

  "layout": {
    "nav": {
      "dashboard": "戰情室",
      "monitor": "監控",
      "security": "安全",
      "deploy": "部署",
      "tickets": "工單",
      "billing": "帳單",
      "settings": "設定"
    },
    "sidebar": {
      "collapse": "收合側邊欄",
      "expand": "展開側邊欄"
    },
    "header": {
      "search_placeholder": "搜尋... (⌘K)",
      "notifications": "通知",
      "profile": "個人檔案",
      "logout": "登出"
    },
    "footer": {
      "copyright": "© {year} 岑洋國際行銷有限公司",
      "version": "版本 {version}"
    }
  },

  "dashboard": {
    "page_title": "戰情室",
    "page_description": "系統健康狀態總覽",

    "host_card": {
      "title": "主機狀態",
      "label_ip": "IP 位址",
      "label_role": "角色",
      "label_cpu": "CPU",
      "label_memory": "記憶體",
      "label_disk": "磁碟",
      "label_last_seen": "最後更新",
      "status_online": "上線",
      "status_offline": "離線"
    },

    "alert_panel": {
      "title": "即時告警",
      "btn_acknowledge": "確認",
      "btn_view_all": "查看全部",
      "empty_state": "目前沒有告警",
      "severity_info": "資訊",
      "severity_warning": "警告",
      "severity_critical": "嚴重"
    },

    "approval_card": {
      "title": "待簽核項目",
      "btn_approve": "批准執行",
      "btn_reject": "拒絕",
      "btn_request_info": "詢問更多",
      "label_requester": "申請人",
      "label_blast_radius": "爆炸半徑",
      "label_signatures": "簽核進度",
      "label_expires_in": "剩餘時間",
      "label_ai_summary": "AI 摘要",
      "label_confidence": "信心度",
      "status_pending": "等待簽核",
      "status_approved": "已批准",
      "status_rejected": "已拒絕",
      "status_expired": "已過期",
      "blast_low": "低",
      "blast_medium": "中",
      "blast_high": "高",
      "blast_critical": "嚴重"
    },

    "metrics": {
      "total_hosts": "主機總數",
      "active_alerts": "活躍告警",
      "pending_approvals": "待簽核",
      "deployments_today": "今日部署"
    }
  },

  "ai_copilot": {
    "title": "AI 助手",
    "placeholder": "輸入問題或指令...",
    "btn_send": "送出",
    "btn_stop": "停止",
    "btn_clear": "清除對話",
    "thinking": "AI 思考中...",
    "error_offline": "AI 服務暫時不可用",
    "error_timeout": "回應超時,請重試",
    "suggestion_prefix": "建議",
    "action_prefix": "建議執行",
    "warning_destructive": "此操作具有破壞性,請謹慎執行"
  },

  "command_palette": {
    "placeholder": "輸入指令...",
    "category_navigation": "導航",
    "category_action": "操作",
    "category_ai": "AI 功能",
    "category_settings": "設定",
    "no_results": "沒有符合的結果",
    "hint_shortcut": "快捷鍵"
  },

  "errors": {
    "generic": "發生錯誤,請稍後再試",
    "network": "網路連線失敗",
    "unauthorized": "您沒有權限執行此操作",
    "not_found": "找不到請求的資源",
    "validation": "輸入資料驗證失敗",
    "server": "伺服器錯誤",
    "timeout": "請求超時",
    "rate_limited": "請求過於頻繁,請稍後再試"
  },

  "validation": {
    "required": "此欄位為必填",
    "email": "請輸入有效的電子郵件",
    "min_length": "至少需要 {min} 個字元",
    "max_length": "最多 {max} 個字元",
    "pattern": "格式不正確"
  }
}

en.json

{
  "common": {
    "btn": {
      "save": "Save",
      "cancel": "Cancel",
      "confirm": "Confirm",
      "delete": "Delete",
      "edit": "Edit",
      "view": "View",
      "back": "Back",
      "next": "Next",
      "previous": "Previous",
      "submit": "Submit",
      "reset": "Reset",
      "search": "Search",
      "filter": "Filter",
      "export": "Export",
      "import": "Import",
      "refresh": "Refresh"
    },
    "status": {
      "loading": "Loading...",
      "success": "Success",
      "error": "Failed",
      "pending": "Processing",
      "active": "Active",
      "inactive": "Inactive",
      "healthy": "Healthy",
      "warning": "Warning",
      "critical": "Critical",
      "unknown": "Unknown"
    }
  },

  "dashboard": {
    "page_title": "War Room",
    "page_description": "System Health Overview",

    "approval_card": {
      "title": "Pending Approvals",
      "btn_approve": "Approve",
      "btn_reject": "Reject",
      "btn_request_info": "Request Info",
      "label_blast_radius": "Blast Radius",
      "label_signatures": "Signatures",
      "status_pending": "Pending"
    }
  },

  "ai_copilot": {
    "title": "AI Assistant",
    "placeholder": "Enter a question or command...",
    "thinking": "AI is thinking..."
  },

  "errors": {
    "generic": "An error occurred. Please try again later.",
    "network": "Network connection failed",
    "unauthorized": "You don't have permission to perform this action"
  }
}

使用方式

組件中使用

// apps/web/src/components/ApprovalCard.tsx
import { useTranslations } from 'next-intl';

export function ApprovalCard({ approval }: Props) {
  const t = useTranslations('dashboard.approval_card');

  return (
    <div>
      <h3>{t('title')}</h3>
      <p>{t('label_blast_radius')}: {t(`blast_${approval.blastRadius}`)}</p>
      <button>{t('btn_approve')}</button>
      <button>{t('btn_reject')}</button>
    </div>
  );
}

動態參數

// 使用變數
const t = useTranslations('common.time');
t('minutes_ago', { count: 5 }); // "5 分鐘前"

const t = useTranslations('common.pagination');
t('showing', { from: 1, to: 20, total: 100 }); // "顯示 1-20共 100 筆"

CI 檢查規則

翻譯完整性檢查

// scripts/check-i18n.ts
import zhTW from '../messages/zh-TW.json';
import en from '../messages/en.json';

function getAllKeys(obj: object, prefix = ''): string[] {
  return Object.entries(obj).flatMap(([key, value]) => {
    const fullKey = prefix ? `${prefix}.${key}` : key;
    return typeof value === 'object'
      ? getAllKeys(value, fullKey)
      : [fullKey];
  });
}

const zhKeys = new Set(getAllKeys(zhTW));
const enKeys = new Set(getAllKeys(en));

const missingInEn = [...zhKeys].filter(k => !enKeys.has(k));
const missingInZh = [...enKeys].filter(k => !zhKeys.has(k));

if (missingInEn.length > 0) {
  console.error('❌ Missing in en.json:', missingInEn);
  process.exit(1);
}

if (missingInZh.length > 0) {
  console.error('❌ Missing in zh-TW.json:', missingInZh);
  process.exit(1);
}

console.log('✅ All translations are complete');

PR Checklist

## i18n Checklist

- [ ] 新增的 UI 文字已加入 zh-TW.json
- [ ] 新增的 UI 文字已加入 en.json
- [ ] Key 命名遵循 `[頁面].[組件].[元素]` 格式
- [ ] CI i18n 檢查通過

變更記錄

日期 版本 變更 作者
2026-03-20 v1.0 初版建立 CPO

此文件由 CPO 維護,前端開發者新增 UI 文字時必須遵守。