Localization
Alokai CMS supports per-locale page versions. Each locale gets its own independent version history and publish status.
Adding locales
Go to Settings → Locales and click New Locale. Enter:
- Code — IETF language tag (e.g.
en-US,de-DE,fr-FR) - Name — Display name (e.g. “English (US)”)
- Default — Whether this is the fallback locale
Locales are per-edition. The main edition and a staging edition can have different locale sets.
Editing in a locale
Use the locale switcher in the page editor toolbar to switch between locales. When you switch locale, the canvas and property editor reload with that locale’s content.
If a locale has no content yet, the editor starts with an empty canvas.
Independent publish status
Each locale version is published independently:
- Publish English without affecting German
- Schedule French for a future date while English is already live
- Archive a locale-specific version while keeping others active
Default locale
The default locale is used as a fallback when the delivery API is called without a locale parameter.
AI translations
Alokai CMS can machine-translate localizable fields for you so you don’t start each locale from a blank canvas. Translation runs against your own Cloudflare Workers AI binding (the Gemma model) — content is not sent to a third-party service.
How a translation flows
Every localizable field value carries a source marker that tells you where it came from:
| Source | Meaning |
|---|---|
| Human | Authored or edited by a person. |
| Draft | An AI suggestion that has not been reviewed yet. |
| Reviewed | A person checked the AI suggestion and approved it. |
The lifecycle is Human → (translate) → Draft → (review) → Reviewed. AI never overwrites a Human or Reviewed value unless you ask it to — by default it only fills in or refreshes untranslated fields.
Translating
You can translate at three levels:
- A single field — translate just one piece of text into one or more locales.
- A whole page — translate every localizable field on the page at once.
- In bulk — queue translations across many pages for a locale.
Each request creates a translation job you can track to completion. When it finishes, the target locale’s fields are populated as Draft suggestions for you to review.
Reviewing and the publish gate
Draft (unreviewed) translations are clearly marked. Reviewing one promotes it from Draft to Reviewed. This matters at publish time:
Publishing is blocked while a locale still has unreviewed (Draft) translations, unless an operator explicitly allows shipping them.
This keeps machine output from going live unseen.
Glossary
A per-space glossary controls how specific terms are handled:
- Do-not-translate — keep the source term exactly as written (brand names, product names).
- Per-locale override — force a specific translation for a term in a given locale.
Glossary rules always win over the model’s output.
Delivery API with locales
Pass ?locale=<code> to the delivery API to request a specific locale:
GET /api/v1/pages/by-path/about?locale=de-DEIf the requested locale is not published, the API returns a 404.