Language & localization
Switching the app's display language, how the preference is stored, and what stays untranslated by design.
Open Gauge's web app is available in English (the canonical language), Spanish, French, and German. Each user picks their own display language independently of everyone else in their organization.
Switching language
Click the globe icon next to the light/dark theme toggle in the top bar, and pick a language from the dropdown. The page reloads immediately in the new language — there's no separate save step.
Where the preference is stored
The choice is saved in two places so it behaves correctly whether or not you're signed in:
- A cookie, set the moment you pick a language. This is what a signed-out visitor's choice relies on, and it also gives an immediate switch before any server round-trip.
- Your user profile (once signed in) — the same
PATCH /users/merequest used for your name and email also accepts alanguagefield. On your next sign-in from a different browser or device, your saved profile language wins over that device's cookie or browser locale, so your preference follows you around rather than being tied to one machine.
URL structure
English pages are unprefixed (/dashboard, /assets, …). Spanish, French, and German pages carry
a locale prefix (/es/dashboard, /fr/assets, /de/...). This means every link and bookmark that
existed before multilingual support shipped keeps working exactly as it did — only non-English
locales gained a prefix, nothing changed for English.
What's translated — and what isn't
Every page and control in the authenticated app is translated: navigation, forms, tables, modals, error and empty states, the admin screens, the sign-in/register/forgot-password/reset-password/ verify-email flow, every enum-driven dropdown (physical quantities, sensor technologies, calibration status, roles, and so on), the activity log's action descriptions, and the Privacy Policy and Terms of Service pages.
This Knowledge Center is translated too — both here on the standalone docs site and in the copy embedded inside the app at Documentation in the sidebar. Pages translate independently of one another: a guide page without a translation yet simply falls back to showing its English content, so translation coverage can grow over time without ever leaving a page blank.
User-entered content is the one thing deliberately left untranslated: asset names, calibration notes, audit-log free text, and anything else a person typed in. Machine-translating someone else's data would silently change what they wrote, so it's always shown back exactly as entered, regardless of the viewer's chosen language.
The Privacy Policy and Terms of Service are shipped as an editable template — see the note at the bottom of each page. Their translations are a starting point; like the English original, operators are expected to have them reviewed by their own counsel before relying on them, especially for a jurisdiction with specific legal-language requirements.
The documentation site
The standalone docs site at docs.opengauge.org has its own language
switcher in the top nav, next to the theme toggle. It follows the same URL scheme as the app:
English pages are unprefixed (/docs/guide), Spanish/French/German carry a locale prefix
(/es/docs/guide, /fr/docs/guide, /de/docs/guide). The auto-generated API Reference
(/docs/api/...) stays English-only in every language, since it's machine-generated from the
OpenAPI schema rather than hand-written prose.
The marketing site
The separate marketing site at opengauge.org — a different codebase from
the app itself — has its own matching language switcher next to its light/dark toggle, with full
Spanish, French, and German versions of the homepage and its own Privacy Policy/Terms of Service
pages. First-time visitors are redirected based on their browser's Accept-Language header;
picking a language explicitly overrides that for future visits.
Adding a language (for self-hosters modifying their own instance)
The app's locale list is a single config array
(apps/web/src/i18n/locales.ts) plus one JSON message file per feature area under
apps/web/messages/{locale}/. Supporting an additional language is a content-only change — add a
LocaleMeta entry and the translated JSON files; no application code needs to change. This isn't
something a running instance can do without rebuilding the app, though — it's a source change for
whoever maintains the deployment, not an in-app setting.
This Knowledge Center's locale list lives separately, in apps/docs/src/lib/i18n.ts — adding a
guide-page translation is likewise content-only: drop a page.{locale}.mdx / meta.{locale}.json
sibling next to the English source and it's picked up automatically, with no code change.