Posez votre question et obtenez un résumé du document en referencant cette page et le Provider AI de votre choix
Historique des versions
- "Sortie de la fonctionnalité des variantes"v9.0.012/06/2026
- "`variant` accepte désormais une chaîne ou un objet — les anciens `meta` / enregistrements dynamiques se déclarent comme variantes objet"v9.1.026/06/2026
- "Une variante déclare uniquement les clés qu'elle remplace ; les variantes non déclarées se rabattent sur l'entrée par défaut"v9.1.131/07/2026
- "Les fournisseurs acceptent une prop `variant` ambiante ; les sélecteurs acceptent une chaîne de préférence ordonnée"v9.1.204/08/2026
Le contenu de cette page a été traduit à l'aide d'une IA.
Voir la dernière version du contenu original en anglaisIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Variantes
Une variante est un ensemble de fichiers de contenu qui partagent la même clé de dictionnaire (key) mais portent chacun une valeur variant différente. Intlayer sert le fichier approprié en fonction du sélecteur passé à useIntlayer.
La valeur variant peut prendre deux formes :
- Une chaîne — une seule alternative nommée (tests A/B, bannières saisonnières, feature flags).
- Un objet — un discriminant structuré adressé par un ensemble de champs (enregistrements de CMS, contenu propre à un utilisateur, tout contenu indexé par un identifiant opaque). L'objet entier constitue l'identité : le sélecteur doit fournir un objet égal pour résoudre l'entrée.
La forme objet remplace l'ancien champmeta. Partout où vous écriviezmeta: { id, … }, écrivezvariant: { id, … }, et sélectionnez-la avec{ variant: { id, … } }.
Variantes nommées (chaîne)
Chaque fichier représente une alternative nommée. Omettre variant (ou le définir sur "default") le marque comme valeur par défaut (fallback).
Copier le code dans le presse-papiers
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "hero-banner",
variant: "default",
content: {
headline: t({
en: "Build faster with Intlayer",
fr: "Développez plus vite avec Intlayer",
}),
cta: t({ en: "Get started", fr: "Commencer" }),
},
} satisfies Dictionary;
export default dictionary;Copier le code dans le presse-papiers
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "hero-banner",
variant: "black_friday",
content: {
headline: t({
en: "50 % off — today only",
fr: "−50 % — aujourd'hui seulement",
}),
cta: t({ en: "Shop now", fr: "Acheter maintenant" }),
},
} satisfies Dictionary;
export default dictionary;Variantes partielles
Une variante déclare uniquement les clés qu'elle remplace ; le reste est hérité de l'entrée par défaut.
Copier le code dans le presse-papiers
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "hero-banner",
variant: "summer",
content: {
headline: t({
en: "Build faster all summer",
fr: "Développez plus vite tout l'été",
}),
},
} satisfies Dictionary;
export default dictionary;Copier le code dans le presse-papiers
useIntlayer("hero-banner", { variant: "summer" });// → { headline: "Développez plus vite tout l'été", cta: "Commencer" } — `cta` héritéuseIntlayer("hero-banner", { variant: "never-declared" });// → l'entrée par défautAinsi, vous n'ajoutez un fichier de variante que là où la formulation diffère réellement. Une clé se résout en null uniquement lorsqu'elle déclare des variantes mais aucune entrée par défaut.
Consommer des variantes nommées
Variante par défaut
Copier le code dans le presse-papiers
import { useIntlayer } from "react-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// → variante par défaut
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};Variante nommée
Copier le code dans le presse-papiers
const { headline, cta } = useIntlayer("hero-banner", { variant: "black_friday",});Variante nommée avec locale explicite
Copier le code dans le presse-papiers
const content = useIntlayer("hero-banner", { variant: "black_friday", locale: "fr",});Variantes objet (structurées)
Une variante objet adresse le contenu par un ensemble arbitraire de paires clé-valeur déclarées dans le champ variant — permettant de modéliser des enregistrements de CMS, du contenu propre à un utilisateur ou tout contenu dont la clé est un identifiant opaque. L'objet entier constitue l'identité : le sélecteur doit fournir un objet égal pour que l'entrée soit résolue.
Copier le code dans le presse-papiers
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "product",
variant: { id: "prod_abc", userId: "user_123" },
content: {
name: t({ en: "Widget Pro", fr: "Widget Pro" }),
description: t({ en: "The best widget.", fr: "Le meilleur widget." }),
},
} satisfies Dictionary;
export default dictionary;Copier le code dans le presse-papiers
import { t, type Dictionary } from "intlayer";
const dictionary = {
key: "product",
variant: { id: "prod_abcd", userId: "user_123" },
content: {
name: t({ en: "Widget Lite", fr: "Widget Lite" }),
description: t({ en: "A lighter option.", fr: "Une option plus légère." }),
},
} satisfies Dictionary;
export default dictionary;Consommer des variantes objet
Passez l'objet correspondant à variant. Chaque champ déclaré sur le dictionnaire doit être fourni et égal ; sinon le résultat est null. L'ordre des champs n'a pas d'importance.
Copier le code dans le presse-papiers
import { useIntlayer } from "react-intlayer";
export const Product = ({
productId,
userId,
}: {
productId: string;
userId: string;
}) => {
const content = useIntlayer("product", {
variant: { id: productId, userId },
});
if (!content) return null;
return <p>{content.description}</p>;
};Avec une locale explicite
Copier le code dans le presse-papiers
const content = useIntlayer("product", { variant: { id: "prod_abc", userId: "user_123" }, locale: "fr",});Champ manquant — aucune correspondance
Copier le code dans le presse-papiers
// Renvoie null : `userId` est manquant, donc l'objet ne correspond pas à la variante déclaréeconst content = useIntlayer("product", { variant: { id: "prod_abc" } });Variante ambiante
Certaines dimensions de variante sont fixes pour toute une session — le locataire, le type d'établissement, le niveau d'abonnement. Elles sont résolues une seule fois, et aucun composant ne devrait avoir à les passer à la main.
N'encapsulez pasuseIntlayerdans votre propre hook pour les injecter. L'optimisation à la compilation ne réécrit qu'un appel littéraluseIntlayer("key")importé depuis le paquet du framework : rien derrière un wrapper n'est intégré au bundle.
Déclarez plutôt la variante une seule fois sur le fournisseur, exactement comme locale :
Copier le code dans le presse-papiers
import { IntlayerProvider } from "react-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);Chaque lecture de dictionnaire sous le fournisseur se résout désormais avec cette variante, et un sélecteur au point d'appel l'emporte toujours :
Copier le code dans le presse-papiers
useIntlayer("hero-banner");// → la variante du fournisseuruseIntlayer("hero-banner", { variant: "summer" });// → "summer" — remplace la variante du fournisseur, elle ne l'étend pasFormes
La prop variant accepte trois formes :
Ouvrir le tableau dans une fenêtre modale pour voir tout le contenu clairement
| Forme | Signification |
|---|---|
variant="school1" | une variante nommée pour toutes les clés |
variant={["school1", "default"]} | une chaîne de préférence ordonnée |
variant={{ "hero-banner": "school1", default: "base" }} | une variante par clé de dictionnaire |
Chaîne de préférence
Une chaîne est parcourue de gauche à droite parmi les entrées déclarées par chaque clé, et la première déclarée l'emporte. Si aucune ne l'est, l'entrée par défaut implicite est utilisée — exactement comme pour une valeur unique.
Copier le code dans le presse-papiers
<IntlayerProvider variant={["school1", "school2"]} />// `hero-banner` ne déclare pas d'entrée `school1` mais déclare `school2` → "school2"// une clé qui ne déclare ni l'une ni l'autre → l'entrée par défautAinsi ["black_friday", "summer"] se lit « black friday si cette clé en a une, sinon summer, sinon par défaut ». Les chaînes sont également acceptées au point d'appel :
Copier le code dans le presse-papiers
useIntlayer("hero-banner", { variant: ["black_friday", "summer"] });Notez qu'il s'agit de l'image inverse du tableau accepté par le champ variant d'un fichier de contenu : là, un tableau déclare une entrée par élément ; ici, il les consomme par ordre de priorité.
Table par clé
Adressez chaque clé de dictionnaire séparément. L'entrée réservée default couvre toutes les clés non listées :
Copier le code dans le presse-papiers
<IntlayerProvider variant={{ "hero-banner": "school1", product: ["school1", "default"], default: "base", }}/>Sur un fournisseur, un objet simple est toujours lu comme la table par clé, jamais comme une variante objet — les deux sont structurellement identiques. Pour fixer une variante objet globalement, imbriquez-la sous une entrée : variant={{ default: { id: "prod_abc" } }}.
Comme les clés de la table sont vérifiées par rapport à vos clés de dictionnaire déclarées, une faute de frappe — ou une variante objet écrite directement, telle que variant={{ id: "prod_abc" }} — est une erreur de compilation.
Mode de chargement
Les variantes objet sont souvent chargées de façon différée. Définissez importMode sur le dictionnaire pour contrôler ce comportement :
Copier le code dans le presse-papiers
const dictionary = {
key: "product",
importMode: "fetch", // or "dynamic"
variant: { id: "prod_abc", userId: "user_123" },
content: { … },
} satisfies Dictionary;
export default dictionary;Voir optimisation du bundle pour les détails sur les modes static, dynamic et fetch.
Cas d'usage typiques
- Tests A/B de texte pilotés par une clé d'expérience
- Bannières saisonnières ou promotionnelles
- Messages sous feature flag
- Campagnes marketing spécifiques à une locale
- Texte marketing par produit géré dans un CMS
- Contenu propre à un utilisateur ou à un compte
- Tout contenu indexé par un identifiant opaque à l'exécution