feat: implement programmatic SEO for solutions pages

- Add 10 oil-for-concern solution pages with localized slugs
- Support 4 languages: sr, en, de, fr with proper canonical URLs
- Add solutions hub, by-concern, and by-oil directory pages
- Filter bundle products from solutions pages
- Add hideLangSwitcher prop to Header component
- Update translations for all languages
- Fix canonical URLs to include locale prefix
This commit is contained in:
Unchained
2026-04-08 13:29:42 +02:00
parent cca6f44139
commit 9d07a60d3f
26 changed files with 3120 additions and 1046 deletions

View File

@@ -2,7 +2,8 @@ import { readFile } from "fs/promises";
import { join } from "path";
import type {
OilForConcernPage,
LocalizedSEOKeywords
LocalizedSEOKeywords,
LocalizedString
} from "./types";
const DATA_DIR = join(process.cwd(), "data");
@@ -63,17 +64,24 @@ export async function getAllOilForConcernPages(): Promise<OilForConcernPage[]> {
}
export async function getAllSolutionSlugs(): Promise<Array<{ locale: string; slug: string }>> {
const slugs = await getAllOilForConcernSlugs();
const pages = await getAllOilForConcernPages();
const result: Array<{ locale: string; slug: string }> = [];
for (const slug of slugs) {
for (const page of pages) {
for (const locale of ["sr", "en", "de", "fr"] as const) {
result.push({
locale,
slug
slug: page.localizedSlugs[locale]
});
}
}
return result;
}
export async function getOilForConcernPageBySlug(slug: string, locale: string): Promise<OilForConcernPage | null> {
const pages = await getAllOilForConcernPages();
return pages.find(page =>
page.localizedSlugs[locale as "sr" | "en" | "de" | "fr"] === slug
) || null;
}