Skip to main content

CLDR-regler for flertall: Valider i18n-flertallskategorier på tvers av språk

Engelsk har 2 flertallsformer. Arabisk har 6. Russisk har 4. Hvis i18n-oppsettet ditt bare håndterer 'one' og 'other', fungerer ikke appen riktig på de fleste språk. Denne veiledningen forklarer CLDR-reglene for flertall og hvordan du validerer dem.

1

Hva er CLDR-regler for flertall?

Unicode CLDR (Common Locale Data Repository) definerer seks flertallskategorier: zero, one, two, few, many og other. Hvert språk bruker et utvalg av disse kategoriene med bestemte tallregler. Engelsk bruker one (nøyaktig 1) og other (alt annet). De fleste språk er imidlertid mer komplekse – og feil flertallsformer fører til grammatisk feil tekst som får appen til å virke amatørmessig.

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.
Kategorien 'other' er obligatorisk for alle språk. Den brukes som reserve når ingen andre kategorier samsvarer. Hvis du bare definerer 'one' og 'other', fungerer det på engelsk, men ikke på 60%+ av verdens språk.
2

De seks flertallskategoriene

CLDR definerer nøyaktig seks flertallskategorier. Ikke alle språk bruker alle seks – engelsk bruker bare to, mens arabisk bruker alle seks. i18n-filene dine må definere kategoriene hvert målspråk krever, ellers kan brukerne oppleve krasj, se ubehandlede nøkler eller få grammatisk feil 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

Flertallskategorier etter språk

Hurtigreferanse for flertallskategoriene som kreves av vanlige målspråk. Bruk den når du definerer flertallsformer i oversettelsesfilene.

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

Automatisert flertallsvalidering

i18n-validate kontrollerer at hver flertallsnøkkel i oversettelsesfilene definerer alle CLDR-kategoriene som kreves av målspråket. Hvis den russiske filen bare har formene 'one' og 'other', flagger verktøyet de manglende kategoriene 'few' og 'many' som feil. Kjør det i CI for å finne flertallsproblemer før de når brukerne.

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 for flertallsformer

Den anbefalte måten å definere flertallsoversettelser på er ICU MessageFormat. Formatet bruker én streng med innebygde flertallsregler: {count, plural, one {# item} other {# items}'}. ICU støttes av react-intl, vue-i18n, Angular Transloco, Flutter og de fleste moderne i18n-rammeverk.

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)
Symbolet # i ICU MessageFormat erstattes med det formaterte antallet. Bruk # i stedet for å hardkode variabelnavnet i flertallsformene. Skriv for eksempel '# item / # items' i stedet for å gjenta count-variabelen uttrykkelig.

Prøv i18n Agent nå

Slipp oversettelsesfilen din her

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

eller klikk for å bla gjennom

Målspråk

Ingen registrering krevesUmiddelbart estimat

Vanlige spørsmål om CLDR-regler for flertall