Haz tu pregunta y obtén un resumen del documento referenciando esta página y el proveedor AI de tu elección
Historial de versiones
- "Lanzamiento de la función de variantes"v9.0.012/6/2026
- "`variant` ahora acepta una cadena o un objeto — los antiguos `meta` / registros dinámicos se declaran como variantes de objeto"v9.1.026/6/2026
- "Una variante declara solo las claves que anula; las variantes no declaradas recurren a la entrada por defecto"v9.1.131/7/2026
- "Los proveedores aceptan una prop `variant` ambiental; los selectores aceptan una cadena de preferencia ordenada"v9.1.24/8/2026
El contenido de esta página ha sido traducido con una IA.
Ver la última versión del contenido original en inglésIf 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
Una variante es un conjunto de archivos de contenido que comparten la misma clave de diccionario (key) pero llevan cada uno un valor variant diferente. Intlayer sirve el archivo adecuado según el selector pasado a useIntlayer.
El valor de variant puede adoptar dos formas:
- Una cadena — una única alternativa con nombre (pruebas A/B, banners de temporada, feature flags).
- Un objeto — un discriminador estructurado direccionado por un conjunto de campos (registros de CMS, contenido específico de usuario, cualquier contenido indexado por un ID opaco). El objeto completo es la identidad: el selector debe proporcionar un objeto igual para resolver la entrada.
La forma de objeto sustituye al antiguo campometa. Donde antes escribíameta: { id, … }, escribavariant: { id, … }, y selecciónela con{ variant: { id, … } }.
Variantes con nombre (cadena)
Cada archivo representa una alternativa con nombre. Omitir variant (o establecerlo en "default") lo marca como el valor de reserva.
Copiar el código al portapapeles
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;Copiar el código al portapapeles
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 parciales
Una variante declara solo las claves que anula; el resto se hereda de la entrada por defecto.
Copiar el código al portapapeles
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;Copiar el código al portapapeles
useIntlayer("hero-banner", { variant: "summer" });// → { headline: "Développez plus vite tout l'été", cta: "Commencer" } — `cta` heredadouseIntlayer("hero-banner", { variant: "never-declared" });// → la entrada por defectoPor lo tanto, solo debe agregar un archivo de variante donde la redacción realmente difiera. Una clave se resuelve en null solo cuando declara variantes pero ninguna entrada por defecto.
Consumir variantes con nombre
Variante por defecto
Copiar el código al portapapeles
import { useIntlayer } from "react-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// → variante por defecto
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};Variante con nombre
Copiar el código al portapapeles
const { headline, cta } = useIntlayer("hero-banner", { variant: "black_friday",});Variante con nombre con locale explícito
Copiar el código al portapapeles
const content = useIntlayer("hero-banner", { variant: "black_friday", locale: "fr",});Variantes de objeto (estructuradas)
Una variante de objeto direcciona el contenido mediante un conjunto arbitrario de pares clave-valor declarados en el campo variant — lo que permite modelar registros de CMS, contenido específico de usuario o cualquier contenido cuya clave sea un ID opaco. El objeto completo es la identidad: el selector debe proporcionar un objeto igual para que la entrada se resuelva.
Copiar el código al portapapeles
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;Copiar el código al portapapeles
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;Consumir variantes de objeto
Pase el objeto coincidente a variant. Cada campo declarado en el diccionario debe proporcionarse e ser igual; de lo contrario el resultado es null. El orden de los campos no importa.
Copiar el código al portapapeles
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>;
};Con locale explícito
Copiar el código al portapapeles
const content = useIntlayer("product", { variant: { id: "prod_abc", userId: "user_123" }, locale: "fr",});Campo faltante — sin coincidencia
Copiar el código al portapapeles
// Devuelve null: falta `userId`, por lo que el objeto no coincide con la variante declaradaconst content = useIntlayer("product", { variant: { id: "prod_abc" } });Variante ambiental
Algunas dimensiones de variante son fijas durante toda una sesión: el inquilino, el tipo de centro, el nivel de plan. Se resuelven una sola vez, y ningún componente debería tener que pasarlas a mano.
No envuelvasuseIntlayeren tu propio hook para inyectarlas. La optimización en tiempo de compilación solo reescribe una llamada literaluseIntlayer("key")importada del paquete del framework, por lo que nada detrás de un wrapper se incluye en el bundle.
En su lugar, declara la variante una sola vez en el proveedor, exactamente igual que locale:
Copiar el código al portapapeles
import { IntlayerProvider } from "react-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);Cada lectura de diccionario bajo el proveedor se resuelve ahora con esa variante, y un selector en el punto de llamada siempre gana:
Copiar el código al portapapeles
useIntlayer("hero-banner");// → la variante del proveedoruseIntlayer("hero-banner", { variant: "summer" });// → "summer" — sustituye la variante del proveedor, no la extiendeFormas
La prop variant acepta tres formas:
Abrir la tabla en una ventana flotante para ver todo el contenido claramente
| Forma | Significado |
|---|---|
variant="school1" | una variante nombrada para todas las claves |
variant={["school1", "default"]} | una cadena de preferencia ordenada |
variant={{ "hero-banner": "school1", default: "base" }} | una variante por clave de diccionario |
Cadena de preferencia
Una cadena se recorre de izquierda a derecha frente a las entradas que declara cada clave, y gana la primera declarada. Cuando no hay ninguna declarada, se usa la entrada por defecto implícita, exactamente igual que con un valor único.
Copiar el código al portapapeles
<IntlayerProvider variant={["school1", "school2"]} />// `hero-banner` no declara una entrada `school1` pero sí declara `school2` → "school2"// una clave que no declara ninguna de las dos → la entrada por defectoAsí, ["black_friday", "summer"] se lee como «black friday si esta clave la tiene, si no summer, si no por defecto». Las cadenas también se aceptan en el punto de llamada:
Copiar el código al portapapeles
useIntlayer("hero-banner", { variant: ["black_friday", "summer"] });Ten en cuenta que esto es la imagen especular del array aceptado por el campo variant de un archivo de contenido: allí un array declara una entrada por elemento; aquí las consume por orden de prioridad.
Mapa por clave
Dirígete a cada clave de diccionario por separado. La entrada reservada default cubre todas las claves no listadas:
Copiar el código al portapapeles
<IntlayerProvider variant={{ "hero-banner": "school1", product: ["school1", "default"], default: "base", }}/>En un proveedor, un objeto simple se lee siempre como el mapa por clave, nunca como una variante de objeto: ambos son estructuralmente idénticos. Para fijar una variante de objeto globalmente, anídala bajo una entrada: variant={{ default: { id: "prod_abc" } }}.
Como las claves del mapa se comprueban contra tus claves de diccionario declaradas, una errata —o una variante de objeto escrita directamente, como variant={{ id: "prod_abc" }}— es un error de compilación.
Modo de carga
Las variantes de objeto suelen cargarse de forma diferida. Establezca importMode en el diccionario para controlarlo:
Copiar el código al portapapeles
const dictionary = {
key: "product",
importMode: "fetch", // or "dynamic"
variant: { id: "prod_abc", userId: "user_123" },
content: { … },
} satisfies Dictionary;
export default dictionary;Consulte optimización del bundle para detalles sobre los modos static, dynamic y fetch.
Casos de uso típicos
- Pruebas A/B de texto dirigidas por una clave de experimento
- Banners de temporada o promocionales
- Mensajería con feature flag
- Campañas de marketing específicas por locale
- Copia de marketing por producto gestionada en un CMS
- Contenido específico de usuario o de cuenta
- Cualquier contenido indexado por un ID opaco en tiempo de ejecución