Skip to main content

CLDR-pluralregler: Validera i18n-pluralkategorier för olika språk

Engelska har 2 pluralformer. Arabiska har 6. Ryska har 4. Om din i18n-konfiguration bara hanterar 'one' och 'other' fungerar appen inte korrekt på de flesta språk. Den här guiden förklarar CLDR-pluralregler och hur du validerar dem.

1

Vad är CLDR-pluralregler?

Unicode CLDR (Common Locale Data Repository) definierar sex pluralkategorier: zero, one, two, few, many och other. Varje språk använder en delmängd av kategorierna med särskilda numeriska regler. Engelska använder one (exakt 1) och other (allt annat). De flesta språk är dock mer komplexa – och felaktiga pluralformer ger grammatiskt felaktig text som får appen att kännas oprofessionell.

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.
Kategorin 'other' krävs för alla språk. Den används som reserv när ingen annan kategori matchar. Om du bara definierar 'one' och 'other' fungerar det på engelska, men inte på över 60 % av världens språk.
2

De sex pluralkategorierna

CLDR definierar exakt sex pluralkategorier. Alla språk använder inte samtliga sex – engelska använder bara två medan arabiska använder alla sex. Dina i18n-filer måste definiera de kategorier som varje målspråk kräver, annars kan användarna mötas av krascher, oöversatta nycklar eller grammatiskt felaktig text.

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

Pluralkategorier per språk

Snabbreferens för de pluralkategorier som vanliga målspråk kräver. Använd den när du definierar pluralformer i dina översättningsfiler.

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

Automatisk pluralvalidering

i18n-validate kontrollerar att varje pluralnyckel i dina översättningsfiler definierar alla CLDR-kategorier som målspråket kräver. Om din ryska fil bara innehåller formerna 'one' och 'other' markerar verktyget de saknade kategorierna 'few' och 'many' som fel. Kör det i CI för att hitta pluralproblem innan de når användarna.

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 för pluralformer

Det rekommenderade sättet att definiera pluralöversättningar är ICU MessageFormat. Formatet använder en enda sträng med inbäddade pluralregler: {count, plural, one {# objekt} other {# objekt}'}. ICU stöds av react-intl, vue-i18n, Angular Transloco, Flutter och de flesta moderna i18n-ramverk.

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)
Symbolen # i ICU MessageFormat ersätts med det formaterade antalet. Använd # i stället för att hårdkoda variabelnamnet i pluralformerna. Skriv exempelvis '# objekt / # objekt' i stället för att uttryckligen upprepa antalsvariabeln.

Prova i18n Agent nu

Släpp din översättningsfil här

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

eller klicka för att välja en fil

Målspråk

Ingen registrering krävsPrisuppskattning direkt

Vanliga frågor om CLDR-pluralregler