Translates EPUB ebook files between languages with parallel processing. Supports Japanese, English, Chinese, and other languages...
Translate EPUB files between any language pair with optimized support for Japanese and English to Korean.
Use this skill when:
/epub-translator <epub_path> [options]
<epub_path>: EPUB file or directory containing EPUBs| Option | Description | Default |
|---|---|---|
--source-lang |
Source language code | ja |
--target-lang |
Target language code | ko |
--dict |
Custom dictionary (JSON) | none |
--output-dir |
Output directory | ./translated |
--parallel |
Concurrent agents | 5 |
--split-threshold |
File size for splitting (KB) | 30 |
--split-parts |
Parts to split large files | 4 |
--high-quality |
Prefer the runtime's stronger model for translation | false |
--vertical |
Output vertical writing (ja/zh only) | false |
ja (Japanese), en (English), ko (Korean), zh (Chinese), es (Spanish), fr (French), de (German), ru (Russian), ar (Arabic), or any ISO 639-1 code.
# Japanese novel to Korean (default)
/epub-translator "/books/novel.epub"
# English to Korean
/epub-translator "/books/english.epub" --source-lang en
# Japanese to English
/epub-translator "/books/jp_novel.epub" --source-lang ja --target-lang en
# High-quality translation using the runtime's stronger model
/epub-translator "/books/important.epub" --high-quality
# Batch with larger split threshold (less splitting)
/epub-translator "/books/" --split-threshold 50 --parallel 10
# More aggressive splitting for slower connections
/epub-translator "/books/large.epub" --split-threshold 20 --split-parts 6
# English to Japanese with vertical writing (μ°μ’
μ/ηΈ¦ζΈγ)
/epub-translator "/books/novel.epub" --source-lang en --target-lang ja --vertical
# Korean to Chinese with vertical writing
/epub-translator "/books/korean.epub" --source-lang ko --target-lang zh --vertical
graph TB
O["ORCHESTRATOR<br/>β’ Analyzes EPUBs and creates task manifest<br/>β’ Dispatches translation work using available agent/runtime features<br/>β’ Collects translated section files<br/>β’ Validates translation quality<br/>β’ Handles retries and error recovery"]
T1["Translator<br/>Agent 1"]
T2["Translator<br/>Agent 2"]
TN["Translator<br/>Agent N"]
O --> T1
O --> T2
O --> TN
Execution Model: Translate independent files or sections in parallel when the active runtime supports parallel agents. If parallel dispatch is unavailable, process the manifest sequentially with the same prompts and filesystem outputs.
| Task | Model |
|---|---|
| Content translation | Standard translation-capable model |
| Metadata/TOC | Fast model |
| Validation | Fast model |
--high-quality| Task | Model |
|---|---|
| Content translation | Strongest practical model |
| Metadata/TOC | Stronger model |
| Validation | Stronger model |
Create work directory:
WORK_DIR="/tmp/epub_translate_$(date +%s)"
mkdir -p "$WORK_DIR"/{extracted,sections,translated,status,logs}
Analyze EPUBs (with configurable split threshold):
python3 scripts/analyze_epub.py \
--epub "{EPUB_PATH}" \
--work-dir "$WORK_DIR" \
--source-lang "{SOURCE_LANG}" \
--target-lang "{TARGET_LANG}" \
--split-threshold 30 \
--split-parts 4
Review $WORK_DIR/manifest.json for task count.
Select translator prompt from references/:
translator_ja.mdtranslator_en.mdtranslator_generic.mdDispatch translation work in batches:
--parallel count when parallelism is availableBatch execution pattern:
For each batch of N tasks:
- Dispatch N translation jobs when parallelism is available
- Confirm each expected output file exists
- Track completed/failed tasks
- Proceed to next batch
Retry failed tasks (max 2 attempts, use a stronger model if persistent)
Merge split files:
python3 scripts/merge_xhtml.py --work-dir "$WORK_DIR" --manifest manifest.json
Translate metadata and navigation (LLM-based):
translator_metadata.mdApply layout conversion (CRITICAL - must be done before packaging):
Determine conversion type based on target language and --vertical option:
| Target Language | --vertical |
Result |
|---|---|---|
| ko, en, etc. | (ignored) | horizontal-tb, ltr |
| ja, zh | false (default) | horizontal-tb, ltr |
| ja, zh | true | vertical-rl, rtl (μ°μ’ μ/ηΈ¦ζΈγ) |
| ar, he, fa | (ignored) | horizontal-tb, rtl |
A. Horizontal output (default for all languages):
TRANSLATED_DIR="$WORK_DIR/translated/{VOLUME_ID}"
# Convert CSS files: vertical-rl β horizontal-tb
find "$TRANSLATED_DIR" -name "*.css" -exec sed -i '' \
-e 's/writing-mode:[[:space:]]*vertical-rl/writing-mode: horizontal-tb/g' \
-e 's/-webkit-writing-mode:[[:space:]]*vertical-rl/-webkit-writing-mode: horizontal-tb/g' \
-e 's/-epub-writing-mode:[[:space:]]*vertical-rl/-epub-writing-mode: horizontal-tb/g' \
{} \;
# Convert content.opf: page direction and writing mode
find "$TRANSLATED_DIR" -name "content.opf" -exec sed -i '' \
-e 's/page-progression-direction="rtl"/page-progression-direction="ltr"/g' \
-e 's/primary-writing-mode" content="vertical-rl"/primary-writing-mode" content="horizontal-tb"/g' \
{} \;
# Convert XHTML inline styles if present
find "$TRANSLATED_DIR" -name "*.xhtml" -exec sed -i '' \
-e 's/writing-mode:[[:space:]]*vertical-rl/writing-mode: horizontal-tb/g' \
{} \;
B. Vertical output (only when --vertical AND target is ja/zh):
TRANSLATED_DIR="$WORK_DIR/translated/{VOLUME_ID}"
# Convert CSS files: horizontal-tb β vertical-rl
find "$TRANSLATED_DIR" -name "*.css" -exec sed -i '' \
-e 's/writing-mode:[[:space:]]*horizontal-tb/writing-mode: vertical-rl/g' \
-e 's/-webkit-writing-mode:[[:space:]]*horizontal-tb/-webkit-writing-mode: vertical-rl/g' \
-e 's/-epub-writing-mode:[[:space:]]*horizontal-tb/-epub-writing-mode: vertical-rl/g' \
{} \;
# Convert content.opf: page direction and writing mode for vertical
find "$TRANSLATED_DIR" -name "content.opf" -exec sed -i '' \
-e 's/page-progression-direction="ltr"/page-progression-direction="rtl"/g' \
-e 's/primary-writing-mode" content="horizontal-tb"/primary-writing-mode" content="vertical-rl"/g' \
{} \;
# Convert XHTML inline styles if present
find "$TRANSLATED_DIR" -name "*.xhtml" -exec sed -i '' \
-e 's/writing-mode:[[:space:]]*horizontal-tb/writing-mode: vertical-rl/g' \
{} \;
C. RTL output (for ar/he/fa targets):
# Convert page direction
sed -i '' 's/page-progression-direction="ltr"/page-progression-direction="rtl"/g' "$TRANSLATED_DIR"/content.opf
# Convert CSS direction
find "$TRANSLATED_DIR" -name "*.css" -exec sed -i '' \
-e 's/direction:[[:space:]]*ltr/direction: rtl/g' \
{} \;
Note: If source is already vertical and --vertical is set, skip CSS conversion (keep existing vertical layout).
See references/layout_conversion.md for complete conversion patterns.
Verify source text removed:
python3 scripts/verify.py --work-dir "$WORK_DIR" --source-lang "{SOURCE_LANG}"
Extract text for validation (token-efficient format):
python3 scripts/extract_for_validation.py \
--dir "$WORK_DIR/translated" \
--output-dir "$WORK_DIR/validation" \
--max-tokens 8000
Select validator prompt from references/:
validator_ko.md (extends validator_generic.md)validator_generic.mdSpawn validation Task agents in foreground mode (batched):
$WORK_DIR/validation/validation_manifest.jsonmodel: "haiku" (sufficient for validation)Aggregate results:
If average score < 70: Re-translate flagged files with model: "opus"
Package EPUB:
bash scripts/package_epub.sh "$WORK_DIR" "{OUTPUT_DIR}"
Generate final report with quality metrics
Conservative defaults prevent context overflow in translation agents:
| Setting | Default | Description |
|---|---|---|
split-threshold |
30 KB | Files larger than this are split |
split-parts |
4 | Number of sections per large file |
Translation quality is validated by an LLM-based review pass, not regex patterns. This provides:
| Target Language | Primary Instruction | Base Instruction |
|---|---|---|
| Korean | validator_ko.md |
validator_generic.md |
| Other | validator_generic.md |
- |
~νλ κ²μ΄λ€, ~λΌκ³ νλ, etc.κ·Έλ
λ, κ·Έλμμμ patterns| Source | Special Handling |
|---|---|
| Japanese | Remove ruby tags, handle vertical writing |
| Chinese | Handle traditional/simplified, remove pinyin |
| Arabic/Hebrew | Handle RTL text direction |
| English | Standard processing |
Key Principle: All languages default to horizontal LTR (except RTL languages).
| Target Language | Page Direction | Writing Mode | Text Direction | Notes |
|---|---|---|---|---|
| Korean (ko) | ltr | horizontal-tb | ltr | |
| English (en) | ltr | horizontal-tb | ltr | |
| Japanese (ja) | ltr | horizontal-tb | ltr | Default |
Japanese (ja) + --vertical |
rtl | vertical-rl | ltr | ηΈ¦ζΈγ (μ°μ’ μ) |
| Chinese (zh) | ltr | horizontal-tb | ltr | Default |
Chinese (zh) + --vertical |
rtl | vertical-rl | ltr | ηΈ±ζ (μ°μ’ μ) |
| Arabic (ar) | rtl | horizontal-tb | rtl | |
| Hebrew (he) | rtl | horizontal-tb | rtl |
Note: --vertical option is only valid for Japanese (ja) and Chinese (zh) targets. It will be ignored for other languages.
See references/layout_conversion.md for complete conversion scripts.
The translator works without external dictionary files. It naturally translates based on context.
Use custom dictionaries ONLY for:
Do NOT add common words - let the translator handle them naturally.
See assets/template.json for format:
{
"proper_nouns": { "names": { "η°δΈε€ͺι": "Tanaka Taro" } },
"domain_terms": { "ProprietaryTech": "κ³ μ κΈ°μ λͺ
" }
}
For academic or technical documents, use assets/template_academic.json.
$WORK_DIR/
βββ manifest.json # Task manifest
βββ extracted/ # Extracted EPUB contents
βββ sections/ # Split large files
βββ translated/ # Translated files
βββ validation/ # Validation input/output files
β βββ validation_manifest.json
β βββ validate_001_input.txt
β βββ validate_001_result.json
β βββ ...
βββ status/ # Task status files
βββ logs/ # Log files
| Status | Meaning |
|---|---|
pending |
Not started |
in_progress |
Being translated |
completed |
Done |
failed |
Error occurred |
| Error | Action |
|---|---|
| Extraction failure | Skip corrupted file |
| Translation timeout | Split further, retry |
| XML error | Attempt fix, report |
| Remaining source text | Re-translate or manual review |
| Low quality score | Review samples, re-translate if needed |
| Path | Description |
|---|---|
SKILL.md |
This file |
references/orchestrator.md |
Detailed orchestrator instructions |
references/translator_*.md |
Language-specific translator prompts |
references/translator_metadata.md |
Metadata and TOC translation instruction |
references/layout_conversion.md |
Writing direction and layout conversion guide |
references/validator_generic.md |
Generic validation instruction |
references/validator_ko.md |
Korean-specific validation instruction |
scripts/analyze_epub.py |
EPUB analysis (configurable splitting) |
scripts/split_xhtml.py |
File splitting |
scripts/merge_xhtml.py |
Section merging |
scripts/verify.py |
Source text verification |
scripts/extract_for_validation.py |
Token-efficient text extraction for LLM validation |
scripts/package_epub.sh |
EPUB packaging |
assets/template.json |
Dictionary template |
assets/template_academic.json |
Academic dictionary template |