import type { MetadataRoute } from "next"; import { LANGS, routesByLang, type Lang, type PageKey } from "@/lib/i18n"; import { flags, site } from "@/lib/site"; /** Static export: metadata routes are prerendered; mark explicitly (Next static-exports guide). */ export const dynamic = "force-static"; type ChangeFrequency = NonNullable; type PageEntry = { page: PageKey; changeFrequency: ChangeFrequency; priority: number }; /* Die Messe-Landingpage steht nur in der Sitemap, solange die Messe bevorsteht. Gefunden wird sie ohnehin über den gedruckten QR-Code, nicht über die Suche – nach dem Event wäre sie ein Eintrag, der auf ein vergangenes Datum zeigt. */ const herCareerPages: ReadonlyArray = flags.showHerCareer ? [{ page: "herCareer", changeFrequency: "monthly", priority: 0.5 }] : []; const pages: ReadonlyArray = [ { page: "home", changeFrequency: "monthly", priority: 1 }, { page: "coaching", changeFrequency: "monthly", priority: 0.8 }, { page: "trainings", changeFrequency: "monthly", priority: 0.8 }, { page: "keynotes", changeFrequency: "monthly", priority: 0.8 }, ...herCareerPages, { page: "impressum", changeFrequency: "yearly", priority: 0.2 }, { page: "datenschutz", changeFrequency: "yearly", priority: 0.2 }, ]; /* Die englische Fassung ist eine Übersetzung, keine eigenständige Seite: gleiche Änderungsfrequenz, aber niedrigere Priorität, damit Deutsch die Originalfassung bleibt. Jeder Eintrag nennt über `alternates.languages` beide Fassungen – dasselbe hreflang, das die Seiten im tragen. */ const PRIORITY_FACTOR: Record = { de: 1, en: 0.9 }; export default function sitemap(): MetadataRoute.Sitemap { // Evaluated at build time (no request time in a static export): "last modified" = last build. const lastModified = new Date(); return LANGS.flatMap((lang) => pages.map(({ page, changeFrequency, priority }) => ({ url: `${site.url}${routesByLang[lang][page]}`, lastModified, changeFrequency, priority: Number((priority * PRIORITY_FACTOR[lang]).toFixed(2)), alternates: { languages: { de: `${site.url}${routesByLang.de[page]}`, en: `${site.url}${routesByLang.en[page]}`, }, }, })), ); }