import { config } from '@/lib/config'; import { MetadataRoute } from 'next'; import { getAllProductsMetadata } from '@/lib/mdx'; import { getAllPostsMetadata } from '@/lib/blog'; import { getAllPagesMetadata } from '@/lib/pages'; import { mapFileSlugToTranslated } from '@/lib/slugs'; export const revalidate = 3600; // Revalidate every hour export default async function sitemap(): Promise { const baseUrl = process.env.CI ? 'http://klz.localhost' : config.baseUrl || 'https://klz-cables.com'; const locales = ['de', 'en']; const sitemapEntries: MetadataRoute.Sitemap = []; for (const locale of locales) { // Helper to generate localized URL Segment const getLocalizedRoute = async (pageKey: string) => { if (pageKey === '') return ''; const translated = await mapFileSlugToTranslated(pageKey, locale); return `/${translated}`; }; // Static routes const staticPages = ['', 'blog', 'contact', 'team', 'products']; for (const page of staticPages) { const localizedRoute = await getLocalizedRoute(page); sitemapEntries.push({ url: `${baseUrl}/${locale}${localizedRoute}`, lastModified: new Date(), changeFrequency: page === '' ? 'daily' : 'weekly', priority: page === '' ? 1 : 0.8, }); } // Categories routes const productCategories = [ 'low-voltage-cables', 'medium-voltage-cables', 'high-voltage-cables', 'solar-cables', ]; const translatedProducts = await mapFileSlugToTranslated('products', locale); for (const category of productCategories) { const translatedCategory = await mapFileSlugToTranslated(category, locale); sitemapEntries.push({ url: `${baseUrl}/${locale}/${translatedProducts}/${translatedCategory}`, lastModified: new Date(), changeFrequency: 'weekly', priority: 0.8, }); } // Products const productsMetadata = await getAllProductsMetadata(locale); for (const product of productsMetadata) { if (!product.frontmatter || !product.slug) continue; const category = product.frontmatter.categories[0]?.toLowerCase().replace(/\s+/g, '-') || 'other'; const translatedCategory = await mapFileSlugToTranslated(category, locale); const translatedSlug = await mapFileSlugToTranslated(product.slug, locale); sitemapEntries.push({ url: `${baseUrl}/${locale}/${translatedProducts}/${translatedCategory}/${translatedSlug}`, lastModified: new Date(), changeFrequency: 'monthly', priority: 0.7, }); } // Blog posts const translatedBlog = await mapFileSlugToTranslated('blog', locale); const postsMetadata = await getAllPostsMetadata(locale); for (const post of postsMetadata) { if (!post.frontmatter || !post.slug) continue; const translatedSlug = await mapFileSlugToTranslated(post.slug, locale); sitemapEntries.push({ url: `${baseUrl}/${locale}/${translatedBlog}/${translatedSlug}`, lastModified: new Date(post.frontmatter.date), changeFrequency: 'monthly', priority: 0.6, }); } // Static pages const pagesMetadata = await getAllPagesMetadata(locale); for (const page of pagesMetadata) { if (!page.slug) continue; const translatedSlug = await mapFileSlugToTranslated(page.slug, locale); sitemapEntries.push({ url: `${baseUrl}/${locale}/${translatedSlug}`, lastModified: new Date(), changeFrequency: 'monthly', priority: 0.5, }); } } return sitemapEntries; }