|Labs
Rezervovat demoPlatforma
React (Lingo Compiler)
Alpha
React (MCP)React (i18n)
Legacy CLI (v0)
Zastaralé

Přehled

  • @lingo.dev/react

Začínáme

  • Rychlý start

Reference

  • LingoProvider
  • useLingo
  • Množná čísla a select
  • Formátování

Množná čísla a select

Množná čísla a select řeší situace, kdy jeden zdrojový řetězec nestačí — překlad se mění podle čísla nebo kategorie. @lingo.dev/react nabízí dva praktické helpery (l.plural a l.select), které se na pozadí kompilují do ICU MessageFormat. Překladatelé tak pracují se standardní syntaxí a runtime zůstává beze změny.

Množná čísla#

l.plural(count, forms, { context }) vybere správný tvar podle count a pravidel CLDR pro množná čísla daného jazyka.

tsx
const l = useLingo();

l.plural(items.length, {
  one: "1 item",
  other: "{count} items",
}, { context: "Cart summary" });
// → "1 item" (en, count=1) / "5 items" (en, count=5)
// → "1 Eintrag" / "5 Einträge" (de, after translation)

Tvary podle jazyka#

Mapa tvarů podporuje všechny kategorie množného čísla podle CLDR — zero, one, two, few, many, other. Každý jazyk si vezme to, co potřebuje:

  • Angličtina používá one + other (1 vs. vše ostatní)
  • Ruština používá one + few + many + other (1; 2–4; 5–20; 21, 31, ...)
  • Arabština používá všech šest
  • Japonština používá jen other (bez rozlišování množného čísla)

Stačí dodat jen tvary, které používá zdrojový jazyk — překladatelé doplní zbytek podle cílového jazyka.

{count} se automaticky interpoluje do libovolného tvaru množného čísla. Nepředáváte ho přes values — bere se z prvního argumentu.

Kombinace s dalšími zástupnými symboly#

U vět, které obsahují počet i další proměnné, zapište proměnné přímo do řetězců jednotlivých tvarů; do ICU se předají automaticky.

tsx
l.plural(notifications.length, {
  one: "1 message from {sender}",
  other: "{count} messages from {sender}",
}, { context: "Inbox header" });

Při volání pak předejte hodnoty — jenže signatura l.plural obsahuje jen { context }. Pro kombinované případy proto použijte přímo l.text se syntaxí ICU pro plural:

tsx
l.text(`{count, plural, one {1 message from {sender}} other {# messages from {sender}}}`, {
  values: { count: notifications.length, sender: user.name },
  context: "Inbox header",
});

Token # se nahradí doslovnou hodnotou počtu — hodí se, když ji chcete bez interpolace ve složených závorkách.

Select#

l.select(value, forms, { context }) vybírá tvar podle řetězcového klíče (rod, role, typ obsahu — zkrátka cokoli kategoriálního).

tsx
l.select(user.gender, {
  male: "He uploaded a photo",
  female: "She uploaded a photo",
  other: "They uploaded a photo",
}, { context: "Activity feed" });

Jako záložní varianta je other povinné. Shoda je přesná — bez přibližného porovnávání i bez ignorování velikosti písmen.

Selectordinal#

Pro řadové číslovky (1., 2., 3.) použijte ICU selectordinal přímo přes l.text:

tsx
l.text(`You finished in {place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}} place`, {
  values: { place: rank },
  context: "Leaderboard",
});
// → "You finished in 1st place" / "2nd" / "3rd" / "4th, 5th, ..."

Do čeho se to kompiluje#

Jak l.plural, tak l.select sestaví řetězec ve formátu ICU MessageFormat a předají ho do l.text. Právě tato zkompilovaná podoba se extrahuje přes lingo extract a ukládá do vašich souborů jazyka — překladatelé tak upravují přímo syntaxi ICU, ne literál objektu v JS.

Příklad: l.plural(n, { one: "1 item", other: "{count} items" }, { context: "Cart" }) se extrahuje jako:

text
{count, plural, one {1 item} other {{count} items}}

To znamená, že překladatelé můžou upravit kategorie podle jazyka, včetně těch, které ve zdroji vůbec nejsou. Ruština se tak bez jakékoli změny kódu promění na {count, plural, one {...} few {...} many {...} other {...}}.

Kdy je nepoužívat#

  • Jednoduché booleovské „1, nebo více“. Dvě volání l.text pod if jsou v pořádku a překladatelé je snáz zachytí.
  • Programový enum, který není určený pro uživatele. Plural / select slouží k překladu kategoriálních zpráv, ne k řízení logiky aplikace.

Kam dál#

  • useLingo — základní sémantika l.text a l.rich.
  • Formatting — formátování čísel, měn, dat a seznamů pomocí nativního Intl.

Byla tato stránka užitečná?

Max PrilutskiyMax Prilutskiy·Aktualizováno přibližně před 1 měsícem·3 min čtení