---
name: localize
description: "运行本地化工作流：提取字符串、验证本地化就绪状态、检查硬编码文本，并生成可供翻译的字符串表。"
argument-hint: "[scan|extract|validate|status]"
user-invocable: true
allowed-tools: Read, Glob, Grep, Write, Bash
---

当此技能被调用时：

1. **解析子命令**参数：
   - `scan` — 扫描本地化问题（硬编码字符串、缺失键）
   - `extract` — 提取新字符串并生成/更新字符串表
   - `validate` — 验证现有翻译的完整性和格式
   - `status` — 报告整体本地化状态

2. **对于 `scan`**：
   - 搜索 `src/` 中的硬编码面向用户的字符串：
     - UI 代码中未被本地化函数包裹的字符串字面量
     - 应该参数化的拼接字符串
     - 使用位置占位符（`%s`、`%d`）而非命名占位符（`{playerName}`）的字符串
   - 搜索本地化反模式：
     - 未使用区域感知函数的日期/时间格式化
     - 未考虑区域设置的数字格式化
     - 嵌入在图片或纹理中的文本（标记资源文件）
     - 假设从左到右文本方向的字符串
   - 报告所有发现，包含文件路径和行号

3. **对于 `extract`**：
   - 扫描所有源文件中的本地化字符串引用
   - 与 `assets/data/` 中的现有字符串表（如有）进行对比
   - 为尚未有键的字符串生成新条目
   - 按照命名约定建议键名：`[category].[subcategory].[description]`
   - 输出要添加到字符串表的新字符串的差异

4. **对于 `validate`**：
   - 读取 `assets/data/` 中的所有字符串表文件
   - 检查每个条目的：
     - 缺失翻译（键存在但某区域没有翻译）
     - 占位符不匹配（源文本有 `{name}` 但翻译缺失）
     - 字符串长度违规（超过 UI 元素的字符限制）
     - 孤立键（翻译存在但代码中没有引用该键）
   - 按区域和严重级别分组报告验证结果

5. **对于 `status`**：
   - 统计可本地化字符串总数
   - 按区域：统计已翻译、未翻译和过时（源文本自翻译后已更改）的数量
   - 生成覆盖率矩阵：

```markdown
## 本地化状态
生成日期：[日期]

| 区域 | 总计 | 已翻译 | 缺失 | 过时 | 覆盖率 |
|------|------|--------|------|------|--------|
| en (源) | [N] | [N] | 0 | 0 | 100% |
| [区域] | [N] | [N] | [N] | [N] | [X]% |

### 问题
- 源代码中发现 [N] 个硬编码字符串
- [N] 个字符串超出字符限制
- [N] 个占位符不匹配
- [N] 个孤立键（可清理）
```

### 规则
- 英语 (en) 始终为源区域
- 每个字符串表条目必须包含解释上下文的翻译者注释
- 永远不要直接修改翻译文件 — 生成差异供审核
- 字符限制必须按 UI 元素定义并自动执行
- 从右到左 (RTL) 语言支持应从一开始就考虑，而非事后追加
