Задайте вопрос и получите краткое содержание документа через любого ИИ-провайдера на этой странице
История версий
- "Выпуск функции вариантов"v9.0.012.06.2026
- "`variant` теперь принимает строку или объект — прежние `meta` / динамические записи объявляются как вариант объектов"v9.1.026.06.2026
- "Вариант объявляет только ключи, которые он переопределяет; необъявленные варианты возвращаются к записи по умолчанию"v9.1.131.07.2026
- "Провайдеры принимают внешний проп `variant`; селекторы принимают упорядоченную цепочку предпочтений"v9.1.204.08.2026
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомIf 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
Варианты
Вариант — это набор файлов контента, которые имеют общий ключ словаря (key), но каждый несёт своё значение variant. Intlayer отдаёт нужный файл на основе селектора, переданного в useIntlayer.
Значение variant может принимать две формы:
- Строка — одна именованная альтернатива (A/B-тесты, сезонные баннеры, feature-флаги).
- Объект — структурированный дискриминатор, адресуемый набором полей (записи CMS, контент конкретного пользователя, любой контент с непрозрачным ID в качестве ключа). Идентичностью является весь объект: селектор должен предоставить равный объект, чтобы разрешить запись.
Объектная форма заменяет прежнее полеmeta. Везде, где раньше вы писалиmeta: { id, … }, пишитеvariant: { id, … }и выбирайте её через{ variant: { id, … } }.
Именованные (строковые) варианты
Каждый файл представляет одну именованную альтернативу. Пропуск variant (или значение "default") помечает его как запасной вариант.
Копировать код в буфер обмена
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;Копировать код в буфер обмена
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;Частичные варианты
Вариант объявляет только ключи, которые он переопределяет; остальные наследуются из записи по умолчанию.
Копировать код в буфер обмена
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;Копировать код в буфер обмена
useIntlayer("hero-banner", { variant: "summer" });// → { headline: "Développez plus vite tout l'été", cta: "Commencer" } — `cta` унаследованоuseIntlayer("hero-banner", { variant: "never-declared" });// → запись по умолчаниюПоэтому вы добавляете файл варианта только там, где текст действительно отличается. Ключ разрешается в null только в том случае, если он объявляет варианты, но не имеет записи по умолчанию.
Использование именованных вариантов
Вариант по умолчанию
Копировать код в буфер обмена
import { useIntlayer } from "react-intlayer";
export const Hero = () => {
const { headline, cta } = useIntlayer("hero-banner");
// → вариант по умолчанию
return (
<section>
<h1>{headline}</h1>
<a>{cta}</a>
</section>
);
};Именованный вариант
Копировать код в буфер обмена
const { headline, cta } = useIntlayer("hero-banner", { variant: "black_friday",});Именованный вариант с явной локалью
Копировать код в буфер обмена
const content = useIntlayer("hero-banner", { variant: "black_friday", locale: "fr",});Объектные (структурированные) варианты
Объектный вариант адресует контент произвольным набором пар ключ-значение, объявленных в поле variant, — что позволяет моделировать записи CMS, контент конкретного пользователя или любой контент с непрозрачным ID в качестве ключа. Идентичностью является весь объект: селектор должен предоставить равный объект, чтобы запись была разрешена.
Копировать код в буфер обмена
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;Копировать код в буфер обмена
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;Использование объектных вариантов
Передайте соответствующий объект в variant. Каждое поле, объявленное в словаре, должно быть предоставлено и равно; иначе результат — null. Порядок полей не имеет значения.
Копировать код в буфер обмена
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>;
};С явной локалью
Копировать код в буфер обмена
const content = useIntlayer("product", { variant: { id: "prod_abc", userId: "user_123" }, locale: "fr",});Отсутствует поле — нет совпадения
Копировать код в буфер обмена
// Возвращает null: отсутствует `userId`, поэтому объект не совпадает с объявленным вариантомconst content = useIntlayer("product", { variant: { id: "prod_abc" } });Внешний вариант
Некоторые измерения варианта неизменны в течение всей сессии — арендатор, тип учебного заведения, тарифный план. Они вычисляются один раз, и ни один компонент не должен передавать их вручную.
Не оборачивайтеuseIntlayerв собственный хук, чтобы их подставить. Оптимизация на этапе сборки переписывает только литеральный вызовuseIntlayer("key"), импортированный из пакета фреймворка, поэтому ничто за обёрткой не попадёт в бандл.
Вместо этого объявите вариант один раз на провайдере, точно так же, как locale:
Копировать код в буфер обмена
import { IntlayerProvider } from "react-intlayer";
export const App = ({ locale, schoolType }) => (
<IntlayerProvider locale={locale} variant={schoolType}>
<Hero />
</IntlayerProvider>
);Теперь каждое чтение словаря под провайдером разрешается с этим вариантом, а селектор в месте вызова всегда побеждает:
Копировать код в буфер обмена
useIntlayer("hero-banner");// → вариант провайдераuseIntlayer("hero-banner", { variant: "summer" });// → "summer" — заменяет вариант провайдера, а не дополняет егоФормы
Проп variant принимает три формы:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Форма | Значение |
|---|---|
variant="school1" | один именованный вариант для всех ключей |
variant={["school1", "default"]} | упорядоченная цепочка предпочтений |
variant={{ "hero-banner": "school1", default: "base" }} | свой вариант для каждого ключа словаря |
Цепочка предпочтений
Цепочка перебирается слева направо по записям, объявленным каждым ключом, и побеждает первая объявленная. Если не объявлена ни одна, используется неявная запись по умолчанию — точно так же, как для одиночного значения.
Копировать код в буфер обмена
<IntlayerProvider variant={["school1", "school2"]} />// `hero-banner` не объявляет запись `school1`, но объявляет `school2` → "school2"// ключ, не объявляющий ни одной из них → запись по умолчаниюТаким образом, ["black_friday", "summer"] читается как «black friday, если у этого ключа он есть, иначе summer, иначе по умолчанию». Цепочки также принимаются в месте вызова:
Копировать код в буфер обмена
useIntlayer("hero-banner", { variant: ["black_friday", "summer"] });Обратите внимание: это зеркальное отражение массива, принимаемого полем variant файла контента: там массив объявляет по одной записи на элемент, здесь он потребляет их в порядке приоритета.
Отображение по ключам
Обращайтесь к каждому ключу словаря отдельно. Зарезервированная запись default покрывает все не перечисленные ключи:
Копировать код в буфер обмена
<IntlayerProvider variant={{ "hero-banner": "school1", product: ["school1", "default"], default: "base", }}/>На провайдере обычный объект всегда читается как отображение по ключам, но не как объектный вариант — они структурно идентичны. Чтобы задать объектный вариант глобально, вложите его в запись: variant={{ default: { id: "prod_abc" } }}.
Поскольку ключи отображения сверяются с объявленными ключами словарей, опечатка — или объектный вариант, записанный напрямую, например variant={{ id: "prod_abc" }} — приводит к ошибке компиляции.
Режим загрузки
Объектные варианты часто загружаются лениво. Задайте importMode в словаре, чтобы управлять этим:
Копировать код в буфер обмена
const dictionary = {
key: "product",
importMode: "fetch", // or "dynamic"
variant: { id: "prod_abc", userId: "user_123" },
content: { … },
} satisfies Dictionary;
export default dictionary;См. оптимизацию бандла для подробностей о режимах static, dynamic и fetch.
Типичные сценарии использования
- A/B-тесты текста, управляемые ключом эксперимента
- Сезонные или рекламные баннеры
- Сообщения под feature-флагами
- Маркетинговые кампании для конкретной локали
- Маркетинговый текст по товарам, управляемый в CMS
- Контент конкретного пользователя или аккаунта
- Любой контент, адресуемый непрозрачным ID во время выполнения