- inject the Umami script at runtime only when VITE_UMAMI_SRC + VITE_UMAMI_WEBSITE_ID
are set (so dev/local traffic isn't tracked); website-id is public, not a secret
- web Dockerfile passes them as build args; docker-compose.prod.yml + env examples
document them (optional, empty = disabled)
Verified: build bakes the values in when set; skipped when unset.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- lightweight, dependency-free i18n: typed fr/en dictionaries (fr is the source
of truth, en must match its shape → compile error on drift), I18nProvider +
useI18n hook, browser detection + localStorage persistence
- FR/EN language switcher (home + room header)
- translated the whole player-facing flow: home, join, pseudo, room shell,
lobby (incl. settings, categories, bots, track submission, history),
quiz, blindtest, player-cards, round transitions, end screen (podium, awards,
tracks, rounds recap), and server-error messages (mapped by code)
- history dates localized to the active language
Content (questions/categories) intentionally left as-is. Back-office (admin)
not translated yet — internal, token-gated tool.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>