Skip to main content

Regras de plural CLDR: validar categorias de plural de i18n entre idiomas

O inglês tem 2 formas de plural. O árabe tem 6. O russo tem 4. Se a sua configuração de i18n só tratar de 'one' e 'other', a sua aplicação está danificada na maioria dos idiomas. Este guia explica as regras de plural CLDR e como validá-las.

1

O que são as regras de plural CLDR?

O Unicode CLDR (Common Locale Data Repository) define seis categorias de plural: zero, one, two, few, many e other. Cada idioma utiliza um subconjunto destas categorias com regras numéricas específicas. O inglês utiliza one (exatamente 1) e other (tudo o resto). Contudo, a maioria dos idiomas é mais complexa e formas plurais erradas causam texto gramaticalmente incorreto, o que dá à sua aplicação um aspeto amador.

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.
A categoria 'other' é obrigatória em todos os idiomas. É o recurso utilizado quando nenhuma outra categoria corresponde. Se definir apenas 'one' e 'other', estará correto em inglês, mas incorreto em mais de 60% dos idiomas do mundo.
2

As seis categorias de plural

CLDR define exatamente seis categorias de plural. Nem todos os idiomas utilizam as seis: o inglês só utiliza duas e o árabe utiliza todas. Os seus ficheiros de i18n têm de definir as categorias exigidas por cada idioma de destino; caso contrário, os utilizadores veem falhas, chaves sem tratamento ou texto gramaticalmente incorreto.

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

Categorias de plural por idioma

Referência rápida das categorias de plural exigidas por idiomas de destino comuns. Consulte-a ao definir formas plurais nos seus ficheiros de tradução.

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

Validação automatizada de plurais

i18n-validate verifica se cada chave de plural nos seus ficheiros de tradução define todas as categorias CLDR exigidas pelo idioma de destino. Se o seu ficheiro russo só tiver as formas 'one' e 'other', a ferramenta assinala as categorias 'few' e 'many' em falta como erros. Execute-a em CI para detetar problemas de plural antes de chegarem aos utilizadores.

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 plurais

A forma recomendada de definir traduções plurais é ICU MessageFormat. Utiliza uma única cadeia com regras de plural incorporadas: {count, plural, one {# item} other {# items}'}. ICU é compatível com react-intl, vue-i18n, Angular Transloco, Flutter e a maioria dos frameworks de i18n modernos.

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)
O símbolo # em ICU MessageFormat é substituído pela contagem formatada. Utilize # em vez de codificar diretamente o nome da variável nas suas formas plurais. Por exemplo, escreva '# item / # items' em vez de repetir explicitamente a variável de contagem.

Experimente já o i18n Agent

Largue aqui o seu ficheiro de tradução

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

ou clique para selecionar

Idiomas de destino

Sem registoEstimativa imediata

Perguntas frequentes sobre regras de plural CLDR