/en/...)Ce dossier contient le mirroir anglais des pages FR de src/pages/. Il existe
12 pages EN, une par page FR « mirrorable » (cf. liste des exclusions
ci-dessous). Ce README documente le patron de réplication à suivre pour
ajouter une nouvelle page EN ou faire évoluer une page existante.
Chaque page EN est un mirroir quasi-littéral de son équivalent FR : même
structure de sections, mêmes composants, mêmes requêtes Directus — seule la
locale change ('fr' → 'en'), ainsi que les chemins et libellés qui en
dépendent. Les clés i18n existent déjà dans fr.json/en.json ; aucune
nouvelle clé n’est nécessaire pour les mirroirs EN.
Configuré dans astro.config.mjs :
i18n: {
locales: ['fr', 'en'],
defaultLocale: 'fr',
routing: { prefixDefaultLocale: false, redirectToDefaultLocale: false },
}
Conséquence : les pages FR vivent à la racine (/), les pages EN vivent sous
src/pages/en/ et sont servies sous /en/....
currentPath : la règle à ne jamais oublierNav.astro calcule isActive(href) via localizeHref(href, locale) (qui
ajoute le préfixe /en pour la locale anglaise) et compare au currentPath
reçu par <BaseLayout>.
Conséquence : pour toute page EN, currentPath DOIT inclure le préfixe
/en.
Deux cas :
currentPath={sectionPath('<section>', locale)} — sectionPath résout déjà
/en/... pour la locale 'en'.path
sans préfixe) : currentPath={localizePath(path, locale)} —
localizePath ajoute le préfixe /en.path passé à buildSeoMetaLe paramètre path de buildSeoMeta est toujours sans préfixe de locale.
buildSeoMeta calcule en interne
canonical = ${SITE_URL}${localePrefix}${path} où
localePrefix = locale === 'fr' ? '' : '/en'.
Pour les mirroirs EN, path est donc l’équivalent EN du chemin, sans /en :
/about, /services, /case-studies/${slug}, /resources/${slug},
/contact, /contact/thank-you, /search, etc.
getStaticPaths + alternatesPour les pages de détail ([slug].astro), getStaticPaths() est construit à
partir des slugs EN natifs :
export async function getStaticPaths() {
const items = await getServices('en'); // ou getCaseStudies / getBlogPosts
return items.map((item) => ({ params: { slug: item.slug }, props: { key: item.key /* ou id */ } }));
}
Pour résoudre l’équivalent FR (lien alternate / hreflang), on utilise les
helpers get*SlugsByLocale() (getServiceSlugsByLocale,
getCaseStudySlugsByLocale, getBlogPostSlugsByLocale), qui renvoient
Record<string, Partial<Record<Locale, string>>> indexé par un identifiant
stable (key pour les services, id pour les cas clients et articles) :
const slugsByKey = await getServiceSlugsByLocale();
const translatedSlugs = slugsByKey[item.key] ?? {};
alternateUrl() vs. alternateHref manuelSi le chemin de base FR/EN est identique (ex. /services), utiliser
alternateUrl({ currentLocale, translatedSlugs, basePath }) (depuis
@i18n/utils).
Si le chemin de base FR/EN diffère (ex. /cas-clients vs.
/case-studies, /ressources vs. /resources), calculer alternateHref
manuellement via sectionPath('<section>', 'fr'), qui résout déjà le bon
préfixe par locale :
// Les chemins de section EN (/case-studies) et FR (/cas-clients) diffèrent :
// sectionPath résout déjà le bon préfixe par locale.
const alternateHref = translatedSlugs.fr
? `${sectionPath('caseStudies', 'fr')}/${translatedSlugs.fr}`
: null;
Ces pages FR n’ont pas d’équivalent sous /en/ ; leur translatedPaths.en
(et/ou .fr) vaut null :
/ressources/categorie/[slug] (catégories de blog)/ressources/guides et /ressources/guides/[slug] (guides téléchargeables)/lp/[slug] (landing pages de campagne)/mentions-legales/politique-de-confidentialite/enLa page 404 (src/pages/404.astro) n’est pas dupliquée sous /en/404. Une
URL /en/... inexistante affichera donc la 404 par défaut d’Astro (locale FR
par défaut côté contenu). Acceptable pour ce périmètre — à traiter dans une
itération ultérieure si besoin (ex. src/pages/en/404.astro mirroir).
| Page EN | Mirroir de | Chemin (sans préfixe) |
|---|---|---|
en/index.astro | index.astro | / |
en/expertise.astro | expertise.astro | /expertise |
en/methodology.astro | methodologie.astro | /methodology |
en/about.astro | a-propos.astro | /about |
en/services/index.astro | services/index.astro | /services |
en/services/[slug].astro | services/[slug].astro | /services/:slug |
en/case-studies/index.astro | cas-clients/index.astro | /case-studies |
en/case-studies/[slug].astro | cas-clients/[slug].astro | /case-studies/:slug |
en/resources/index.astro | ressources/index.astro | /resources |
en/resources/[slug].astro | ressources/[slug].astro | /resources/:slug |
en/contact/index.astro | contact/index.astro | /contact |
en/contact/thank-you.astro | contact/merci.astro | /contact/thank-you |
en/search/index.astro | recherche/index.astro | /search |