---
name: multi-lang-translate
version: 1.0.0
description: |
  多语种翻译工具。将中文文案翻译为英文、土耳其语、印尼语、阿拉伯语、印地语、乌尔都语共 6 种语言。支持三种输入模式：(1) 单条文案 → 横向卡片页面 + 一键复制全部；(2) 多条文案 → 横向表格页面 + 一键复制全部；(3) Excel 上传 → 翻译所有行后填充 Excel 供下载。触发：用户发送中文文案要求多语言翻译、说"翻译卡片""多语种翻译"、或上传多语言 Excel 模板时触发。
agent_created: true
---

# 多语种翻译工具

将用户输入的中文文案翻译为 6 种语言，根据输入模式选择对应的输出方式。

## 触发条件

- 用户发送中文文案，要求翻译成多语言
- 用户说"翻译卡片""多语种翻译""生成多语言翻译"
- 用户上传 Excel 文件，要求翻译并填充多语言列

## 翻译目标语言（固定 6 种）

| # | 列名 / 语言名 | 标识 |
|---|-------------|------|
| 1 | English | 🇬🇧 English |
| 2 | Turkish | 🇹🇷 Türkçe |
| 3 | Indonesian | 🇮🇩 Indonesia |
| 4 | Arabic | 🇸🇦 العربية |
| 5 | Hindi | 🇮🇳 हिन्दी |
| 6 | Urdu | 🇵🇰 اردو |

## 翻译要求

- **专有名词优先**：翻译前先查 `assets/glossary.json`（136 条确认术语），若原文整体匹配术语表词条，直接使用术语表译文；若原文包含术语表中的词，该词的译法必须与术语表一致，不可自创
- 保持原文的语体和语气（祈使→祈使，疑问→疑问，陈述→陈述）
- 优先采用地道的母语表达，而非逐字直译
- 如果是按钮文案、UI 标签等短文案，使用简洁的祈使/动名词形式
- 阿拉伯语和乌尔都语为 RTL 语言，呈现时按右向左书写

## 模式判断

根据用户输入自动判断模式：

| 输入 | 模式 | 模板 |
|------|------|------|
| 单条中文文案 | **单条模式** | `assets/template.html` |
| 多条中文文案（换行/逗号分隔/编号列表） | **多条模式** | `assets/template-multi.html` |
| 上传 Excel（.xlsx） | **Excel 模式** | 直接操作 Excel，无需 HTML |

---

## 模式 A：单条文案

### 翻译

将用户输入的 1 条中文文案翻译为 6 种语言。

### 生成 HTML

读取 `assets/template.html`，替换以下占位符：

| 占位符 | 替换规则 |
|--------|----------|
| `WEBVIEW_TITLE` | `{原文} - 多语种翻译` |
| `PLACEHOLDER_SUBTITLE` | 语境说明，如"接单平台按钮语境 · 祈使语气"或留空 |
| `PLACEHOLDER_SOURCE` | 中文原文 |
| `PLACEHOLDER_TILES` | 6 个 tile（无独立复制按钮，仅展示） |
| `PLACEHOLDER_COPYALL` | copyAll 函数体（见下方） |

**Tile 模板（无复制按钮）：**

```html
<div class="tile">
  <div class="lang-name">🇬🇧 English</div>
  <div class="lang-text">Accept Orders Now</div>
</div>
```

阿拉伯语和乌尔都语 tile 的 `lang-text` 需要 class `lang-text rtl`。

**CopyAll 代码 —— 横向格式（不含表头）：**

复制结果格式为制表符分隔，行之间用 `\n`，可直接粘贴到 Excel 的数据行（不含表头）：

```js
const text = '立即接单\tAccept Orders Now\tHemen Sipariş Al\tTerima Pesanan Sekarang\tاقبل الطلبات الآن\tअभी ऑर्डर स्वीकारें\tابھی آرڈر قبول کریں';
navigator.clipboard.writeText(text).then(() => {
  const btn = document.querySelector('.copy-all');
  btn.textContent = '✓ 已复制（可直接粘贴到 Excel）';
  btn.classList.add('copied');
  showToast('已复制，可直接粘贴到 Excel');
  setTimeout(() => {
    btn.textContent = '📋 一键复制全部';
    btn.classList.remove('copied');
  }, 2000);
});
```

### 文件命名

写入工作目录，文件名 `translate-card.html`，然后用 `present_files` 呈现。

---

## 模式 B：多条文案

### 解析输入

将用户输入的多条文案解析为数组。支持：
- 换行分隔
- 逗号 / 顿号分隔
- 编号列表（1. xx 2. xx）

### 翻译

逐条翻译为 6 种语言。

### 生成 HTML

读取 `assets/template-multi.html`，替换占位符：

| 占位符 | 替换规则 |
|--------|----------|
| `WEBVIEW_TITLE` | `批量翻译 - 多语种` |
| `PLACEHOLDER_SUBTITLE` | `共 N 条文案` |
| `PLACEHOLDER_ROWS` | 每行一个 `<tr>` |
| `PLACEHOLDER_COPYALL` | copyAll 函数体 |

**行模板：**

```html
<tr>
  <td class="src-col">中文原文</td>
  <td>English text</td>
  <td>Türkçe text</td>
  <td>Indonesia text</td>
  <td class="rtl">العربية text</td>
  <td>हिन्दी text</td>
  <td class="rtl">اردو text</td>
</tr>
```

注意：阿拉伯语和乌尔都语的 `<td>` 需要 class `rtl`。

**CopyAll 代码 —— 横向制表符格式（不含表头）：**

每行一条文案，列之间用 `\t` 分隔，行之间用 `\n` 分隔。不要包含表头行：

```js
const rows = [
  '立即接单\tAccept Orders Now\tHemen Sipariş Al\tTerima Pesanan Sekarang\tاقبل الطلبات الآن\tअभी ऑर्डर स्वीकारें\tابھی آرڈر قبول کریں',
  // ... more rows
];
navigator.clipboard.writeText(rows.join('\n')).then(() => {
  const btn = document.querySelector('.copy-all');
  btn.textContent = '✓ 已复制全部（可直接粘贴到 Excel）';
  btn.classList.add('copied');
  showToast('已复制 ' + rows.length + ' 条，可直接粘贴到 Excel');
  setTimeout(() => {
    btn.textContent = '📋 一键复制全部';
    btn.classList.remove('copied');
  }, 2000);
});
```

### 文件命名

写入工作目录，文件名 `translate-batch.html`，然后用 `present_files` 呈现。

---

## 模式 C：Excel 上传

### 前置：理解 Excel 格式

用户上传的 Excel 格式如下（以 `【Q项目】多语言导入.xlsx` 为例）：

| 列 | 说明 |
|----|------|
| key | 可为空 |
| 应用名 | 可为空 |
| 词条id | 可为空 |
| 模块编码 | 模块代码 |
| 需求名称 | 需求分类 |
| 中文 | **原文（需翻译）** |
| 英文 | 待填充 / 已有 |
| 土耳其语 | 待填充 / 已有 |
| 印尼语 | 待填充 / 已有 |
| 阿拉伯语 | 待填充 / 已有 |
| 印地语 | 待填充 / 已有 |
| 乌尔都语 | 待填充 / 已有 |

表头固定不变，只填充"中文"列对应的 6 种语言译文。

### 处理流程

1. **读取 Excel**：用 pandas `pd.read_excel(src, sheet_name=None)` 读取**所有 sheet**，每个 sheet 的列结构相同（均有「中文」列 + 6 个语言列）
2. **翻译**：遍历每个 sheet，逐行翻译「中文」列的每条文案为 6 种语言
3. **填充 Excel**：只修改各 sheet 的 6 个语言列单元格，表头和其他列不变
4. **输出**：默认保存到 `C:\Users\penghui.han\Desktop\需求\翻译\翻译结果YYYYMMDD-HH-MM-SS.xlsx`（文件名带时间戳，如 `翻译结果20260731-17-06-56.xlsx`），用 `present_files` 呈现

### Excel 编辑要点

使用 minimax-xlsx 的 XML 编辑方式：
```bash
python3 SKILL_DIR/scripts/xlsx_unpack.py input.xlsx /tmp/xlsx_work/
# 编辑 xl/worksheets/sheet1.xml 中的语言列单元格
# 在 <c r="G2"><v>英文译文</v></c> 等位置写入翻译结果
python3 SKILL_DIR/scripts/xlsx_pack.py /tmp/xlsx_work/ 翻译结果.xlsx
```

填充列对应关系（假设第 1 行为表头，数据从第 2 行开始）：
| 列 | 列名 |
|----|------|
| G | 英文 |
| H | 土耳其语 |
| I | 印尼语 |
| J | 阿拉伯语 |
| K | 印地语 |
| L | 乌尔都语 |

或者直接用 pandas 读写（当文件不含复杂格式时更简单）：

```python
import pandas as pd
from datetime import datetime

# 读取所有 sheet
sheets = pd.read_excel('input.xlsx', sheet_name=None)
lang_cols = ['英文','土耳其语','印尼语','阿拉伯语','印地语','乌尔都语']

for name, df in sheets.items():
    # 将语言列转为 object（处理 NaN）
    for c in lang_cols:
        df[c] = df[c].astype('object')
    # 遍历每一行翻译
    for i, row in df.iterrows():
        cn = str(row['中文']).strip() if pd.notna(row['中文']) else ''
        # ... 翻译并填充 6 列
    sheets[name] = df

# 保存所有 sheet
ts = datetime.now().strftime('%Y%m%d-%H-%M-%S')
out = f'翻译结果{ts}.xlsx'
with pd.ExcelWriter(out, engine='openpyxl') as writer:
    for name, df in sheets.items():
        df.to_excel(writer, sheet_name=name, index=False)
```
