Localization
Rakomi ships with five GA locales out of the box: English, Polish, German, French, and Spanish. Every authentication surface uses the same resolution rules so an end-user sees the same language across login, sign-up, verification, MFA, and error screens.
Resolution precedence
Section titled “Resolution precedence”Hosted sign-in (accounts.rakomi.com)
Section titled “Hosted sign-in (accounts.rakomi.com)”Locale is picked by the first non-empty rule in this order:
- URL path prefix —
/{locale}/... - OpenID Connect
ui_localesquery parameter — first supported value wins NEXT_LOCALEcookie — set when the end-user clicks the language switcher- The tenant’s default language configured in the dashboard
- The browser’s
Accept-Languageheader (RFC 4647 lookup) en(hard default)
React SDK (@rakomi/react)
Section titled “React SDK (@rakomi/react)”The <RakomiProvider> picks the effective locale from:
- Explicit
<RakomiProvider locale="...">prop - Tenant default from the public tenant-config endpoint
navigator.languagemapped to the nearest supported localeen(hard default)
API (JSON error responses)
Section titled “API (JSON error responses)”Accept-Languageheader (RFC 4647 lookup against the five GA locales)- Authenticated tenant default
en(hard default)
Every non-OAuth JSON response echoes the resolved locale via Content-Language
and adds Vary: Accept-Language, Cookie for shared-cache safety.
Error-message contract
Section titled “Error-message contract”User-facing errors carry a machine-readable code (stable, English
message) and an optional message_localized in the resolved locale.
{ "error": { "code": "auth/invalid_credentials", "message": "Invalid email or password.", "message_localized": "Ungültige E-Mail-Adresse oder Passwort." }}Clients MUST fall back to message if message_localized is absent — for
example, when a rare error has not yet been translated or the request’s locale
falls outside the GA set. error.message is always English; it is never
substituted.
OAuth 2.0 endpoints (/oauth/*) follow RFC 6749 strictly: the error and
error_description fields remain in English, and message_localized is not
added. The visual consent screen rendered by the hosted app is still localized.
Setting the tenant default
Section titled “Setting the tenant default”In the Rakomi Dashboard, open Settings → Tenant → Default language. Choose one of the five locales or leave it on Auto-detect to let the browser decide. Changing the tenant default does not retroactively re-language active sessions — end-users keep their current preference.
Overriding UI strings in your app
Section titled “Overriding UI strings in your app”The React SDK accepts a translations prop on <RakomiProvider>. Provide a
partial object — missing keys fall back to the locale dictionary, then to
English.
<RakomiProvider clientId="pk_..." locale="en" translations={{ 'signIn.title': 'Welcome back', 'signIn.submitButton': 'Let me in', }}> <SignIn /></RakomiProvider>What is not yet localized
Section titled “What is not yet localized”- Operator dashboard — the admin tool is English and Polish only.
- Transactional emails (verification, password reset) — English and Polish only.
- Status page and landing page — handled on a separate roadmap.
- Right-to-left scripts (Arabic, Hebrew) — future roadmap.
Translation quality
Section titled “Translation quality”Initial non-English translations are produced with AI assistance and reviewed against a product glossary that pins the canonical form of critical terms (passkey, MFA, recovery code, etc.). Translation files are version-controlled so every change lands in a pull request with the usual review process; the build rejects files that drift out of sync, miss placeholders, or contain unsafe markup. If you spot a copy issue as an end-user, please report it — corrections are rolled into the next release.