Skip to main content

CLDR-meervoudsregels: valideer i18n-meervoudscategorieën voor verschillende talen

Het Engels heeft 2 meervoudsvormen, het Arabisch 6 en het Russisch 4. Als je i18n-configuratie alleen 'one' en 'other' verwerkt, werkt je app in de meeste talen niet goed. In deze gids lees je hoe CLDR-meervoudsregels werken en hoe je ze valideert.

1

Wat zijn CLDR-meervoudsregels?

Unicode CLDR (Common Locale Data Repository) definieert zes meervoudscategorieën: zero, one, two, few, many en other. Elke taal gebruikt een deel van deze categorieën met specifieke numerieke regels. Het Engels gebruikt one (precies 1) en other (alle overige getallen). De meeste talen zijn echter ingewikkelder. Verkeerde meervoudsvormen leiden tot grammaticaal onjuiste tekst, waardoor je app onprofessioneel overkomt.

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.
De categorie 'other' is verplicht voor elke taal. Dit is de terugvalcategorie als geen andere categorie van toepassing is. Als je alleen 'one' en 'other' definieert, zit je goed voor het Engels, maar niet voor meer dan 60% van de talen wereldwijd.
2

De zes meervoudscategorieën

CLDR definieert precies zes meervoudscategorieën. Niet elke taal gebruikt ze allemaal: het Engels gebruikt er slechts twee en het Arabisch alle zes. Je i18n-bestanden moeten de categorieën bevatten die voor elke doeltaal vereist zijn. Anders krijgen gebruikers crashes, onbewerkte sleutels of grammaticaal onjuiste tekst te zien.

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

Meervoudscategorieën per taal

Beknopt overzicht van de meervoudscategorieën die veelgebruikte doeltalen vereisen. Gebruik dit wanneer je meervoudsvormen in je vertaalbestanden definieert.

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

Geautomatiseerde meervoudsvalidatie

i18n-validate controleert of elke meervoudssleutel in je vertaalbestanden alle CLDR-categorieën definieert die de doeltaal vereist. Als je Russische bestand alleen de vormen 'one' en 'other' bevat, markeert het hulpprogramma de ontbrekende categorieën 'few' en 'many' als fouten. Voer het uit in CI om problemen met meervoudsvormen te onderscheppen voordat gebruikers ermee te maken krijgen.

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 voor meervoudsvormen

De aanbevolen manier om vertalingen met meervoudsvormen te definiëren is ICU MessageFormat. Hierbij gebruik je één tekenreeks met ingesloten meervoudsregels: {count, plural, one {# item} other {# items}'}. ICU wordt ondersteund door react-intl, vue-i18n, Angular Transloco, Flutter en de meeste 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)
Het #-symbool in ICU MessageFormat wordt vervangen door het opgemaakte aantal. Gebruik # in je meervoudsvormen en codeer de variabelenaam niet rechtstreeks. Schrijf bijvoorbeeld '# item / # items' in plaats van de tellervariabele expliciet te herhalen.

Probeer i18n Agent nu

Zet je vertaalbestand hier neer

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

of klik om een bestand te selecteren

Doeltalen

Geen registratie nodigDirecte prijsindicatie

Veelgestelde vragen over CLDR-meervoudsregels