import { NextIntlClientProvider } from "next-intl"; import { setRequestLocale } from "next-intl/server"; import React from "react"; import { notFound } from "next/navigation"; import ConsentBanner from "../components/ConsentBanner"; // Supported locales - must match middleware.ts const SUPPORTED_LOCALES = ["en", "de"] as const; type SupportedLocale = (typeof SUPPORTED_LOCALES)[number]; function isValidLocale(locale: string): locale is SupportedLocale { return SUPPORTED_LOCALES.includes(locale as SupportedLocale); } async function loadEnhancedMessages(locale: SupportedLocale) { // Lade basis JSON Messages const baseMessages = (await import(`../../messages/${locale}.json`)).default; // Erweitere mit Directus (wenn verfügbar) // Für jetzt: return base messages, Directus wird per Server Component geladen return baseMessages; } // Define valid static params to prevent malicious path traversal export function generateStaticParams() { return SUPPORTED_LOCALES.map((locale) => ({ locale })); } export default async function LocaleLayout({ children, params, }: { children: React.ReactNode; params: Promise<{ locale: string }>; }) { const { locale } = await params; // Security: Validate locale to prevent malicious imports if (!isValidLocale(locale)) { notFound(); } // Ensure next-intl actually uses the route segment locale for this request. setRequestLocale(locale); // Load messages explicitly by route locale to avoid falling back to the wrong // language when request-level locale detection is unavailable/misconfigured. const messages = await loadEnhancedMessages(locale); return ( {children} ); }