getLocale() fiel bei fehlendem/ungültigem Cookie bisher immer fest auf Deutsch zurück, auch wenn Deutsch im Sprachen-Admin deaktiviert wurde. Da der Sprachumschalter sich bei nur einer aktiven Sprache zusätzlich ausblendet, gab es keine Möglichkeit, das über die Oberfläche zu korrigieren. Fallback nutzt jetzt Deutsch nur noch, wenn es aktiv ist.
41 lines
1.8 KiB
TypeScript
41 lines
1.8 KiB
TypeScript
// Nur für Server-Komponenten/Routen importieren (next/headers, DB)!
|
||
// Client-Komponenten müssen stattdessen "@/lib/i18n/shared" verwenden,
|
||
// sonst landet next/headers/die DB-Anbindung im Client-Bundle.
|
||
|
||
import "server-only";
|
||
import { cookies } from "next/headers";
|
||
import { listActiveLanguageCodes, listTranslations } from "@/lib/db/languages";
|
||
import { dictionaries, type Dict } from "./dictionaries";
|
||
import { flattenDict, unflattenDict } from "./flatten";
|
||
import { DEFAULT_LOCALE, isLocale, type Locale } from "./locales";
|
||
import { LOCALE_COOKIE } from "./shared";
|
||
|
||
export * from "./shared";
|
||
|
||
/** Aktuelle Sprache aus dem Cookie lesen, validiert gegen die aktiven
|
||
* Sprachen (Server-Komponenten). Ungültig oder nicht mehr aktiv →
|
||
* Basis-Sprache, sofern die noch aktiv ist – sonst die erste aktive
|
||
* Sprache (z. B. wenn Deutsch im Admin-Bereich deaktiviert wurde). */
|
||
export async function getLocale(): Promise<Locale> {
|
||
const store = await cookies();
|
||
const value = store.get(LOCALE_COOKIE)?.value;
|
||
const active = await listActiveLanguageCodes();
|
||
if (isLocale(value, active)) return value;
|
||
if (active.includes(DEFAULT_LOCALE)) return DEFAULT_LOCALE;
|
||
return active[0] ?? DEFAULT_LOCALE;
|
||
}
|
||
|
||
/** Wörterbuch für eine Sprache. Nicht-deutsche Sprachen werden aus der
|
||
* Datenbank geladen und mit der deutschen Vorlage aufgefüllt – fehlt
|
||
* eine Übersetzung (z. B. nach einem Update mit neuen Texten), zeigt
|
||
* die App automatisch den deutschen Text statt leer zu bleiben. */
|
||
export async function getDictionary(locale: Locale): Promise<Dict> {
|
||
if (locale === DEFAULT_LOCALE) return dictionaries.de;
|
||
const rows = await listTranslations(locale);
|
||
const flat = flattenDict(dictionaries.de);
|
||
for (const row of rows) {
|
||
if (row.key in flat) flat[row.key] = row.value;
|
||
}
|
||
return unflattenDict(flat) as Dict;
|
||
}
|