Request→cookie NEXT_LOCALE set?→Yes → use it (if supported)→No → Accept-Language supported?→Yes → use it→No → en
Paths never contain the language. A shared link (/servers) opens in the reader's own language.
The language switcher is on every page, including the sign-in pages; it sets the cookie, reloads the same page, and (once the profile has a language field) saves it to the profile Missing.
Send Accept-Language: <locale> on every API call, so Laravel validation and error messages come back translated. Confirmed 2026-10-08 (1.10): a middleware reads the header and sets the language, falling back to EnglishV8 requirement. The BFF must set this header itself — a server-side fetch carries no browser headers, so read the locale cookie and attach it on every call, or everything arrives in English.
Forward the same header to OSS. OSS already localises its message fields. OSS API
Prefer codes in API errors (code: "PLAN_LIMIT_REACHED") mapped to frontend keys, with the backend message as a fallback.
Audit and notification entries carry action/type keys + params, so they render in the viewer's language (V7 stored English sentences).
User data (server names, organization names, member names), raw OSS output (logs, command output), and plan names unless the API provides translations Open question.