Intégration Astro (ts-intl-astro)
ts-intl-astro est un paquet d’intégration pour Astro conçu au-dessus de la bibliothèque principale @aaakul/ts-intl. En gérant l’état de la langue de la requête grâce au contexte asynchrone (AsyncLocalStorage), il élimine complètement la nécessité de transmettre les props de langue à travers l’arbre de composants (Prop Drilling).
Fonctionnalités clés
- Zéro Prop Drilling : Grâce à
AsyncLocalStorageet aux middlewares Astro dans Node.js et les environnements d’exécution modernes, n’importe quel composant peut directement appeleruseTranslations()pour accéder aux fonctions de traduction de la langue active de la requête. - Injection automatique de middleware : L’enregistrement de l’intégration dans
astro.config.mjsinjecte automatiquement un middleware en amont du pipeline de rendu d’Astro pour résoudre la langue active de la page. Prend en chargecontext.currentLocale, les paramètres de route ([lang],[locale]) et l’analyse de chemin d’URL. - Sécurité de typage stricte : Hérite de l’inférence de types complète à la compilation de
ts-intl, incluant les contraintes d’espaces de noms, l’autocomplétion des clés, la validation des paramètres ICU et la vérification de parité des dictionnaires multilingues.
Installation
Installez ts-intl-astro et ses dépendances dans votre projet Astro :
pnpm add ts-intl-astro
# ou
npm install ts-intl-astro
# ou
yarn add ts-intl-astro
Configuration rapide
1. Initialiser l’instance i18n
Créez et exportez les hooks de traduction ainsi que la configuration de l’instance dans src/i18n/index.ts :
// src/i18n/index.ts
import { createAstroI18n } from "ts-intl-astro";
import frFR from "./messages/fr-FR";
import enUS from "./messages/en-US";
export const {
useTranslations,
useLocale,
useFormatter,
languages,
defaultLanguage,
} = createAstroI18n({
defaultLanguage: "fr-FR",
messages: {
"fr-FR": frFR,
"en-US": enUS,
},
});
export type SupportedLanguage = (typeof languages)[number];
2. Enregistrer l’intégration Astro
Importez et activez tsIntl dans votre fichier astro.config.mjs :
// astro.config.mjs
import { defineConfig } from "astro/config";
import tsIntl from "ts-intl-astro";
export default defineConfig({
integrations: [tsIntl()],
});
L’intégration enregistre automatiquement un middleware de contexte lors du build d’Astro et à l’exécution. Lorsqu’une page traite une requête ou génère des pages statiques, le middleware résout la langue de la route et injecte le contexte actif dans la portée de la requête.
Utilisation dans les composants
Lorsque le middleware de contexte est activé, les composants n’ont pas besoin de déclarer ni d’accepter une prop lang :
Utilisation de base
---
// src/components/Header.astro
import { useTranslations, useLocale } from "@/i18n";
const t = useTranslations("nav");
const lang = useLocale();
---
<header class="flex items-center justify-between p-4">
<nav class="space-x-4">
<a href={`/${lang}`}>{t("home")}</a>
<a href={`/${lang}/docs`}>{t("docs")}</a>
<a href={`/${lang}/pricing`}>{t("pricing")}</a>
</nav>
</header>
Remplacement explicite de la langue
Lorsqu’un composant isolé doit être rendu dans une langue spécifique (par exemple dans l’aperçu d’un sélecteur de langue), transmettez l’option { locale } pour écraser la valeur par défaut :
---
import { useTranslations } from "@/i18n";
const tEn = useTranslations("hero", { locale: "en-US" });
---
<p>{tEn("title")}</p>
Utilisation des formateurs
Appelez useFormatter() pour accéder aux formateurs Web Intl mis en cache et liés au contexte de langue actuel :
---
import { useFormatter } from "@/i18n";
const fmt = useFormatter();
const formattedPrice = fmt.number(129.99, { style: "currency", currency: "EUR" });
const formattedDate = fmt.dateTime(new Date(), { dateStyle: "medium" });
---
<div>
<span>{formattedPrice}</span>
<time>{formattedDate}</time>
</div>
Configuration et utilisation des segments de route (Route Segments)
Il est recommandé d’organiser les structures de pages multilingues à l’aide de segments de route dynamiques, tels que src/pages/[lang]/index.astro ou src/pages/[locale]/about.astro.
Génération statique de routes (SSG)
En mode génération de site statique (SSG), associez le tableau languages exporté à la fonction getStaticPaths() :
---
// src/pages/[lang]/index.astro
import { languages, useTranslations, useLocale } from "@/i18n";
export function getStaticPaths() {
return languages.map((lang) => ({
params: { lang },
}));
}
const t = useTranslations("nav");
const lang = useLocale();
---
<nav>
<a href={`/${lang}`}>{t("home")}</a>
<a href={`/${lang}/docs`}>{t("docs")}</a>
</nav>
Mécanisme de résolution des segments de route
- Noms de paramètres de segment de route par défaut : Le middleware inspecte automatiquement par défaut les paramètres de route dynamique
context.params.langetcontext.params.locale. Dès lors que votre répertoire se nomme[lang]ou[locale], cela fonctionne sans aucune configuration. - Injection de contexte sans prop : Avant que la page et ses composants enfants ne soient rendus, le middleware extrait la langue du segment de route et l’inscrit dans la portée asynchrone. Tous les composants enfants imbriqués peuvent directement appeler
useTranslations()ouuseLocale()pour accéder à la langue active, éliminant totalement le passage de props depuis la page jusqu’aux composants enfants. - Noms de paramètres de route personnalisés : Si votre projet utilise des noms de paramètres différents dans ses chemins de route (par exemple
src/pages/[localeCode]/...), configurez-les via l’optionparamNamesdanscreateAstroI18n:
export const {
/* ... */
} = createAstroI18n({
defaultLanguage: "fr-FR",
paramNames: ["localeCode", "lang", "locale"],
messages: {
/* ... */
},
});
Stratégie de résolution de la langue
ts-intl-astro résout la langue de la requête selon l’ordre de priorité suivant :
context.currentLocalenatif d’Astro (routage i18n intégré d’Astro)- Paramètres dynamiques de route (inspecte
context.params.langetcontext.params.locale, configurable viaparamNames) - Analyse du préfixe du chemin d’URL (extrait par exemple le premier segment comme
/fr-FR/...) - Repli sur la langue par défaut (le
defaultLanguagespécifié dans la configuration)
Référence de l’API
| API | Type | Description |
|---|---|---|
createAstroI18n(config) |
Function |
Initialise une instance i18n spécifique à Astro ; prend en charge defaultLanguage, messages et paramNames |
useTranslations(ns?, opts?) |
Function |
Renvoie la fonction de traduction t liée au contexte de rendu actuel |
useLocale() |
() => string |
Renvoie le code de langue actif pour le contexte de rendu actuel |
useFormatter(opts?) |
() => Formatter |
Renvoie le formateur Web Intl mis en cache et lié au contexte de langue actuel |