teecup/frontend/components/locale-bootstrap.tsx
Erol Haagenrud 5355aba75d Ekte i18n (next-intl) + hjelpeside/FAQ + Spillere-tabellen slått videre sammen (ADR-094)
Grunnmur for oversettelse (cookie-basert, ingen URL-endring), ny
/hjelp-side med oversikt+FAQ på norsk og engelsk, og Deltakere+
Rundedeltakelse slått sammen til én bred tabell i Spillere-steget.
Resten av appens ~2200 strenger og 479 backend-feilkoder er bevisst
utsatt til senere, avgrensede runder -- se FEATURE_BACKLOG.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-19 07:54:07 +02:00

45 lines
1.8 KiB
TypeScript

"use client"
// i18n (ADR-094) -- monteres én gang i rot-layouten. Selve locale-
// oppløsningen på serveren (i18n/request.ts) leser KUN en cookie, uten
// noen fetch-avhengighet (rask, synkron). Denne komponenten er stedet
// der brukerens preferred_locale (allerede på backend siden ADR-015,
// aldri lest av frontend før nå) faktisk får virkning: FØRSTE gang en
// innlogget bruker besøker appen uten at cookien er satt ennå, hentes
// /auth/me og cookien settes deretter -- kun én gang, ikke ved hvert
// besøk (cookien vinner etter det, selv om brukeren senere endrer
// preferred_locale et annet sted, inntil de bruker språkbryteren igjen).
import { useEffect } from "react"
import { useRouter } from "next/navigation"
import { DEFAULT_LOCALE, isLocale, LOCALE_COOKIE } from "@/lib/locale"
function hasLocaleCookie(): boolean {
return document.cookie.split("; ").some((c) => c.startsWith(`${LOCALE_COOKIE}=`))
}
export function LocaleBootstrap() {
const router = useRouter()
useEffect(() => {
if (hasLocaleCookie()) return
let cancelled = false
fetch("/auth/me", { credentials: "include" })
.then((res) => (res.ok ? res.json() : null))
.then((me: { preferred_locale?: string } | null) => {
if (cancelled || !me) return
const locale = isLocale(me.preferred_locale) ? me.preferred_locale : DEFAULT_LOCALE
if (locale === DEFAULT_LOCALE) return // allerede det serveren rendret med
document.cookie = `${LOCALE_COOKIE}=${locale}; path=/; max-age=31536000; SameSite=Lax`
router.refresh()
})
.catch(() => {
// Stille -- utlogget/nettverksfeil betyr bare at nb-standarden
// (allerede rendret) beholdes.
})
return () => {
cancelled = true
}
}, [router])
return null
}