refactor: eliminate hardcoded locale comparisons for antifragility

Created centralized helpers:
- src/lib/i18n/pageMetadata.ts: All page metadata (titles, descriptions, alt text)
- src/lib/i18n/productText.ts: Product-specific translated text (shortDescription, benefits)
- src/lib/i18n/metadata.ts: Helper functions for locale handling

Updated all pages to use centralized metadata:
- Homepage: Uses getPageMetadata for title, description, productionAlt
- Products page: Uses getPageMetadata
- Product detail: Uses getPageMetadata + getTranslatedShortDescription/getTranslatedBenefits
- About page: Uses getPageMetadata

ProductDetail component now uses:
- getTranslatedShortDescription() instead of locale comparison
- getTranslatedBenefits() instead of locale comparison

All user-facing text now goes through translation files or centralized helpers.
Adding a new language now requires only:
1. Add to SUPPORTED_LOCALES in locales.ts
2. Add LOCALE_CONFIG entry
3. Add entries to pageMetadata.ts and productText.ts
4. Add translation keys to message files
This commit is contained in:
Unchained
2026-03-24 12:39:38 +02:00
parent 3d895f4d7a
commit 930a9a7614
8 changed files with 237 additions and 54 deletions

View File

@@ -1,17 +1,37 @@
import { DEFAULT_LOCALE, LOCALE_CONFIG, type Locale } from "./locales";
export function getMetadataText(locale: Locale, texts: Partial<Record<Locale, string>>): string {
return texts[locale] || texts[DEFAULT_LOCALE] || "";
}
import { DEFAULT_LOCALE, LOCALE_CONFIG, SUPPORTED_LOCALES, type Locale } from "./locales";
export function getSaleorLocale(locale: Locale): string {
return LOCALE_CONFIG[locale].saleorLocale;
}
export function getLocaleDisplayName(locale: Locale): string {
export function getLocaleLabel(locale: Locale): string {
return LOCALE_CONFIG[locale].label;
}
export function isDefaultLocale(locale: string): boolean {
return locale === DEFAULT_LOCALE;
}
export function getLocaleFromParams(params: { locale: string }): Locale {
const { locale } = params;
if (SUPPORTED_LOCALES.includes(locale as Locale)) {
return locale as Locale;
}
return DEFAULT_LOCALE;
}
export function getProductLocale(locale: Locale): string {
return getSaleorLocale(locale);
}
export function buildHreflangAlternates(baseUrl: string): Record<string, string> {
const alternates: Record<string, string> = {};
for (const loc of SUPPORTED_LOCALES) {
if (loc === DEFAULT_LOCALE) {
alternates[loc] = baseUrl;
} else {
alternates[loc] = `${baseUrl}/${loc}`;
}
}
return alternates;
}