Ce qui est branché · 3 min
Internationalisation
Messages compilés avec inlang et Paraglide, deux langues par défaut, et les trois pièges de la configuration.
Les messages sont compilés, pas cherchés au runtime. messages/fr.json devient
des fonctions typées à la compilation, donc une clé manquante est une erreur de
compilation plutôt qu'un t("une.cle") affiché à un client.
{
"heroTitle": "Lancez votre SaaS en quelques jours",
"greeting": "Bon retour, {{name}}"
}const t = useT();
t.heroTitle();
t.greeting({ name: user.firstName });Piège numéro un : les doubles accolades
Le format de message i18next interpole {{name}}. Un {name} à simple
accolade compile sans aucun avertissement et livre le texte littéral
{name} à votre client. C'est de loin l'erreur la plus courante de cette
configuration, et aucune erreur ne l'attrape.
Piège numéro deux : les underscores dans les clés
_ est le séparateur de contexte d'i18next. Une clé nommée meta_title compile
comme une variante contextuelle d'un message nommé meta, et n'existe donc pas
sous le nom meta_title. Utilisez le camelCase pour chaque clé : metaTitle.
Piège numéro trois : la langue dans un composant client
La langue est un cookie, et seul le serveur peut le lire pendant le rendu. Un composant client qui résout lui-même sa langue rend une langue sur le serveur et possiblement une autre dans le navigateur, ce qui est une erreur d'hydratation.
Résolvez-la une fois à la racine et faites-la descendre :
// src/app/layout.tsx, un composant serveur
const locale = await currentLocale();
return <LocaleProvider locale={locale}>{children}</LocaleProvider>;Ajouter une langue
Ajoutez-la à la configuration
locales: ["en", "fr", "de"] as const dans src/config.ts, et le même code
dans project.inlang/settings.json.
Copiez les messages
cp messages/en.json messages/de.json puis traduisez. Chaque clé doit exister
dans chaque fichier ; le compilateur vous dit lesquelles manquent.
Recompilez
npm run paraglide. Il s'exécute automatiquement avant dev et build.
Le fichier settings.json doit porter à la fois les clés v1
(sourceLanguageTag, languageTags) et les clés v2 (baseLocale, locales).
L'éditeur sur fink.inlang.com lit la v1 ; le
compilateur lit la v2. Retirez l'un des deux jeux et l'un des deux cesse de
fonctionner.
Traduire une chaîne dynamique
Ne construisez pas une clé de message par concaténation. Le compilateur ne voit
pas t[`status_${row.status}`] et n'inclura pas ces messages dans la
sortie. Énumérez-les :
const STATUS = {
pending: () => t.statusPending(),
active: () => t.statusActive(),
} as const;C'est verbeux, et cela signifie qu'ajouter un statut vous oblige à écrire son libellé, ce qui est exactement la bonne dose de friction.
Une erreur ou un manque sur cette page ? Dites-le-nous.