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>
45 lines
1.8 KiB
TypeScript
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
|
|
}
|