Translate text and documents between languages with cultural and contextual adaptation
Translate text, documents, and content between languages with attention to context, tone, and cultural nuance.
artifacts skill)Before translating, clarify:
Choose the right approach for the content type:
| Content Type | Approach | Priority |
|---|---|---|
| Technical/Legal | Precise, terminology-consistent | Accuracy over fluency |
| Business | Professional, clear | Balance accuracy and fluency |
| Marketing/Creative | Transcreation — adapt the message | Impact over literal accuracy |
| Casual/Chat | Natural, colloquial | Fluency over formality |
| UI/UX | Concise, action-oriented | Brevity and clarity |
Translation principles:
Many languages force you to pick a formality register for "you." Get this wrong and the whole translation reads off. Ask the user or default to formal for business.
| Language | Informal (T) | Formal (V) | Notes |
|---|---|---|---|
| Spanish | tú / vos | usted | LatAm vs. Spain differ; Argentina uses vos |
| French | tu | vous | vous is also plural — context disambiguates |
| German | du | Sie | Sie is capitalized; verbs conjugate differently |
| Portuguese | tu / você | o senhor / a senhora | Brazil: você is default-neutral |
| Russian | ты | вы | |
| Japanese | — | — | No T-V; uses keigo — three honorific systems (teineigo polite, sonkeigo respectful, kenjōgo humble). In-group vs out-group matters more than hierarchy: you humble your own boss when talking to a client. |
| Korean | 반말 | 존댓말 | Six speech levels; verb endings change completely |
Dates, numbers, and currencies follow Unicode CLDR (Common Locale Data Repository — what every OS and browser uses). Don't hardcode formats; look them up per locale:
| Locale | Date | Number | Notes |
|---|---|---|---|
| en-US | 3/14/2026 | 1,234.56 | 12-hour clock default |
| en-GB | 14/03/2026 | 1,234.56 | 24-hour clock |
| de-DE | 14.03.2026 | 1.234,56 | Comma is decimal separator |
| fr-FR | 14/03/2026 | 1 234,56 | Thin-space thousands separator |
| ja-JP | 2026年3月14日 | 1,234.56 | Year-month-day, era names possible (令和8年) |
| ar-SA | ١٤/٠٣/٢٠٢٦ | ١٬٢٣٤٫٥٦ | RTL, Arabic-Indic digits, Hijri calendar option |
In Python: babel.dates.format_date(d, locale='de_DE') handles this correctly.
English → other languages changes length. Critical for UI strings, button labels, and anything with character limits:
| Target | Expansion vs. English | Watch out for |
|---|---|---|
| German | +35% | Compound words don't wrap: Eingabeverarbeitungsfunktionen |
| French, Spanish | +20–25% | |
| Russian | +15% | Plus Cyrillic glyphs are often wider |
| Finnish, Dutch | +30% | Agglutinative compounds |
| Chinese, Japanese, Korean | −10% to −30% (shorter) | But need larger font sizes for legibility |
UI rule of thumb: design with 35% horizontal slack. Tell the user if their 12-char button label becomes 22 chars in German.
| Tool | Use when | Don't use when |
|---|---|---|
| LLM (you) | Context matters, tone adaptation, idioms, marketing copy, anything needing judgment | You need 10,000 strings translated identically |
deep-translator (Python) | Bulk throughput, wrapping Google/DeepL/Microsoft APIs, simple string-in-string-out | You need glossary enforcement (it doesn't expose DeepL's glossary API) |
deepl official SDK | Need glossary/termbase support — it actually exposes this | |
translate-toolkit | Parsing XLIFF/TMX/TBX/PO files — the standard localization formats |
For high-stakes content (legal, medical, safety warnings): translate source→target, then independently translate target→source, then diff semantically against the original. Divergences flag ambiguity or drift. Don't use the same model/prompt for both directions — you'll get confirmation bias. This catches errors but is NOT proof of correctness; it's a smell test.
For multi-document projects, build a termbase (JSON of {source_term: target_term}) and inject it into your system prompt. Forces consistency across documents — "dashboard" shouldn't be tablero on page 1 and panel de control on page 5.
es-MX ≠ es-ES ≠ es-AR (vocabulary, formality, vos vs tú){name}, %s, {{count}} must survive unchanged and in grammatically valid positions