// 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. */ export async function getLocale(): Promise { const store = await cookies(); const value = store.get(LOCALE_COOKIE)?.value; const active = await listActiveLanguageCodes(); return isLocale(value, active) ? value : 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 { 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; }