import Footer from '@/components/Footer'; import Header from '@/components/Header'; import JsonLd from '@/components/JsonLd'; import AnalyticsProvider from '@/components/analytics/AnalyticsProvider'; import CMSConnectivityNotice from '@/components/CMSConnectivityNotice'; import { FeedbackOverlay } from '@mintel/next-feedback'; import { Metadata, Viewport } from 'next'; import { NextIntlClientProvider } from 'next-intl'; import { getMessages } from 'next-intl/server'; import { Suspense } from 'react'; import '../../styles/globals.css'; import { SITE_URL } from '@/lib/schema'; import { config } from '@/lib/config'; import { setRequestLocale } from 'next-intl/server'; export const metadata: Metadata = { metadataBase: new URL(SITE_URL), icons: { icon: [ { url: '/favicon.ico', sizes: 'any' }, { url: '/logo-blue.svg', type: 'image/svg+xml' }, ], apple: [{ url: '/apple-touch-icon.png', sizes: '180x180', type: 'image/png' }], }, }; export const viewport: Viewport = { width: 'device-width', initialScale: 1, maximumScale: 1, userScalable: false, viewportFit: 'cover', themeColor: '#001a4d', }; export default async function LocaleLayout({ children, params, }: { children: React.ReactNode; params: Promise<{ locale: string }>; }) { const { locale } = await params; // Ensure locale is a valid string, fallback to 'en' const supportedLocales = ['en', 'de']; const localeStr = (typeof locale === 'string' ? locale : '').trim(); const safeLocale = supportedLocales.includes(localeStr) ? localeStr : 'en'; setRequestLocale(safeLocale); let messages = {}; try { messages = await getMessages(); } catch (error) { console.error(`Failed to load messages for locale '${safeLocale}':`, error); messages = {}; } // Track pageview on the server with high-fidelity header context const { getServerAppServices } = await import('@/lib/services/create-services.server'); const serverServices = getServerAppServices(); // We wrap this in a try-catch to allow static rendering during build // headers() and cookies() force dynamic rendering in Next.js try { const { headers } = await import('next/headers'); const requestHeaders = await headers(); if ('setServerContext' in serverServices.analytics) { (serverServices.analytics as any).setServerContext({ userAgent: requestHeaders.get('user-agent') || undefined, language: requestHeaders.get('accept-language')?.split(',')[0] || undefined, referrer: requestHeaders.get('referer') || undefined, ip: requestHeaders.get('x-forwarded-for')?.split(',')[0] || undefined, }); } // Track initial server-side pageview serverServices.analytics.trackPageview(); } catch { // Falls back to noop or client-side only during static generation if (process.env.NODE_ENV !== 'production' || !process.env.CI) { console.warn( '[Layout] Static generation detected or headers unavailable, skipping server-side analytics context', ); } } return (
{children}