Skip to main content

CLDR-i mitmusereeglid: valideeri i18n-i mitmusekategooriaid eri keeltes

Inglise keeles on kaks mitmusevormi, araabia keeles kuus ja vene keeles neli. Kui i18n-i seadistus käsitleb ainult one ja other, on rakendus enamikus keeltes katki. See juhend selgitab CLDR-i mitmusereegleid ja nende valideerimist.

1

Mis on CLDR-i mitmusereeglid?

Unicode CLDR (Common Locale Data Repository) määratleb kuus mitmusekategooriat: zero, one, two, few, many ja other. Iga keel kasutab nende kategooriate alamhulka kindlate arvureeglitega. Inglise keel kasutab one täpselt arvu 1 jaoks ja other kõige muu jaoks. Enamik keeli on aga keerukamad — valed mitmusevormid tekitavad grammatiliselt katkist teksti, mis jätab rakendusest amatöörliku mulje.

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.
Kategooria other on nõutud igas keeles. See on varukategooria, kui ükski teine reegel ei sobi. Kui määratled ainult one ja other, oled inglise keeles kaitstud, kuid enam kui 60 protsendis maailma keeltest on rakendus katki.
2

Kuus mitmusekategooriat

CLDR määratleb täpselt kuus mitmusekategooriat. Kõik keeled ei kasuta kõiki kuut — inglise keel kasutab ainult kaht, araabia keel kõiki kuut. i18n-failides tuleb määrata iga sihtkeele nõutud kategooriad, muidu näevad kasutajad krahhe, töötlemata võtmeid või grammatiliselt vigast teksti.

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

Mitmusekategooriad keelte kaupa

Kiirviide levinud sihtkeelte nõutud mitmusekategooriate jaoks. Kasuta seda tõlkefailide mitmusevormide määratlemisel.

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

Automaatne mitmusevormide valideerimine

i18n-validate kontrollib, et tõlkefailide iga mitmusevõti määratleks kõik sihtkeele nõutud CLDR-i kategooriad. Kui venekeelses failis on ainult vormid one ja other, märgib tööriist puuduvad kategooriad few ja many vigadeks. Käivita see CI-s, et tabada mitmuseprobleemid enne kasutajateni jõudmist.

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 mitmusevormide jaoks

Soovitatav viis mitmusevormidega tõlgete määratlemiseks on ICU MessageFormat. See kasutab üht stringi, millesse on põimitud mitmusereeglid: {count, plural, one {# item} other {# items}'}. ICU-t toetavad react-intl, vue-i18n, Angular Transloco, Flutter ja enamik tänapäevaseid i18n-raamistikke.

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)
ICU MessageFormat'is asendatakse sümbol # vormindatud arvuga. Kasuta mitmusevormides muutujanime kõvakodeerimise asemel sümbolit #. Kirjuta näiteks '# üksus / # üksust', selle asemel et arvumuutujat otseselt korrata.

Proovi i18n Agent'i kohe

Kukuta tõlkefail siia

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

või klõpsa faili valimiseks

Sihtkeeled

Registreerumine pole vajalikKohene hinnang

CLDR-i mitmusereeglite KKK