
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.
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.
// 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.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 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)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.
// 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 translatedAutomatizē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.
# 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 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 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)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