WordPress Localization

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.

22
Languages
Correct plural rules
50
Strings / Chunk
Parallel processing
TM
Translation Memory
Same term = same translation
6
Max Plural Forms
Arabic: 6 forms
The Problem

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.

Plural Forms

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

DE, EN, ES, IT, PT, NL2 forms
Rule: n ≠ 1
1 item / 2 items
FR2 forms
Rule: n > 1
0 élément / 2 éléments
PL, RU, CS, UK3 forms
Rule: Complex
1 element / 2 elementy / 5 elementów
AR6 forms
Rule: 6 forms
Different form for 0, 1, 2, 3–10, 11–99, 100+
JA, ZH, KO1 forms
Rule: No plural
Same form for all numbers

Translation Memory — Consistency

Batch Lookup
500 strings submittedTM checked first
150
TM Hits
Consistent wording
350
AI Translated
Stored to TM
Next Translation Run
All 500 strings are now in TM. Same terms get the same translation every time. Only new/changed strings need AI translation.
Translation Memory

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.

Same term → same translation, every time
Batch TM lookup before any AI call
TM shared across all translation features
Per-license isolation — agency clients never mix
Context Awareness

"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

msgctxt: "button"
msgid: "Post"
msgstr: "Absenden"
Verb — button label
msgctxt: "noun"
msgid: "Post"
msgstr: "Beitrag"
Noun — content type
Same source string, different context, correct translation. File references and developer comments also passed to the prompt.
Translation Profiles

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.

Processing

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

5%
Load Translation Profile
Formality, glossary, forbidden terms
10%
Check Translation Memory
Batch lookup for all strings
15%
Separate TM Hits & Misses
TM hits ready instantly, misses queued
20–80%
Translate in Chunks (50/chunk)
Parallel AI translation with progress
85%
Store in Translation Memory
New translations saved for future reuse
95%
Merge & Finalize
TM hits + AI translations combined
100%
Complete
Results available via job poll URL

If a chunk fails, remaining chunks continue. Error count tracked per job.

Stability Principles

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.

Comparison

Symbion vs. Manual Localization

CapabilityManual / Loco TranslateSymbion Localize
Translation speedString by stringBatch processing, 50 strings/chunk
Plural formsManual per languageAutomatic: correct nplurals + formula
Context (msgctxt)Visible but not used for translationIncluded in AI prompt for disambiguation
Translation MemoryNot availableSame term = same translation, always. Shared TM pool.
FormalityInconsistent across translatorsConfigured once, applied consistently
GlossaryExternal referenceIntegrated into translation prompt
UpdatesRe-translate everythingTM serves unchanged strings identically — only new ones go to AI
Placeholder handlingManual vigilanceCritical rule: preserve %s, %d, %1$s exactly
For Developers & Agencies

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.