> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://onepin.ai/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://onepin.ai/docs/_mcp/server.

# Translate into other languages

> Add a Translator node, pick target languages, assign a voice per language (or let auto-route pick), and get per-language audio from one Onepin run.

One script, many languages: a [Translator](/docs/workflow/translator) node turns each line into your target languages, and the [Generator](/docs/workflow/generator) voices each one. One run delivers per-language audio — the pattern behind dubbing, localized courses, and multi-region ads.

## 1. Set the target languages

Edit the workflow's Translator node (read → modify → write back):

```python
definition = client.workflows.get(workflow_id=wf).data.model_dump()["definition"]
for node in definition["graph"]["nodes"]:
    if node["type"] == "operator_translator":
        node["config"] = {"target_languages": ["ko-kr", "ja-jp", "es-es"]}
client.workflows.patch_workflow(wf, definition=definition)
```

Up to 30 targets per Translator (BCP-47 codes). No Translator in your workflow yet? Add one between Script and Generator on the canvas, or clone a template that has one.

## 2. Give each language a voice

Every target language needs an entry in the Generator's `voice_map`. Two ways:

```python
for node in definition["graph"]["nodes"]:
    if node["type"] == "operator_generator":
        node["config"]["voice_map"].update({
            "ko-kr": [],                                # auto-route picks the best model
            "ja-jp": [{"voice_id": "...", "provider": "...", "model": "..."}],  # your pick
            "es-es": [],
        })
```

* **Empty list** — [auto-route](/docs/guides/auto-route) picks the best model for that language from Onepin's benchmarks.
* **Explicit assignment** — you pick the voice and model; see [Browse voices](/docs/guides/browse-voices).

A target language with no `voice_map` entry fails at run start with a clear error — coverage is checked before anything is billed.

## 3. Run and collect

Run as usual — the export ZIP has one folder per language:

```
sink_preview_1/
├── en-us/…_line_000.mp3
├── ko-kr/…_line_000.mp3
├── ja-jp/…_line_000.mp3
└── manifest.csv          ← maps every file to its line and language
```

Validators score every language's lines the same way — a Korean line that fails the accuracy bar is retried just like an English one.

## Related

* [Auto-route](/docs/guides/auto-route) — how Onepin picks a model per language
* [Translator](/docs/workflow/translator) — the node's config
* [Run a workflow](/docs/guides/run-a-workflow) — start, watch, download