Skip to main content

Reglas de plural CLDR: valide categorías de i18n entre idiomas

El inglés tiene 2 formas plurales, el árabe 6 y el ruso 4. Si su configuración solo gestiona 'one' y 'other', su aplicación falla en la mayoría de los idiomas. Esta guía explica CLDR y cómo validarlo.

1

¿Qué son las reglas de plural CLDR?

El Unicode CLDR (Common Locale Data Repository) define seis categorías: zero, one, two, few, many y other. Cada idioma utiliza un subconjunto con reglas numéricas concretas. El inglés usa one —exactamente 1— y other —todo lo demás—. Muchos idiomas son más complejos; equivocarse genera texto gramaticalmente incorrecto y una impresión poco profesional.

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.
La categoría 'other' es obligatoria en todos los idiomas. Sirve de respaldo cuando ninguna otra regla coincide. Si solo define 'one' y 'other', estará bien en inglés, pero fallará en más del 60 % de los idiomas del mundo.
2

Las seis categorías de plural

CLDR define exactamente seis categorías. No todos los idiomas las usan todas: el inglés solo dos y el árabe las seis. Sus archivos deben incluir las que necesite cada idioma, o los usuarios verán bloqueos, claves sin procesar o gramática incorrecta.

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

Categorías plurales por idioma

Referencia rápida de las categorías necesarias en idiomas de destino habituales. Utilícela al definir las formas en sus archivos de traducción.

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

Validación automatizada de plurales

i18n-validate comprueba que cada clave plural en sus archivos de traducción defina todas las categorías CLDR necesarias para el idioma de destino. Si su archivo ruso solo tiene las formas 'one' y 'other', la herramienta marca la ausencia de las categorías 'few' y 'many' como errores. Ejecútelo en CI para detectarlos antes de que lleguen a los usuarios.

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 para plurales

La forma recomendada de definir traducciones plurales es ICU MessageFormat. Utiliza una sola cadena con reglas integradas: {count, plural, one {# item} other {# items}'}. ICU es compatible con react-intl, vue-i18n, Angular Transloco, Flutter y la mayoría de los frameworks modernos de i18n.

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)
El símbolo # en ICU MessageFormat se reemplaza por el recuento con formato. Utilice # en vez de codificar directamente el nombre de la variable en sus formas plurales. Por ejemplo, escriba «# item / # items» en vez de repetir la variable count de forma explícita.

Pruebe i18n Agent ahora

Arrastre y suelte aquí su archivo de traducción

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

o haga clic para seleccionar

Idiomas de destino

No es necesario registrarsePresupuesto al instante

Preguntas frecuentes sobre reglas de plural CLDR