Автор:
    Создание:2026-07-30Последнее обновление:2026-07-30

    Контент на основе выбора (Select) / Intlayer

    Как работает Select

    В Intlayer контент на основе выбора достигается с помощью функции select, которая сопоставляет произвольные строковые значения с соответствующим им контентом. Это эквивалентно сообщению ICU {value, select, …}, или похоже на оператор switch в коде вашего приложения.

    Используйте select, когда дискриминантом (discriminant) является произвольная строка: статус (status), план (plan), платформа (platform) или роль (role). Для других дискриминантов Intlayer предоставляет специализированные узлы:

    Дискриминант Узел
    Количество (Quantity) enu()
    Логическое значение (Boolean) cond()
    Пол (Gender) gender()
    Любая другая строка select()

    Настройка контента на основе выбора

    Чтобы настроить контент на основе выбора в вашем проекте Intlayer, создайте модуль контента, который включает ваши определения выбора. Ниже приведены примеры в различных форматах.

    **/*.content.ts
    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 принимается любая строка (поскольку резервный вариант покрывает несовпадающие значения), в то время как объявленные случаи по-прежнему обеспечивают автодополнение.

    Почему не использовать обычный объект?

    Может возникнуть соблазн объявить обычный объект и индексировать его, используя значение во время выполнения:

    tsx
    // ❌ Не делайте этогоconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus[publishType]}</p>;

    Компилятор Intlayer анализирует ваш исходный код, чтобы исключить неиспользуемый контент и минифицировать оставшиеся ключи. Динамически вычисляемый доступ (obj[expr]) не может быть разрешен статически, поэтому вся ветвь будет помечена как непрозрачная (opaque): она сохранится в сборке (bundle), а ее ключи не будут минифицированы.

    При использовании select() разрешение случая (case resolution) происходит внутри вызова функции, а не как доступ к свойству. Компилятор видит это как единичный статический доступ к полю и точно оптимизирует узел так же, как он это делает с enu(), cond() или gender():

    tsx
    // ✅ Делайте такconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus(publishType)}</p>;

    Использование контента на основе выбора

    Чтобы использовать контент на основе выбора в компоненте React, импортируйте и используйте хук useIntlayer из пакета react-intlayer. Этот хук извлекает контент для указанного ключа и позволяет передать значение для выбора соответствующего вывода.

    **/*.tsx
    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() и т.д.:

    **/*.content.ts
    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;
    tsx
    publishStatus("draft")({ name: "Alice" }); // Вывод: Alice сохранил(а) черновик

    Миграция с ICU select

    Сообщения, использующие аргумент ICU select, импортируются как узел select:

    text
    {publishType, select, draft {draft} published {published} other {Unknown}}

    Станет:

    typescript
    select(  {    draft: "draft",    published: "published",    fallback: "Unknown",  },  "publishType");

    Случай other из ICU переименовывается в fallback, что является каноническим названием в Intlayer для всех универсальных (catch-all) случаев. Второй аргумент записывает имя переменной ICU, поэтому при экспорте сообщение трансформируется обратно в точно такую же строку ICU.

    Обратите внимание: сообщения ICU select, в которых случаями являются значения пола (male / female / other), вместо этого импортируются как узел gender.

    Дополнительные ресурсы

    Для получения более подробной информации о конфигурации и использовании ознакомьтесь со следующими ресурсами:

    Эти ресурсы предоставляют дополнительные сведения о настройке и использовании Intlayer в различных средах и фреймворках.