Skip to main content

CLDR-pluralregler: Valider i18n-pluralkategorier på tværs af sprog

Engelsk har 2 pluralformer. Arabisk har 6. Russisk har 4. Hvis din i18n-opsætning kun håndterer 'one' og 'other', fungerer din app ikke korrekt på de fleste sprog. Denne guide forklarer CLDR-pluralregler og hvordan du validerer dem.

1

Hvad er CLDR-pluralregler?

Unicode CLDR (Common Locale Data Repository) definerer seks pluralkategorier: zero, one, two, few, many og other. Hvert sprog bruger en delmængde af disse kategorier med bestemte numeriske regler. Engelsk bruger one (præcis 1) og other (alt andet). De fleste sprog er dog mere komplekse og forkerte pluralformer giver grammatisk ukorrekt tekst, som får din app til at virke uprofessionel.

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 sprog. Den bruges som reserve, når ingen anden kategori matcher. Hvis du kun definerer 'one' og 'other', fungerer det på engelsk, men ikke på mere end 60 % af verdens sprog.
2

De seks pluralkategorier

CLDR definerer præcis seks pluralkategorier. Ikke alle sprog bruger dem alle – engelsk bruger kun to, mens arabisk bruger alle seks. Dine i18n-filer skal definere de kategorier, som hvert målsprog kræver. Ellers oplever brugerne nedbrud, rå nøgler eller grammatisk ukorrekt 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

Pluralkategorier efter sprog

Hurtig reference over de pluralkategorier, som almindelige målsprog kræver. Brug den, når du definerer pluralformer i dine oversættelsesfiler.

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 kontrollerer, at hver pluralnøgle i dine oversættelsesfiler definerer alle de CLDR-kategorier, som målsproget kræver. Hvis din russiske fil kun indeholder formerne 'one' og 'other', markerer værktøjet de manglende kategorier 'few' og 'many' som fejl. Kør det i CI for at finde pluralproblemer, før de når ud til brugerne.

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 til pluralformer

Den anbefalede måde at definere pluraloversættelser på er ICU MessageFormat. Formatet bruger en enkelt streng med indlejrede pluralregler: {count, plural, one {# item} other {# items}'}. ICU understøttes af react-intl, vue-i18n, Angular Transloco, Flutter og de fleste moderne i18n-frameworks.

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 formaterede antal. Brug # i stedet for at indkode variabelnavnet direkte i dine pluralformer. Skriv for eksempel '# element / # elementer' i stedet for at gentage antalsvariablen eksplicit.

Prøv i18n Agent nu

Slip din oversættelsesfil her

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

eller klik for at vælge en fil

Målsprog

Kræver ingen tilmeldingEstimat med det samme

Ofte stillede spørgsmål om CLDR-pluralregler