jalil.arfaoui.net/src/utils/page-translations.ts
Jalil Arfaoui 23510f59b1 Infrastructure SEO complète : sitemap, meta descriptions, OG, Twitter Cards, JSON-LD, hreflang
- Ajout de site: 'https://jalil.arfaoui.net' et @astrojs/sitemap avec support i18n dans astro.config.mjs
- Création de src/components/SEO.astro : meta description, canonical, Open Graph, Twitter Cards, hreflang (fr/en/ar/x-default), JSON-LD Person (11 liens sameAs) sur chaque page et JSON-LD WebSite sur les pages d'accueil
- Création de src/utils/page-translations.ts : mapping centralisé des URLs entre langues
- Fix lang="en" hardcodé dans main.astro → lang dynamique + dir="rtl" pour l'arabe
- Ajout de meta descriptions ciblées sur les 13 pages principales (FR/EN/AR)
- Refactorisation du LanguageSwitcher pour utiliser le mapping centralisé
- Ajout de la directive Sitemap dans robots.txt
2026-02-21 14:37:54 +01:00

32 lines
1,017 B
TypeScript

import type { Locale } from "./i18n";
/**
* Groupes de pages traduites.
* Chaque groupe contient les URLs correspondantes pour chaque langue.
*/
const translationGroups: Record<Locale, string>[] = [
{ fr: "/", en: "/en", ar: "/ar" },
{ fr: "/a-propos", en: "/en/about", ar: "/ar/نبذة-عني" },
{ fr: "/code", en: "/en/code", ar: "/ar/برمجة" },
{ fr: "/theatre", en: "/en/acting", ar: "/ar/مسرح" },
{ fr: "/photo", en: "/en/photo", ar: "/ar/تصوير" },
];
/** Index inversé : pathname → groupe de traduction */
const pathIndex = new Map<string, Record<Locale, string>>();
for (const group of translationGroups) {
for (const path of Object.values(group)) {
pathIndex.set(path, group);
}
}
/**
* Retourne les URLs alternatives pour un pathname donné.
* Les trailing slashes sont normalisés.
*/
export function getAlternateUrls(
pathname: string,
): Record<Locale, string> | undefined {
const normalized = pathname.replace(/\/$/, "") || "/";
return pathIndex.get(normalized);
}