
CLDR daugiskaitos taisyklės: tikrinkite i18n daugiskaitos kategorijas įvairiose kalbose
Anglų kalba turi 2 daugiskaitos formas. Arabų – 6. Rusų – 4. Jei jūsų i18n konfigūracija tvarko tik „one“ ir „other“, programa neveikia daugeliu kalbų. Šiame vadove paaiškinamos CLDR daugiskaitos taisyklės ir jų tikrinimas.
Kas yra CLDR daugiskaitos taisyklės?
Unicode CLDR (Common Locale Data Repository) apibrėžia šešias daugiskaitos kategorijas: zero, one, two, few, many ir other. Kiekviena kalba naudoja dalį šių kategorijų su konkrečiomis skaitinėmis taisyklėmis. Anglų kalba naudoja one (tiksliai 1) ir other (visa kita). Tačiau dauguma kalbų yra sudėtingesnės, o netinkamos daugiskaitos formos lemia gramatiškai netaisyklingą tekstą, dėl kurio programa atrodo mėgėjiška.
// 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.Šešios daugiskaitos kategorijos
CLDR apibrėžia lygiai šešias daugiskaitos kategorijas. Ne kiekviena kalba naudoja visas šešias – anglų kalba naudoja tik dvi, arabų – visas šešias. i18n failuose turi būti apibrėžtos kiekvienai tikslinei kalbai reikalingos kategorijos, kitaip naudotojai matys strigtis, neapdorotus raktus arba gramatiškai netaisyklingą tekstą.
// 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)Daugiskaitos kategorijos pagal kalbą
Trumpa informacija apie įprastoms tikslinėms kalboms reikalingas daugiskaitos kategorijas. Naudokite ją apibrėždami daugiskaitos formas vertimo failuose.
// 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 translatedAutomatizuotas daugiskaitos tikrinimas
i18n-validate tikrina, ar kiekvienas vertimo failų daugiskaitos raktas apibrėžia visas tikslinei kalbai reikalingas CLDR kategorijas. Jei rusų kalbos faile yra tik „one“ ir „other“ formos, įrankis pažymi trūkstamas „few“ ir „many“ kategorijas kaip klaidas. Vykdykite jį CI aplinkoje, kad daugiskaitos problemas aptiktumėte prieš joms pasiekiant naudotojus.
# 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.htmlICU MessageFormat daugiskaitai
Rekomenduojamas būdas daugiskaitos vertimams apibrėžti yra ICU MessageFormat. Naudojama viena eilutė su įterptomis daugiskaitos taisyklėmis: {count, plural, one {# item} other {# items}'}. ICU palaiko react-intl, vue-i18n, Angular Transloco, Flutter ir dauguma šiuolaikinių i18n sistemų.
// 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}}"
}# 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)Išbandykite i18n Agent dabar
Nuvilkite vertimo failą čia
JSON, YAML, PO, XML, CSV, Markdown, Properties
arba spustelėkite norėdami pasirinkti
Tikslinės kalbos