Skip to main content

Reguły liczby mnogiej CLDR: weryfikacja kategorii i18n w różnych językach

Angielski ma 2 formy liczby mnogiej, arabski 6, a rosyjski 4. Jeśli konfiguracja i18n obsługuje tylko kategorie 'one' i 'other', aplikacja nie działa poprawnie w większości języków. Ten przewodnik wyjaśnia reguły CLDR i sposób ich weryfikacji.

1

Czym są reguły liczby mnogiej CLDR?

Standard Unicode CLDR (Common Locale Data Repository) definiuje sześć kategorii liczby mnogiej: zero, one, two, few, many i other. Każdy język korzysta z części tych kategorii zgodnie z własnymi regułami liczbowymi. Angielski używa one (dokładnie 1) oraz other (wszystkie pozostałe wartości). Większość języków ma jednak bardziej złożone zasady, a błędne formy prowadzą do niegramatycznych tekstów i obniżają wiarygodność aplikacji.

The plural problem
// English has 2 plural forms: one, other
// "1 item" vs "2 items"

// But many languages have more:
// Arabic: 6 forms (zero, one, two, few, many, other)
// Polish: 3 forms (one, few, other)
// Japanese: 1 form (other)
// Czech: 3 forms (one, few, other)

// If you only provide "one" and "other",
// Arabic and Polish users see broken text.
Kategoria 'other' jest wymagana w każdym języku. Stanowi wartość rezerwową, gdy żadna inna kategoria nie pasuje. Zdefiniowanie wyłącznie 'one' i 'other' wystarcza w angielskim, ale powoduje błędy w ponad 60% języków świata.
2

Sześć kategorii liczby mnogiej

CLDR definiuje dokładnie sześć kategorii liczby mnogiej. Nie każdy język korzysta ze wszystkich — angielski używa tylko dwóch, a arabski wszystkich sześciu. Pliki i18n muszą zawierać kategorie wymagane przez każdy język docelowy. W przeciwnym razie użytkownicy zobaczą awarie, nieprzetworzone klucze lub niegramatyczny tekst.

CLDR plural categories
// CLDR defines 6 plural categories:
// zero  - 0 items (Arabic, Latvian)
// one   - 1 item (most languages)
// two   - 2 items (Arabic, Welsh)
// few   - 2-4 items (Polish, Czech, Russian)
// many  - 5-19 items (Arabic, Polish, Russian)
// other - everything else (required for ALL languages)

// Examples by language:
// English:  one, other                    (2 forms)
// French:   one, many, other              (3 forms)
// Arabic:   zero, one, two, few, many, other  (6 forms)
// Japanese: other                         (1 form)
// Polish:   one, few, many, other         (4 forms)
// Russian:  one, few, many, other         (4 forms)
3

Kategorie liczby mnogiej według języka

Podręczna lista kategorii wymaganych w popularnych językach docelowych. Skorzystaj z niej podczas definiowania form liczby mnogiej w plikach tłumaczeń.

Common mistakes
// MISTAKE 1: Only providing "one" and "other"
// en.json
{
  "items_one": "{{count}} item",
  "items_other": "{{count}} items"
}
// This breaks for Arabic (missing zero, two, few, many)

// MISTAKE 2: Hardcoded plural logic
// WRONG:
const text = count === 1 ? "1 item" : `${count} items`
// This fails for languages where "1" isn't the only "one" form

// MISTAKE 3: Missing "other" category
// "other" is REQUIRED for every language
// Without it, some numbers show raw keys

// MISTAKE 4: Translating plural RULES instead of text
// The CLDR rules (one, few, many) are universal
// Only the TEXT after each rule should be translated
4

Automatyczna walidacja liczby mnogiej

i18n-validate sprawdza, czy każdy klucz liczby mnogiej w plikach tłumaczeń definiuje wszystkie kategorie CLDR wymagane przez język docelowy. Jeśli plik rosyjski zawiera tylko formy 'one' i 'other', narzędzie zgłasza brak kategorii 'few' i 'many' jako błędy. Uruchamiaj je w CI, aby wykrywać problemy, zanim zobaczą je użytkownicy.

Terminal
# Validate plural forms match CLDR requirements
npx i18n-validate --check-plurals \
  --source locales/en.json \
  --targets 'locales/*.json'

# Output:
# locales/ar.json:
#   items: missing plural forms: zero, two, few, many
#   Expected: zero, one, two, few, many, other
#   Found: one, other
#
# locales/pl.json:
#   items: missing plural forms: few, many
#   Expected: one, few, many, other
#   Found: one, other

# Fix: Add all required forms for each language
# See https://unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html
5

ICU MessageFormat dla liczby mnogiej

Zalecanym sposobem definiowania tłumaczeń liczby mnogiej jest ICU MessageFormat. Wykorzystuje on jeden ciąg znaków z osadzonymi regułami: {count, plural, one {# item} other {# items}'}. ICU jest obsługiwany przez react-intl, vue-i18n, Angular Transloco, Flutter i większość nowoczesnych frameworków i18n.

ICU plural messages
// ICU MessageFormat handles plurals correctly
// It uses CLDR rules internally

// en.json
{
  "items": "{count, plural, one {# item} other {# items}}"
}

// ar.json
{
  "items": "{count, plural, zero {لا عناصر} one {عنصر واحد} two {عنصران} few {# عناصر} many {# عنصرًا} other {# عنصر}}"
}

// pl.json
{
  "items": "{count, plural, one {# element} few {# elementy} many {# elementów} other {# elementu}}"
}

// ICU also handles ordinals:
{
  "ranking": "{pos, selectordinal, one {#st} two {#nd} few {#rd} other {#th}}"
}
Terminal
# Validate ICU message syntax
npx i18n-validate --check-icu \
  --source locales/en.json \
  --targets 'locales/*.json'

# Catches:
# - Missing plural categories for the target language
# - Syntax errors in ICU messages
# - Mismatched variable names
# - Missing "other" (always required)
Symbol # w ICU MessageFormat jest zastępowany sformatowaną liczbą. Używaj # zamiast wpisywać nazwę zmiennej na stałe w formach liczby mnogiej. Na przykład zapisz '# item / # items', zamiast jawnie powtarzać zmienną liczbową.

Wypróbuj i18n Agent

Upuść tutaj plik tłumaczenia

JSON, YAML, PO, XML, CSV, Markdown, Properties

lub kliknij, aby go wybrać

Języki docelowe

Rejestracja nie jest wymaganaNatychmiastowa wycena

Często zadawane pytania o reguły liczby mnogiej CLDR