diff --git a/app/[locale]/[slug]/page.tsx b/app/[locale]/[slug]/page.tsx index e647a88d..3542e148 100644 --- a/app/[locale]/[slug]/page.tsx +++ b/app/[locale]/[slug]/page.tsx @@ -1,7 +1,7 @@ import { notFound } from 'next/navigation'; import { MDXRemote } from 'next-mdx-remote/rsc'; import { Container, Badge, Heading } from '@/components/ui'; -import { getTranslations } from 'next-intl/server'; +import { getTranslations, setRequestLocale } from 'next-intl/server'; import { Metadata } from 'next'; import { getPageBySlug, getAllPages } from '@/lib/pages'; import { mdxComponents } from '@/components/blog/MDXComponents'; @@ -62,6 +62,7 @@ export async function generateMetadata({ params }: PageProps): Promise export default async function StandardPage({ params }: PageProps) { const { locale, slug } = await params; + setRequestLocale(locale); const pageData = await getPageBySlug(slug, locale); const t = await getTranslations('StandardPage'); diff --git a/app/[locale]/blog/[slug]/page.tsx b/app/[locale]/blog/[slug]/page.tsx index 9d28a65f..6c21ebfb 100644 --- a/app/[locale]/blog/[slug]/page.tsx +++ b/app/[locale]/blog/[slug]/page.tsx @@ -12,6 +12,7 @@ import TableOfContents from '@/components/blog/TableOfContents'; import { mdxComponents } from '@/components/blog/MDXComponents'; import { Heading } from '@/components/ui'; import { getOGImageMetadata } from '@/lib/metadata'; +import { setRequestLocale } from 'next-intl/server'; interface BlogPostProps { params: Promise<{ @@ -57,6 +58,7 @@ export async function generateMetadata({ params }: BlogPostProps): Promise diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index eaee3a6f..0dceaccf 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -7,9 +7,11 @@ 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), @@ -45,6 +47,8 @@ export default async function LocaleLayout({ const localeStr = (typeof locale === 'string' ? locale : '').trim(); const safeLocale = supportedLocales.includes(localeStr) ? localeStr : 'en'; + setRequestLocale(safeLocale); + let messages = {}; try { messages = await getMessages(); @@ -57,21 +61,32 @@ export default async function LocaleLayout({ const { getServerAppServices } = await import('@/lib/services/create-services.server'); const serverServices = getServerAppServices(); - const { headers } = await import('next/headers'); - const requestHeaders = await headers(); + // 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, - }); + 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 (e) { + // 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', + ); + } } - // Track initial server-side pageview - serverServices.analytics.trackPageview(); - return ( @@ -82,7 +97,9 @@ export default async function LocaleLayout({