- 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
32 lines
1,017 B
TypeScript
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);
|
|
}
|