Autor:
    Data utworzenia:2026-07-30Ostatnia aktualizacja:2026-07-30

    Treść Oparta na Wyborze (Select) / Intlayer

    Jak Działa Select

    W Intlayer treść oparta na wyborze jest osiągana za pomocą funkcji select, która mapuje dowolne wartości znakowe na odpowiadającą im treść. Jest to odpowiednik komunikatu ICU {value, select, …} lub podobne do instrukcji switch w kodzie Twojej aplikacji.

    Używaj select, gdy dyskryminatorem (discriminant) jest dowolny ciąg znaków (string): status, plan, platforma lub rola (role). Dla innych dyskryminatorów Intlayer udostępnia dedykowane węzły:

    Dyskryminator Węzeł
    Ilość (Quantity) enu()
    Logiczny (Boolean) cond()
    Płeć (Gender) gender()
    Dowolny inny ciąg select()

    Konfigurowanie Treści Opartej na Wyborze

    Aby skonfigurować treść opartą na wyborze w projekcie Intlayer, utwórz moduł treści zawierający Twoje definicje wyboru. Poniżej znajdują się przykłady w różnych formatach.

    **/*.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", // opcjonalne
        }),
      },
    } satisfies Dictionary;
    
    export default myPostContent;
    Jeśli nie zostanie zadeklarowany żaden fallback, ostatni zadeklarowany klucz jest uważany za wariant rezerwowy, gdy dostarczona wartość nie pasuje do żadnego z zadeklarowanych przypadków: dokładnie tak samo jak w kontraktach cond() i gender().

    Bezpieczeństwo Typów (Type Safety)

    Akceptowany argument jest wnioskowany z zadeklarowanych przypadków:

    • Bez fallback, akceptowane są tylko zadeklarowane przypadki: literówka spowoduje błąd typu (type error).
    • Z fallback, każdy ciąg znaków (string) jest akceptowany (ponieważ fallback pokrywa niedopasowane wartości), podczas gdy zadeklarowane przypadki nadal zapewniają autouzupełnianie.

    Dlaczego Nie Używać Zwykłego Obiektu?

    Kuszące może być zadeklarowanie zwykłego obiektu i indeksowanie go za pomocą wartości w czasie wykonywania (runtime value):

    tsx
    // ❌ Nie rób tegoconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus[publishType]}</p>;

    Kompilator Intlayer analizuje Twój kod źródłowy, aby wyeliminować nieużywane treści i zminifikować pozostałe klucze. Dynamicznie obliczany dostęp (obj[expr]) nie może zostać rozwiązany statycznie, dlatego cała gałąź zostanie oznaczona jako nieprzezroczysta (opaque): zostanie zachowana w bundle'u, a jej klucze nie zostaną zminifikowane.

    Korzystając z select(), rozwiązywanie przypadków (case resolution) odbywa się wewnątrz wywołania funkcji, a nie poprzez dostęp do właściwości. Kompilator widzi to jako pojedynczy, statyczny dostęp do pola i optymalizuje ten węzeł dokładnie tak, jak robi to z enu(), cond() lub gender():

    tsx
    // ✅ Rób takconst { publishStatus } = useIntlayer("my_key");return <p>{publishStatus(publishType)}</p>;

    Używanie Treści Opartej na Wyborze

    Aby wykorzystać treść opartą na wyborze w komponencie React, zaimportuj i użyj hooka useIntlayer z pakietu react-intlayer. Ten hook pobiera treść dla podanego klucza i pozwala przekazać wartość w celu wybrania odpowiedniego wyniku.

    **/*.tsx
    import type { FC } from "react";
    import { useIntlayer } from "react-intlayer";
    
    const PostStatus: FC = () => {
    const { publishStatus } = useIntlayer("my_key");
    
    return (
      <div>
        <p>
          {
            /* Wynik: This post is a draft */
            publishStatus("draft")
          }
        </p>
        <p>
          {
            /* Wynik: This post is live */
            publishStatus("published")
          }
        </p>
        <p>
          {
            /* Wynik: Unknown status */
            publishStatus("Archived")
          }
        </p>
      </div>
    );
    };
    
    export default PostStatus;

    Łączenie Select z Innymi Węzłami

    Ponieważ każdy przypadek (case) zawiera pełny węzeł treści, select można łączyć z t(), insert(), md() itp.:

    **/*.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",          pl: "{{name}} zapisał(a) szkic",        })      ),      published: insert(        t({          en: "{{name}} published the post",          fr: "{{name}} a publié l’article",          pl: "{{name}} opublikował(a) post",        })      ),      fallback: insert(        t({          en: "{{name}} updated the post",          fr: "{{name}} a mis à jour l’article",          pl: "{{name}} zaktualizował(a) post",        })      ),    }),  },} satisfies Dictionary;export default myPostContent;
    tsx
    publishStatus("draft")({ name: "Alice" }); // Wynik: Alice zapisał(a) szkic

    Migracja z ICU select

    Wiadomości wykorzystujące argument ICU select są importowane jako węzeł select:

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

    Zostaną przekształcone na:

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

    Przypadek (case) other z ICU jest zmieniany na fallback, co jest kanoniczną nazwą w Intlayer dla wszystkich ogólnych przypadków typu catch-all. Drugi argument przechowuje nazwę zmiennej ICU, dzięki czemu przy eksporcie wiadomość przekształca się dokładnie w ten sam ciąg znaków ICU.

    Pamiętaj, że komunikaty ICU select, w których przypadkami są wartości płci (male / female / other), są importowane jako węzeł gender.

    Dodatkowe Zasoby

    Aby uzyskać bardziej szczegółowe informacje na temat konfiguracji i użytkowania, zapoznaj się z poniższymi zasobami:

    Powyższe zasoby dostarczają dalszych spostrzeżeń dotyczących konfiguracji i używania Intlayer w różnych środowiskach i frameworkach.