Some checks failed
Dev Deployment (Zero Downtime) / deploy-dev (push) Failing after 9m19s
Fixed missing types, import errors, and updated test suites to match the new editorial design. Verified Docker container build.
57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
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 (
|
|
<NextIntlClientProvider locale={locale} messages={messages}>
|
|
{children}
|
|
<ConsentBanner />
|
|
</NextIntlClientProvider>
|
|
);
|
|
}
|
|
|