Skip to main content

CLDR daudzskaitļa kārtulas: validējiet i18n daudzskaitļa kategorijas dažādās valodās

Angļu valodai ir 2 daudzskaitļa formas. Arābu — 6. Krievu — 4. Ja jūsu i18n iestatījums apstrādā tikai „one“ un „other“, lietotne vairumā valodu nedarbojas pareizi. Šajā ceļvedī izskaidrotas CLDR daudzskaitļa kārtulas un to validēšana.

1

Kas ir CLDR daudzskaitļa kārtulas?

Unicode CLDR (Common Locale Data Repository) definē sešas daudzskaitļa kategorijas: zero, one, two, few, many un other. Katra valoda izmanto šo kategoriju apakškopu ar konkrētām skaitliskām kārtulām. Angļu valoda izmanto one (tieši 1) un other (viss pārējais). Taču vairums valodu ir sarežģītākas, un nepareizas daudzskaitļa formas rada gramatiski nepareizu tekstu, kas liek lietotnei izskatīties amatieriskai.

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.
Kategorija „other“ ir obligāta katrai valodai. Tā ir atkāpšanās kategorija, ja neviena cita neatbilst. Ja definējat tikai „one“ un „other“, angļu valodā viss darbojas, bet vairāk nekā 60 % pasaules valodu — ne.
2

Sešas daudzskaitļa kategorijas

CLDR definē tieši sešas daudzskaitļa kategorijas. Ne katra valoda izmanto visas sešas — angļu valoda izmanto tikai divas, arābu visas sešas. Jūsu i18n failos jādefinē katrai mērķvalodai nepieciešamās kategorijas, citādi lietotāji piedzīvos avārijas, redzēs neapstrādātas atslēgas vai gramatiski nepareizu tekstu.

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

Daudzskaitļa kategorijas pēc valodas

Īsa uzziņa par daudzskaitļa kategorijām, kas nepieciešamas izplatītām mērķvalodām. Izmantojiet to, definējot daudzskaitļa formas tulkojumu failos.

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

Automatizēta daudzskaitļa validācija

i18n-validate pārbauda, vai katra daudzskaitļa atslēga tulkojumu failos definē visas mērķvalodai nepieciešamās CLDR kategorijas. Ja krievu valodas failā ir tikai „one“ un „other“ formas, rīks atzīmē trūkstošās „few“ un „many“ kategorijas kā kļūdas. Palaidiet to CI vidē, lai atklātu daudzskaitļa problēmas, pirms tās sasniedz lietotājus.

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 daudzskaitlim

Ieteicamais veids, kā definēt daudzskaitļa tulkojumus, ir ICU MessageFormat. Tas izmanto vienu virkni ar iegultām daudzskaitļa kārtulām: {count, plural, one {# item} other {# items}'}. ICU atbalsta react-intl, vue-i18n, Angular Transloco, Flutter un vairums mūsdienu i18n ietvaru.

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 simbols # tiek aizstāts ar formatēto skaitu. Daudzskaitļa formās izmantojiet #, nevis kodā ierakstītu mainīgā nosaukumu. Piemēram, rakstiet „# item / # items“, nevis skaidri atkārtojiet skaita mainīgo.

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Bieži uzdotie jautājumi par CLDR daudzskaitļa kārtulām