Help us improve
Share bugs, ideas, or general feedback.
From ainiee-translate
Use when the user wants to translate a novel/epub end-to-end on the coding agent itself (Claude Code or Codex; no AiNiee app), AiNiee-style — parse, build a locked glossary, translate chapter by chapter following rules (names preserved, title 3-way, term consistency), write back and export. Triggers on "用 agent 翻译这本书", "agent 版 aniee 翻译", "把这本 epub 翻译了" and similar.
npx claudepluginhub xuanji86/ainiee-translate-skillHow this skill is triggered — by the user, by Claude, or both
Slash command
/ainiee-translate:ainiee-translateThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
本技能让 **编码 agent 本身(Claude Code / Codex 等)** 充当翻译引擎,配合一组确定性 Python 管道脚本,把一本 epub/txt 小说**端到端翻译**:
references/codex-tools.mdreferences/parallel_translation.mdreferences/style_guide_template.mdreferences/translation_rules.mdscripts/ainiee_translate/__init__.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileAccessor/DocxAccessor.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileAccessor/EpubAccessor.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileAccessor/WolfXlsxAccessor.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileAccessor/ZipUtil.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileAccessor/__init__.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/AssWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/BaseWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/CsvWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/DocxWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/EpubWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/I18nextWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/LrcWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/MToolWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/MdWriter.pyscripts/ainiee_translate/_vendor/ModuleFolders/Domain/FileOutputer/ParatranzWriter.pyGuides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Breaks plans, specs, or PRDs into thin vertical-slice issues on the project issue tracker using tracer bullets. Useful for converting high-level work into grabbable implementation tickets.
Share bugs, ideas, or general feedback.
本技能让 编码 agent 本身(Claude Code / Codex 等) 充当翻译引擎,配合一组确定性 Python 管道脚本,把一本 epub/txt 小说端到端翻译:
parse → 构建锁定词汇表 → 逐章翻译(agent 按规则) → 写回缓存 → 导出成品
{source_language} 解析时自动检测、{target_language} 由用户指定);本指南以中文为例,其他目标语言同理。translation_status):中断后重跑自动从首个未译段继续,天然可恢复。cache.json.bak.YYYYMMDD_HHMMSS。本技能自带管道脚本(scripts/ainiee_translate/),无需单独 pip install 本包;唯一外部依赖是一份本地 AiNiee 仓库(用作解析/导出库)及其 venv。
parse/export 现在自包含:解析/导出模块随技能打包在 scripts/ainiee_translate/_vendor/ 下(改写自 AiNiee、剥离了其 App 框架),无需克隆 AiNiee 仓库,只需一个装了几个轻量库的 Python。自带格式:epub/txt/md/docx/xlsx/pptx/csv/srt/vtt/ass/lrc/po/json 系列等。仅 PDF 与 Windows Office 转换未自包含——要用时设 AINIEE_REPO 回退到 AiNiee。
一次性准备:
确认本技能的安装位置。把本 ainiee-translate/ 文件夹放进 agent 的 skills 目录:
~/.claude/skills/ainiee-translate/ # Claude Code
~/.codex/skills/ainiee-translate/ # Codex(OpenAI Codex CLI)
下文用 $SKILL_DIR 指代它。在 Codex 等非 Claude Code 平台使用、以及工具名(Bash/Task/TodoWrite…)对照见 references/codex-tools.md。
建一个 venv 并装依赖(任意 Python ≥ 3.12):
python3 -m venv ~/.venvs/ainiee-translate
~/.venvs/ainiee-translate/bin/pip install \
msgspec beautifulsoup4 lxml rich openpyxl polib python-pptx chardet
设置两个路径变量(每个新终端;或写入 shell profile):
export SKILL_DIR=~/.claude/skills/ainiee-translate # 本技能安装目录
export AINIEE_PY=~/.venvs/ainiee-translate/bin/python # 上面 venv 的 python
# 可选:仅翻 PDF / Office(Windows) 这类未自包含格式时,回退到 AiNiee:
# export AINIEE_REPO=/path/to/AiNiee
命令前缀(后文用 <PFX> 代替):
PYTHONPATH="$SKILL_DIR/scripts" "$AINIEE_PY"
管道脚本以
ainiee_translate包形式打包在$SKILL_DIR/scripts/下,PYTHONPATH指向该scripts目录即可-m ainiee_translate.<module>调用。AINIEE_REPO只有 PDF/Office 回退才需要;不设也能跑自带格式。
自检命令(确认环境就绪):
PYTHONPATH="$SKILL_DIR/scripts" "$AINIEE_PY" \
-c "from ainiee_translate import io_dispatch; print('formats OK:', io_dispatch.supported_extensions())"
每个翻译项目独立一个工作目录(下文用 $WORK 指代):
export WORK=~/my-book # 自取
mkdir -p "$WORK/work" "$WORK/out"
将 epub/txt 解析成 cache.json(AiNiee CacheProject 格式):
<PFX> -m ainiee_translate.parse \
--input /path/to/book.epub \
--type AutoType \
--out "$WORK/work/cache.json"
--type:AutoType(自动检测)、Epub、Txt 等,默认 AutoType。parsed N items -> .../cache.json。不必每次从头解析。若已有一个翻译缓存——AiNiee 的工程缓存(AinieeCacheData.json)或另一个 ainiee-translate 项目的 cache.json(同为 CacheProject 格式)——可直接导入,再续翻/润色/校验/导出。
列出可导入的 AiNiee 工程(扫描 ~/Library/Application Support/AiNiee/ProjectCache,可用 AINIEE_CACHE_DIR 覆盖):
<PFX> -m ainiee_translate.project list
每项给出 project_id、project_name、input_path(原书)及状态计数(未译/已译/已润色/已排除)。
导入到项目(项目 ID 用 --ainiee,缓存文件路径用 --cache):
<PFX> -m ainiee_translate.project import --ainiee <项目ID> --work "$WORK"
# 或:--cache /path/to/AinieeCacheData.json --work "$WORK"
把缓存规范化进 $WORK/work/cache.json(已存在则先时间戳备份),并打印 input_path 与状态计数。
导入后按状态接续:还有未译段→步骤 5 续翻;已译待润色→步骤 6.5 润色;直接出成品→步骤 6 导出(原书路径见 input_path);查残留→步骤 7。
从 AiNiee 公共术语表(prompt_dictionary_data)和可选的项目分析缓存(analysis_v1)生成锁定表:
<PFX> -m ainiee_translate.glossary \
--config "<AiNiee config.json 路径>" \
--analysis "<项目分析缓存路径(可选)>" \
--out "$WORK/work/glossary.locked.json"
--config:AiNiee 的 config.json,路径随平台而异:
~/Library/Application Support/AiNiee/config.json%APPDATA%\AiNiee\config.json~/.config/AiNiee/config.jsonconfig.json。--analysis 可省略(无项目分析时跳过),形如 .../ProjectCache/<project_id>/AinieeCacheData.json。{
"characters": [
{"canonical": "James Marlow", "render": "James Marlow",
"aliases": ["Marlow", "Jim"], "gender": "M", "note": "船长"}
],
"terms": [
{"src": "the Ravensguard", "dst": "鸦卫军", "category": "faction"},
{"src": "Highmark", "dst": "Highmark", "keep_source": true}
],
"non_translate": [{"marker": "<i>", "category": "tag"}]
}
「模块」= 一个可复用的任务设置包,存于 ~/.ainiee-translate/modules/<名字>/,含:翻译提示词、润色提示词、词汇表、禁翻表、风格/世界观/角色、源/目标语言。同一个技能/插件靠切换模块应对不同小说/文档。
<PFX> -m ainiee_translate.profile import --profile <profile.json> --name <名字><PFX> -m ainiee_translate.module create <名字> [--source-language X --target-language Y]<PFX> -m ainiee_translate.module list / show <名字><PFX> -m ainiee_translate.module load <名字> --work ~/my-project加载只是把模块的 translate_prompt.md→work/user_prompt.md、polish_prompt.md、glossary.locked.json 拷进项目 work/——即后续步骤本就在读的文件。不用模块的项目,流程与下文完全一致。 此外 prompt.py 还能从 AiNiee 配置/profile 提取所选系统提示词(--translate-system)与润色提示词(--polish)。命令行入口见附录 C。
翻译规则分两层,领域/风格规则不写死在技能里——和 AiNiee 一样由用户自己写:
references/translation_rules.md,即 AiNiee 原生标准提示词(逐行、保留标记、忠实准确)。两种来源:
config.json,按各自开关汇总成一份:
<PFX> -m ainiee_translate.prompt --config "<AiNiee config.json>" --out ~/my-project/work/user_prompt.md
(读取 translation_user_prompt_data / characterization_data / writing_style_content / world_building_content / translation_example_data,仅纳入开关打开的部分。)~/my-project/work/user_prompt.md 写你的规则(如「人名保留原文」「军衔后置」等)。翻译时 agent 遵循:AiNiee 原生原则(translation_rules.md)+ 用户自定义提示词(user_prompt.md,若有)+ 锁定表(术语表/角色表)。技能本身不预设任何特定题材的规则。
开始翻译前,与用户确认介入模式:
| 模式 | 行为 | 适用场景 |
|---|---|---|
| A 抽样自动(默认) | 先译约 1 章展示给用户确认风格和规则对齐;之后自动逐章。遇到锁定表外的歧义新实体时停下询问。 | 第一次翻译新书 |
| B 每章过目 | 每章译完后展示给用户,点头确认后写回,再译下一章。歧义实体停下询问。 | 用户想细粒度监控 |
| C 全自动 | 整本一次性译完写回,歧义实体不停止,记入 needs_review 列表,最后统一报告。 | 已熟悉风格、快速跑完 |
<PFX> -m ainiee_translate.batch read \
"$WORK/work/cache.json" \
--size 100
输出:JSON 数组,每项包含 text_index(段落编号)和 source_text(源文):
[
{"text_index": 1, "source_text": "The room fell silent."},
{"text_index": 2, "source_text": "Marlow studied the letter."}
]
恢复机制:read 只返回 translation_status = UNTRANSLATED 的段落。重跑时自动跳过已译段,从断点继续。
Agent 本身就是翻译引擎。 读取上一步的 JSON,逐段按以下规则翻译:
references/translation_rules.md(AiNiee 原生:逐行对应、保留标记、忠实准确)。render 为英文则保留原文。将翻译结果写成 JSON 文件:
[
{"text_index": 1, "translated_text": "房间里一片寂静。"},
{"text_index": 2, "translated_text": "Marlow 端详着那封信。"}
]
保存为 $WORK/work/translations_batch_001.json(命名自取)。
<PFX> -m ainiee_translate.batch write \
"$WORK/work/cache.json" \
"$WORK/work/translations_batch_001.json"
cache.json.bak.YYYYMMDD_HHMMSS。applied N translation(s)。batch read 返回空数组([])为止。书很大、章节相互独立、且风格已用模式 A 锁定后,可派多个 subagent 并发翻译不同章节范围, 墙钟时间≈最慢的 agent(实测 11 章 1704 段用 7 个 agent 约 9 分钟译完)。
唯一铁律:subagent 绝不写 cache.json(并发「读改写」会损坏文件)。subagent 只产出译文 JSON 文件,
由主控 agent 串行 batch write 回写。各 agent 共享同一份锁定表 + references/translation_rules.md + 项目级
STYLE_GUIDE.md(用 references/style_guide_template.md 生成)以保证风格一致;新实体一律「保留原文 + 记录」。
完整流程(拆分、抽取、派发模板、风格漂移归一化、串行写回、收尾 verify)见 references/parallel_translation.md。
<PFX> -m ainiee_translate.export \
--cache "$WORK/work/cache.json" \
--output "$WORK/out/" \
--input /path/to/book.epub
FileOutputer 保留原书结构和富文本标签。_translated 后缀(默认),例如 book_translated.epub。若当前模块带 polish_prompt.md(已随加载落到 work/),可对已译文本做润色 pass:状态 TRANSLATED→POLISHED,可断点续跑;导出读 final_text,自动采用润色后的文本。模块无润色提示词则跳过本步。
循环直到 batch read-translated 返回 []:
<PFX> -m ainiee_translate.batch read-translated work/cache.json --size 100 → {text_index, source_text, translated_text} 数组。work/polish_prompt.md + 锁定词汇表润色每段(逐行 1:1、保留标记、人名/术语依词汇表),写 work/polished_NNN.json({text_index, polished_text})。<PFX> -m ainiee_translate.polish write work/cache.json work/polished_NNN.json(写回并置 POLISHED)。<PFX> -m ainiee_translate.verify \
"$WORK/work/cache.json" \
"$WORK/work/glossary.locked.json"
输出 JSON 格式的问题列表,并打印问题总数。两类检测:
empty_translation:源段有内容但译文为空(漏译)。name_not_preserved:源段含锁定表英文人名但译文中该名消失(人名汉化)。对每个问题,使用 batch write 修正对应 text_index 的译文后重新跑 verify,直到无问题。
# 路径变量(每次新终端)
export SKILL_DIR=~/.claude/skills/ainiee-translate
export AINIEE_PY=~/.venvs/ainiee-translate/bin/python # venv with: msgspec bs4 lxml rich openpyxl polib python-pptx chardet
export WORK=~/my-book
# 可选:export AINIEE_REPO=/path/to/AiNiee # 仅 PDF / Office 回退
# 命令前缀
PFX="PYTHONPATH=$SKILL_DIR/scripts $AINIEE_PY"
# 解析
$PFX -m ainiee_translate.parse --input book.epub --type AutoType --out "$WORK/work/cache.json"
# 词汇表
$PFX -m ainiee_translate.glossary --config "<config.json>" --out "$WORK/work/glossary.locked.json"
# 用户自定义提示词(汇总 AiNiee 配置里的自定义提示词)
$PFX -m ainiee_translate.prompt --config "~/Library/Application Support/AiNiee/config.json" --out work/user_prompt.md
# 批次读取
$PFX -m ainiee_translate.batch read "$WORK/work/cache.json" --size 100
# 批次写回
$PFX -m ainiee_translate.batch write "$WORK/work/cache.json" "$WORK/work/translations_001.json"
# 导出
$PFX -m ainiee_translate.export --cache "$WORK/work/cache.json" --output "$WORK/out/" --input book.epub
# 验证
$PFX -m ainiee_translate.verify "$WORK/work/cache.json" "$WORK/work/glossary.locked.json"
Q: parse / import 报 ModuleNotFoundError(bs4 / lxml / openpyxl / polib / pptx)?
A: 缺依赖。在 $AINIEE_PY 的 venv 里 pip install msgspec beautifulsoup4 lxml rich openpyxl polib python-pptx chardet,并确认 PYTHONPATH 指向 $SKILL_DIR/scripts。不再需要 AINIEE_REPO(仅 PDF/Office 回退才设)。
Q: batch read 返回空数组 []?
A: 所有段落均已翻译完毕(translation_status = TRANSLATED),可以进行导出步骤。
Q: 导出后 epub 没有内容?
A: 检查 cache.json 中是否有 translation_status = 1 的段落(即已译段)。可用 batch read 确认剩余未译数量。
Q: 如何重做某段译文?
A: 直接用 batch write 写入新的 translated_text(按 text_index 覆盖),write_back 会用新值替换旧值。
Q: 如何跳过不需要翻译的段落(如纯数字章节号)?
A: 在 translations.json 中将 translated_text 设为源文原样,或在生成时 agent 判断后直接复制源文。
安装为插件后,所有操作都可用 /ainiee-translate:<命令> 完成(/ 选择器即菜单,或 /ainiee-translate:menu 看清单):
| 命令 | 作用 |
|---|---|
menu | 显示命令菜单 |
translate <输入> [模块] | 端到端翻译(解析→词汇表→翻译→导出→校验) |
import-profile <profile.json> <模块> | 导入 AiNiee profile 为模块 |
module list|show|create|load … | 管理模块 |
gen-prompt translate|polish [模块] | 让 agent 起草翻译/润色提示词 |
switch-prompt [模块] / show-prompt [模块] | 切换 / 查看模块 |
polish [批大小] | 润色 pass |
glossary / export <输入> / verify / status | 词汇表 / 导出 / 校验 / 状态 |
命令脚本路径用 ${CLAUDE_PLUGIN_ROOT}/skills/ainiee-translate/scripts,并需用户设好 AINIEE_REPO/AINIEE_PY。