Translate Themes & Plugins — POT/PO, Done Right
Gettext translation with correct plural forms — not character-by-character machine translation.
WordPress themes and plugins use gettext for localization — POT files define the strings, PO files contain the translations. Symbion translates them with correct plural forms, Translation Memory for terminological consistency, formality settings, and glossary support. Localization is applied when new or changed strings are detected — not on every build.
Plugin translation is tedious, plural forms are tricky, and context matters.
Translating a WordPress plugin or theme means hundreds — sometimes thousands — of short UI strings. Each one needs the right tone, the right context, and the right plural forms for the target language. Manual translation is slow. Machine translation breaks plurals and ignores context.
Plural Forms Are Hard
English has 2 forms. Polish has 3. Arabic has 6. Most translation tools ignore plural rules entirely — or get them wrong. The result: broken UI strings.
Context Gets Lost
'Post' as a button means 'Submit.' 'Post' as a noun means 'Article.' Without msgctxt, translations are wrong. Most tools don't support gettext context.
Retranslating Everything
You've translated 500 strings. The plugin updates with 12 new ones. Do you really want to retranslate all 500? Without Translation Memory, that's exactly what happens.
Correct plural forms for every language — automatically.
WordPress uses GNU gettext for pluralization. Each language defines how many plural forms it has (nplurals) and a mathematical formula to select the right form. Symbion knows the rules for all 22 supported languages and generates the correct number of forms with the right formula.
German and English have 2 forms. French counts differently (n > 1). Polish and Russian have 3 forms with complex rules. Japanese, Chinese, and Korean have no plural distinction at all. Arabic has 6 forms. Symbion handles all of them correctly.
Plural Rules by Language
Translation Memory — Consistency
Translate once. Reuse consistently. Same term, same translation — always.
Every translated string is stored in your Translation Memory — isolated per license. When you translate the same plugin again after an update, previously translated strings are served from TM identically. The same word always gets the same translation. Only new or changed strings go to AI — the rest stays consistent.
This is the same Translation Memory used across all Symbion translation features — content translation, alt-text, and localization share the same TM pool. A string translated for content is available for localization — and vice versa.
"Post" can mean two things. Symbion knows which one.
Gettext uses msgctxt to disambiguate identical strings in different contexts. "Post" with context "button" translates to the verb (Submit / Absenden). "Post" with context "noun" translates to the noun (Article / Beitrag).
Symbion passes context information directly to the translation prompt, including file references and developer comments. The result: translations that are correct in context — not just linguistically accurate.
Context Disambiguation
Formality settings, glossaries, and forbidden terms.
Every localization job uses your Translation Profile — the same profile that powers all Symbion translation features. Formality (du/Sie/vous), custom terminology, do-not-translate lists, and forbidden terms are applied consistently across every string.
Formality
"du" (informal), "Sie" (formal), or auto-detect from existing content. Applied consistently to every string.
Custom Terms
Define preferred translations for specific terms. Your glossary overrides default translations — brand terms, product names, industry jargon.
Do Not Translate
Brand names, technical terms, and product identifiers stay untouched. Forbidden terms are automatically excluded from all output.
Async job processing. Real-time progress. Chunk-based reliability.
Large localization files can contain thousands of strings. Symbion processes them asynchronously in chunks of 50 — with progress updates at every step. If a chunk fails, the rest continues. Every string gets a status.
Job Processing Flow
If a chunk fails, remaining chunks continue. Error count tracked per job.
Localization runs when strings change — not on every build.
When a plugin updates from 500 strings to 512, you only translate the 12 new ones. Translation Memory serves the rest with identical wording — same terms, same translations. No re-translating unchanged strings, no inconsistencies between runs, no fluctuating terminology.
Localization results respect existing translations and are only updated when source strings change.
This is the same Decision Stability principle that runs through every Symbion feature — from Keyword Reality Check to SEO Analysis to Content Translation. Your translations are stable until the source changes.
Symbion vs. Manual Localization
| Capability | Manual / Loco Translate | Symbion Localize |
|---|---|---|
| Translation speed | String by string | Batch processing, 50 strings/chunk |
| Plural forms | Manual per language | Automatic: correct nplurals + formula |
| Context (msgctxt) | Visible but not used for translation | Included in AI prompt for disambiguation |
| Translation Memory | Not available | Same term = same translation, always. Shared TM pool. |
| Formality | Inconsistent across translators | Configured once, applied consistently |
| Glossary | External reference | Integrated into translation prompt |
| Updates | Re-translate everything | TM serves unchanged strings identically — only new ones go to AI |
| Placeholder handling | Manual vigilance | Critical rule: preserve %s, %d, %1$s exactly |
One API endpoint. Async processing. Structured results.
Localize API
POST /api/v1/localize/translate — submit strings with source/target language, get a job ID back. Poll for results. Always async for reliability.
Async Job Processing
Large files processed via Inngest jobs. Progress tracking at every step. Results available via poll URL when complete.
Shared Translation Memory
Same TM as content translation and alt-text. A string translated anywhere is available everywhere. Per-license isolation guaranteed.
Placeholder Preservation
Critical rule: %s, %d, %1$s, %2$s, %.2f, and HTML tags are preserved exactly. No corruption of WordPress format strings.
Text Domain Support
Every localization job is scoped to a text domain — your plugin or theme ID. Translations are organized by domain for clean management.
Per-License Isolation
All translations, TM entries, and job data are isolated per license. Agency setups with multiple clients stay completely separated.
Why this matters: WordPress localization is a solved problem in theory — gettext handles it. But in practice, it means hundreds of short strings, each needing correct plural forms, consistent formality, preserved placeholders, and domain context. Symbion handles the mechanics so you can focus on getting to market in 22 languages.
Localize your themes & plugins
— with correct plural forms and Translation Memory.
22 languages, correct nplurals, shared Translation Memory, formality settings, glossary support, and async job processing. Built into WordPress.