Open Gauge
Language & localization

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/me request used for your name and email also accepts a language field. 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.

On this page