Skip to main content

Правила на CLDR за множествено число: валидиране на категориите в i18n за различни езици

Английският има 2 форми за множествено число. Арабският има 6. Руският има 4. Ако Вашата конфигурация за i18n обработва само 'one' и 'other', приложението Ви не работи правилно на повечето езици. Това ръководство обяснява правилата на CLDR за множествено число и начина за тяхното валидиране.

1

Какво представляват правилата на CLDR за множествено число?

Unicode CLDR (Common Locale Data Repository) определя шест категории за множествено число: zero, one, two, few, many и other. Всеки език използва подмножество от тези категории със собствени числови правила. Английският използва one (точно 1) и other (всичко останало). Повечето езици обаче са по-сложни — неправилните форми за множествено число водят до граматически грешен текст, който придава непрофесионален вид на приложението Ви.

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.
Категорията 'other' е задължителна за всеки език. Тя служи като резервна, когато никоя друга категория не съответства. Ако определите само 'one' и 'other', решението Ви ще работи правилно на английски, но ще бъде неправилно за 60%+ от езиците по света.
2

Шестте категории за множествено число

CLDR определя точно шест категории за множествено число. Не всеки език използва и шестте — английският използва само две, а арабският използва всички. Файловете Ви за i18n трябва да определят категориите, необходими за всеки целеви език, иначе потребителите ще виждат сривове, необработени ключове или граматически неправилен текст.

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

Категории за множествено число по езици

Кратка справка за категориите за множествено число, необходими за често използвани целеви езици. Използвайте я, когато определяте формите за множествено число във файловете си с преводи.

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

Автоматизирано валидиране на множествените форми

i18n-validate проверява дали всеки ключ за множествено число във файловете Ви с преводи определя всички категории на CLDR, необходими за целевия език. Ако файлът Ви на руски съдържа само формите 'one' и 'other', инструментът отбелязва липсващите категории 'few' и 'many' като грешки. Изпълнявайте го в CI, за да откривате проблемите с множественото число, преди да достигнат до потребителите.

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 за множествено число

Препоръчителният начин за определяне на преводи с множествени форми е ICU MessageFormat. Той използва един низ с вградени правила за множествено число: {count, plural, one {# елемент} other {# елемента}'}. ICU се поддържа от react-intl, vue-i18n, Angular Transloco, Flutter и повечето съвременни рамки за 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)
Символът # в ICU MessageFormat се заменя с форматирания брой. Използвайте #, вместо да записвате името на променливата директно във формите за множествено число. Например напишете '# елемент / # елемента', вместо да повтаряте изрично променливата за броя.

Изпробвайте i18n Agent сега

Пуснете тук Вашия файл за превод

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

или натиснете, за да изберете файл

Целеви езици

Не се изисква регистрацияНезабавна оценка

Често задавани въпроси за правилата на CLDR за множествено число