import { notFound } from 'next/navigation'; import { NextIntlClientProvider } from 'next-intl'; import { getMessages, setRequestLocale } from 'next-intl/server'; import { Inter } from 'next/font/google'; import { locales, localeMetadata, seoKeywords, type Locale } from '@/i18n/config'; import type { Metadata } from 'next'; import { Header, Footer, GlobalBackground } from '@/components/layout'; import { PersonJsonLd, ProfessionalServiceJsonLd, OrganizationJsonLd, WebSiteJsonLd } from '@/components/seo'; import '../globals.css'; const inter = Inter({ subsets: ['latin'], display: 'swap', variable: '--font-inter', }); type Props = { children: React.ReactNode; params: Promise<{ locale: string }>; }; export function generateStaticParams() { return locales.map((locale) => ({ locale })); } export async function generateMetadata({ params }: Props): Promise { const { locale } = await params; const currentLocale = locale as Locale; const meta = localeMetadata[currentLocale] || localeMetadata.de; const keywords = seoKeywords[currentLocale] || seoKeywords.de; const BASE_URL = process.env.NEXT_PUBLIC_SITE_URL || 'https://damjan-savic.com'; const titles: Record = { de: 'Damjan Savić | Fullstack Developer aus Köln', en: 'Damjan Savić | Fullstack Developer from Cologne', sr: 'Damjan Savić | Fullstack Developer iz Kelna', }; const descriptions: Record = { de: 'Fullstack Entwicklung für Websites, Apps und SaaS mit Next.js, React und TypeScript.', en: 'Fullstack development for websites, apps and SaaS with Next.js, React and TypeScript.', sr: 'Fullstack razvoj za web stranice, aplikacije i SaaS sa Next.js, React i TypeScript.', }; // Generate alternates using localeMetadata const languageAlternates: Record = { 'x-default': `${BASE_URL}/de`, }; locales.forEach((loc) => { languageAlternates[loc] = `${BASE_URL}/${loc}`; }); // Generate OG alternate locales const allOgLocales = locales.map((loc) => localeMetadata[loc].ogLocale); const alternateOgLocales = allOgLocales.filter((l) => l !== meta.ogLocale); return { title: { template: '%s | Damjan Savić', default: titles[currentLocale] || titles.de, }, description: descriptions[currentLocale] || descriptions.de, keywords: keywords, alternates: { canonical: `${BASE_URL}/${locale}`, languages: languageAlternates, }, openGraph: { type: 'website', locale: meta.ogLocale, alternateLocale: alternateOgLocales, siteName: 'Damjan Savić', images: [ { url: '/images/og-image.jpg', width: 1200, height: 630, alt: locale === 'de' ? 'Damjan Savić - KI & Automatisierung Spezialist' : locale === 'sr' ? 'Damjan Savić - AI & Automatizacija Specijalista' : 'Damjan Savić - AI & Automation Specialist', }, ], }, twitter: { card: 'summary_large_image', creator: '@damjansavic', }, }; } export default async function LocaleLayout({ children, params }: Props) { const { locale } = await params; if (!locales.includes(locale as Locale)) { notFound(); } setRequestLocale(locale); const messages = await getMessages(); return ( {/* Preconnect für bessere Performance */} {/* Theme Color für mobile Browser */} {/* JSON-LD Structured Data */}
{children}
); }