Задайте вопрос и получите краткое содержание документа через любого ИИ-провайдера на этой странице
История версий
- "Представлен контент на основе выбора (Select)"v9.1.030.07.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
Контент на основе выбора (Select) / Intlayer
Как работает Select
В Intlayer контент на основе выбора достигается с помощью функции select, которая сопоставляет произвольные строковые значения с соответствующим им контентом. Это эквивалентно сообщению ICU {value, select, …}, или похоже на оператор switch в коде вашего приложения.
Используйте select, когда дискриминантом (discriminant) является произвольная строка: статус (status), план (plan), платформа (platform) или роль (role). Для других дискриминантов Intlayer предоставляет специализированные узлы:
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Дискриминант | Узел |
|---|---|
| Количество (Quantity) | enu() |
| Логическое значение (Boolean) | cond() |
| Пол (Gender) | gender() |
| Любая другая строка | select() |
Настройка контента на основе выбора
Чтобы настроить контент на основе выбора в вашем проекте Intlayer, создайте модуль контента, который включает ваши определения выбора. Ниже приведены примеры в различных форматах.
Копировать код в буфер обмена
import { select, type Dictionary } from "intlayer";
const myPostContent = {
key: "my_key",
content: {
publishStatus: select({
draft: "This post is a draft",
published: "This post is live",
scheduled: "This post is scheduled",
fallback: "Unknown status", // необязательно
}),
},
} satisfies Dictionary;
export default myPostContent;Еслиfallbackне объявлен, последний объявленный ключ рассматривается как резервный (fallback), когда предоставленное значение не совпадает ни с одним из объявленных случаев: точно так же, как в контрактахcond()иgender().
Безопасность типов (Type Safety)
Принимаемый аргумент выводится из объявленных случаев:
- Без
fallbackпринимаются только объявленные случаи: опечатка приведет к ошибке типа. - С
fallbackпринимается любая строка (поскольку резервный вариант покрывает несовпадающие значения), в то время как объявленные случаи по-прежнему обеспечивают автодополнение.
Почему не использовать обычный объект?
Может возникнуть соблазн объявить обычный объект и индексировать его, используя значение во время выполнения:
Копировать код в буфер обмена
// ❌ Не делайте этогоconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus[publishType]}</p>;Компилятор Intlayer анализирует ваш исходный код, чтобы исключить неиспользуемый контент и минифицировать оставшиеся ключи. Динамически вычисляемый доступ (obj[expr]) не может быть разрешен статически, поэтому вся ветвь будет помечена как непрозрачная (opaque): она сохранится в сборке (bundle), а ее ключи не будут минифицированы.
При использовании select() разрешение случая (case resolution) происходит внутри вызова функции, а не как доступ к свойству. Компилятор видит это как единичный статический доступ к полю и точно оптимизирует узел так же, как он это делает с enu(), cond() или gender():
Копировать код в буфер обмена
// ✅ Делайте такconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus(publishType)}</p>;Использование контента на основе выбора
Чтобы использовать контент на основе выбора в компоненте React, импортируйте и используйте хук useIntlayer из пакета react-intlayer. Этот хук извлекает контент для указанного ключа и позволяет передать значение для выбора соответствующего вывода.
Копировать код в буфер обмена
import type { FC } from "react";
import { useIntlayer } from "react-intlayer";
const PostStatus: FC = () => {
const { publishStatus } = useIntlayer("my_key");
return (
<div>
<p>
{
/* Вывод: This post is a draft */
publishStatus("draft")
}
</p>
<p>
{
/* Вывод: This post is live */
publishStatus("published")
}
</p>
<p>
{
/* Вывод: Unknown status */
publishStatus("Archived")
}
</p>
</div>
);
};
export default PostStatus;Комбинирование Select с другими узлами
Поскольку каждый случай (case) содержит полный узел контента, select может сочетаться с t(), insert(), md() и т.д.:
Копировать код в буфер обмена
import { insert, select, t, type Dictionary } from "intlayer";const myPostContent = { key: "my_key", content: { publishStatus: select({ draft: insert( t({ en: "{{name}} saved a draft", fr: "{{name}} a enregistré un brouillon", ru: "{{name}} сохранил(а) черновик", }) ), published: insert( t({ en: "{{name}} published the post", fr: "{{name}} a publié l’article", ru: "{{name}} опубликовал(а) пост", }) ), fallback: insert( t({ en: "{{name}} updated the post", fr: "{{name}} a mis à jour l’article", ru: "{{name}} обновил(а) пост", }) ), }), },} satisfies Dictionary;export default myPostContent;Копировать код в буфер обмена
publishStatus("draft")({ name: "Alice" }); // Вывод: Alice сохранил(а) черновикМиграция с ICU select
Сообщения, использующие аргумент ICU select, импортируются как узел select:
Копировать код в буфер обмена
{publishType, select, draft {draft} published {published} other {Unknown}}Станет:
Копировать код в буфер обмена
select( { draft: "draft", published: "published", fallback: "Unknown", }, "publishType");Случай other из ICU переименовывается в fallback, что является каноническим названием в Intlayer для всех универсальных (catch-all) случаев. Второй аргумент записывает имя переменной ICU, поэтому при экспорте сообщение трансформируется обратно в точно такую же строку ICU.
Обратите внимание: сообщения ICUselect, в которых случаями являются значения пола (male/female/other), вместо этого импортируются как узелgender.
Дополнительные ресурсы
Для получения более подробной информации о конфигурации и использовании ознакомьтесь со следующими ресурсами:
Эти ресурсы предоставляют дополнительные сведения о настройке и использовании Intlayer в различных средах и фреймворках.