Languages (i18n)

Configure which locales your site supports, designate a default, and unlock translatable entries and settings.

Routes

RouteMethodPurpose
/admin/languagesGETList languages
/admin/languages/createGETNew language
/admin/languagesPOSTCreate
/admin/languages/{language}/editGETEdit
/admin/languages/{language}PUTUpdate
/admin/languages/{language}DELETEDelete (blocked if default)
/admin/languages/{language}/set-defaultPATCHSet as default locale
/admin/languages/{language}/toggle-activePATCHActivate / deactivate

Language record

How localization is applied

Entries

If a content model has is_localized = true, each entry has a locale column. The unique constraint (content_model_id, slug, locale) lets the same slug exist across languages.

Settings

Settings marked is_translatable = true store their value as a JSON object keyed by locale code. The setting() helper resolves to the current locale, falling back to the default.

Slugs and URLs

Slugs are scoped per locale, so the same content can have language-appropriate URLs (e.g. /en/about vs /es/acerca-de).

Public locale endpoint

GET /api/v1/i18n/locales

Returns the list of active locales for use in frontend language switchers — no API key required. See API: Settings & Locales.

Deleting a languageBlocked while it is the default. Reassign default first. Existing entries in the deleted locale are kept; you can either re-enable the language or migrate them manually.