Getting Started with Localization Engine
Configure languages, add glossary terms, mark fields as localized, enable auto-translate — AI handles the rest. Translation Memory caches every result. 100+ languages.
Configure Languages
Admin → Localization → Settings:
json
{
"activeLocales": ["en", "es", "fr", "de"],
"defaultLocale": "en"
}
Supported locales:
🇺🇸 English (en) — default
🇪🇸 Spanish (es) — Spain
🇪🇸 Spanish (es-MX) — Mexico
🇫🇷 French (fr) — France
🇩🇪 German (de) — Germany
🇵🇹 Portuguese (pt-BR) — Brazil
🇮🇹 Italian (it) — Italy
🇳🇱 Dutch (nl) — Netherlands
🇵🇱 Polish (pl) — Poland
🇷🇺 Russian (ru) — Russia
🇨🇳 Chinese Simplified (zh-CN)
🇯🇵 Japanese (ja) — Japan
🇰🇷 Korean (ko) — Korea
... (100+ total)
How locales work in the data model:
``` When you mark a field as "localized" in a collection schema: → The field stores: { en: "...", es: "...", fr: "..." }
In Admin UI: → Field shows language tabs: [EN] [ES] [FR] [DE] → Translate each language separately → English is the source (defaultLocale)
In public API: → ?locale=es → returns Spanish content → ?locale=fr → returns French content → No locale param → returns defaultLocale ```
Add Glossary Terms
Admin → Localization → Glossary → Add Term:
do_not_translate — Brand names, trademarks:
Term: Aeion OS
Rule Type: do_not_translate
Match Case: ✅
→ AI will never translate "Aeion OS" in any language
→ Stays exactly "Aeion OS" in Spanish, French, German, etc.
always_translate_as — Locale-specific brand phrases:
Term: SaaS Platform
Rule Type: always_translate_as
Target Translations:
{ "es": "Plataforma SaaS", "de": "SaaS-Plattform", "fr": "Plateforme SaaS" }
Match Case: ✅
→ Spanish: "Plataforma SaaS" (not "Plataforma SaaS" from generic translation)
→ German: "SaaS-Plattform" (German compound noun form)
→ French: "Plateforme SaaS" (French word order)
guidance — Context-sensitive instructions:
Term: enterprise
Rule Type: guidance
Description: "Use 'Großunternehmen' for companies with 500+ employees.
Use 'Unternehmen' for smaller businesses.
Use 'Enterprise' only when referring to our Enterprise tier product."
Match Case: ❌
→ AI reads this instruction before translating
→ Translates contextually based on description
Adding many terms at once: The admin UI above adds one term at a time. For a large glossary, script individual create calls against POST /api/v1/loc_glossary from your source list (spreadsheet export, terminology database, etc.) — there's no dedicated bulk-import wizard today, so plan on a short script rather than a point-and-click upload.
Mark Fields as Localized
In your collection schema, set localized: true on any field:
typescript
// In the content module's pages collection:
export const Pages: CollectionConfig = {
slug: "pages",
fields: [
{
name: "title",
type: "text",
localized: true, // ← This field will be auto-translated
required: true,
},
{
name: "description",
type: "textarea",
localized: true, // ← Auto-translated
},
{
name: "slug",
type: "text",
// No localized: true → not translated (URL slugs stay in default locale)
},
{
name: "featuredImage",
type: "image",
// No localized → images are not translated
},
],
};
In Admin UI — what you see:
``` Admin → Pages → Edit "About Us"
Title: [EN🇺🇸] "About Our Company" [ES🇪🇸] "Sobre Nuestra Empresa" [FR🇫🇷] "À Propos de Notre Entreprise" [DE🇩🇪] "Über Unser Unternehmen"
Description: [EN🇺🇸] "We are a leading provider of..." [ES🇪🇸] "Somos un proveedor líder de..." [FR🇫🇷] "Nous sommes un fournisseur leader de..." [DE🇩🇪] "Wir sind ein führender Anbieter von..."
Slug: /about-us (not localized — URL is en-only) ```
Auto-translate only fires when:
1. The field is marked localized: true in the collection schema
2. Your active languages are configured in Localization → Settings
3. The target language is missing a translation
→ If a Spanish translation already exists → skipped (preserves human edits)
→ If a Spanish translation is marked "rejected" → AI re-translates
Save Content — AI Translates Automatically
Everything below happens automatically after setup — you just save the page:
``` You save a page in Admin with: title: { en: "Free Shipping", es: (empty), fr: (empty), de: (empty) }
- Aeion detects your active languages (English, Spanish, French, German)
- A translation job is queued for each missing language
- Workers process the jobs in parallel:
- Done in ~30 seconds
In Admin — after auto-translation:
``` Admin → Pages → Edit "Shipping Policy"
Title: [EN🇺🇸] "Free Shipping" [ES🇪🇸] "Envío Gratuito" ← Auto-translated [FR🇫🇷] "Livraison Gratuite" ← Auto-translated [DE🇩🇪] "Kostenloser Versand" ← Auto-translated
Status: Saved with AI translations in background ```
Manual translation (Enterprise):
``` Admin → Localization → Translation Memory
Override auto-translation: → Find entry: "Free Shipping" → "Envío Gratuito" → Edit: "Envío Gratuito" → "Envío Sin Costo" → Status: human_approved → AI will use this translation forever (until you change it)
Reject bad translation: → Find entry: "Free Shipping" → "Envío Gratuito" → Status: rejected → Next page save with "Free Shipping" → AI re-translates from scratch ```
Monitor Translation Memory
Translation Memory dashboard:
``` Admin → Localization → Translation Memory
Dashboard metrics: Total entries: 12,847 Total reuses: 48,293 AI cost saved: $96.59
By locale: es: 4,521 entries, 18,234 reuses fr: 3,892 entries, 14,221 reuses de: 3,018 entries, 10,847 reuses
By status: ai_generated: 12,340 human_approved: 507 rejected: 0
Translation effectiveness: Reuse rate: 79% (48,293 reuses / 61,140 total lookups) → 79% of translation requests served from cache = $0 AI cost → Only 21% required new AI calls ```
Per-entry details:
``` Source Text: "Free shipping on orders over $50" Translated: "Envío gratuito en pedidos superiores a 50 $" Locale: es Context: "Translating title for a product page" Status: human_approved Usage Count: 47 ← Incremented on every cache hit Last Used: 2024-01-15T14:32:07Z Created: 2024-01-01T09:00:00Z
Cache hit #47: → Total AI cost avoided: 47 × ~$0.002 = $0.094 → This single entry has saved $0.094 in AI costs alone → Your entire TM: 48,293 reuses × $0.002 avg = $96.59 total saved ```