Plural rules by language: the complete CLDR guide

A reference table of CLDR plural categories for 163 languages, plus why one does not mean 1 and how each i18n framework expects you to spell the rules.

Every internationalization library eventually asks you the same question: how many versions of this sentence does the language need? For English the answer is two, and it is tempting to generalise from there. That generalisation is where plural bugs come from.

This is a reference guide. The table below lists the plural categories for all 163 languages defined in Unicode CLDR version 48 — the same data WebTranslateIt uses to decide how many translation fields to show for a plural segment. Before the table, the two ideas you need in order to read it correctly.

Plural categories are names for sets of numbers

CLDR does not define “the singular” and “the plural”. It defines up to six categorieszero, one, two, few, many, other — and each language decides which numbers fall into which category. The names are labels, not quantities.

Concretely:

Language Category one covers Category other covers
English 1 0, 2, 3, … and every decimal
French 0 and 1 2, 3, …
Russian 1, 21, 31, 41, 51 … (but not 11) decimals, plus whatever few and many do not take

So if count == 1 is wrong in French, because French says “0 jour” and “1 jour” share a form. And it is badly wrong in Russian, where 21 takes the same form as 1 and 11 does not.

The rule to internalise: never map a category to a number yourself. Ask the CLDR rules for the category, then look up the string for that category. Every mature i18n library does this for you, which is exactly why you should hand it the count rather than doing the branching in application code.

The one exception worth knowing is that categories cover decimals too, and often differently. Czech puts 1.5 in many and the integer 5 in other — the decimal-ness itself changes the form.

other is always required, everything else is not

Every language defines other. Most define nothing else. A translation file for a language should contain exactly the categories CLDR lists for it: a Polish file with one/other and nothing else is missing two forms, and a Japanese file with one/other has one form too many, which is harmless but reveals the file was generated from an English template without consulting the rules.

This is also why the same source string produces a different number of input fields per language. Two English fields become four Polish fields and six Arabic ones. That is not the tool being awkward; it is the language.

Cardinal versus ordinal

Everything above describes cardinal plurals — one file, two files, five files. CLDR separately defines ordinal rules for first, second, third, which have their own categories and their own per-language sets. English is the clearest illustration: cardinals need two forms, ordinals need four (1st, 2nd, 3rd, 4th). If you are formatting positions, ranks or dates by ordinal, you need the ordinal rules, and selectordinal in ICU MessageFormat rather than plural. The table in this guide covers cardinals.

How the rules are spelled in each framework

The categories are universal; the notation is not.

Framework Notation Example
GNU gettext (.po) nplurals count plus a C expression selecting an index `nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 \
Rails / Ruby I18n (YAML) nested keys named after the categories pl: { messages: { one: …, few: …, many: …, other: … } }
ICU MessageFormat {count, plural, one {…} other {…}} works in ICU4J, ICU4C, FormatJS, messageformat.js
iOS .stringsdict XML plist with NSStringPluralRuleType and one key per category <key>few</key><string>%d wiadomości</string>
Android strings.xml <plurals> with <item quantity="few"> quantities are the CLDR category names
i18next key suffixes _one, _few, _many, _other (v4+) item_few, item_many
Java ResourceBundle no native support — use ICU MessageFormat

Note the trap in gettext: its plural= expression returns an index, not a category name. Index 0 is whichever form the expression maps it to, which is conventionally but not necessarily the one form. When you convert a .po file to a category-based format, you have to evaluate the expression rather than assume position 0 means one.

Plural rules by language

CLDR v48, cardinal plural categories, 163 languages. The numbers shown are the values that select each category — a compact reading of the underlying rules rather than the rules themselves.

Language Code Forms Categories, and the numbers that select them
Acoli ach 1 other 0-999, 1.2…
Afrikaans af 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Akan ak 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Albanian sq 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Amharic am 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Arabic ar 6 zero 0 · one 1 · two 2 · few 3-10, 103-110, 203-210… · many 11-99, 111-199, 211-299… · other 100-102, 200-202, 300-302… 0.2, 1.07, 2.94, 3.81, 11.68, 100.55…
Aragonese an 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Armenian hy, hye 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Assamese as 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Asturian ast 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Azerbaijani az 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Baluchi bal 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Bambara bm 1 other 0-999, 1.2…
Basque eu 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Belarusian be 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
Bemba bem 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Bengali bn 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Bihari bh 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Bosnian bs 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
Breton br 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Bulgarian bg 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Burmese my 1 other 0-999, 1.2…
Catalan ca 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Central Khmer km 1 other 0-999, 1.2…
Cherokee chr 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Chinese zh 1 other 0-999, 1.2…
Chuvash cv 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Cornish kw 6 zero 0 · one 1 · two 2, 22, 42, 62, 82, 102… · few 3, 23, 43, 63, 83… · many 4, 24, 44, 64, 84… · other 5-21, 25-41, 45-61…
Crimean Turkish crh 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Croatian hr 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
Czech cs 4 one 1 · few 2-4 · many 0.0-1.5, 10.0, 100.0… (decimals) · other 0, 5-20, 25-30…
Danish da 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Dutch nl 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Dzongkha dz 1 other 0-999, 1.2…
English en 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Esperanto eo 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Estonian et 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Faroese fo 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Filipino fil 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Finnish fi 2 one 1 · other 0, 2-999…, 1.2, 2.07…
French fr 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Friulian fur 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Fulah ff 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Gaelic gd 4 one 1, 11 · two 2, 12 · few 3-10, 13-19 · other 0, 20-99, 100, 1000…, 0.5, 1.7…
Galician gl 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Georgian ka 2 one 1 · other 0, 2-999…, 1.2, 2.07…
German de 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Greek el 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Gujarati gu 2 one 1 · other 0, 2-999…, 1.2, 2.07…
guw guw 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Hakha Chin cnh 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Hausa ha 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Hebrew he 3 one 1 · two 2 · other 0, 3-999…, 0.5, 1.0, 2.5…
Hindi hi 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Hungarian hu 2 one 1 · other 0, 2-999…, 1.2, 2.07…
hyw hyw 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Icelandic is 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Ido io 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Igbo ig 1 other 0-999, 1.2…
Inari Sami smn 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Indonesian id 1 other 0-999, 1.2…
Irish ga 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Italian it 2 one 1 · other 0, 2-999…, 1.2, 2.07…
iw iw 3 one 1 · two 2 · other 0, 3-999…, 0.5, 1.0, 2.5…
Japanese ja 1 other 0-999, 1.2…
Javanese jv 1 other 0-999, 1.2…
Kabyle kab 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Kannada kn 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Kazakh kk 2 one 1 · other 0, 2-999…, 1.2, 2.07…
kde kde 1 other 0-999, 1.2…
kea kea 1 other 0-999, 1.2…
Kinyarwanda rw 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Kirghiz ky 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Konkani kok 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Korean ko 1 other 0-999, 1.2…
ksh ksh 3 zero 0 · one 1 · other 2-999…, 0.5, 1.2…
Kurdish ku 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Latvian lv 3 zero 0 · one 1, 21, 31, 41, 51, 61, … · other 2-20, 22-30, 32-40… 0.2, 1.07, 2.94…
lij lij 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Limburgan li 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Lingala ln 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Lithuanian lt 3 one 1, 21, 31, 41, 51, 61 · few 2-9, 22-29, 32-39… · other 0, 10-20, 30, 40, 50…, 1.2, 2.07, 10.94…
lkt lkt 1 other 0-999, 1.2…
lld lld 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Low German nds 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Lule Sami smj 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Luxembourgish lb 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Macedonian mk 2 one 1, 21, 31, 41, 51, 61… · other 0, 2-20, 22-30, 32-40…, 1.2, 2.07…
Maithili mai 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Malagasy mg 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Malay ms 1 other 0-999, 1.2…
Malayalam ml 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Maltese mt 4 one 1 · few 0, 2-10, 102-110, 202-210… · many 11-19, 111-119, 211-219… · other 20-101, 120-201, 220-301…, 1.2, 2.07, 11.94, 20.81…
Manx gv 5 one 1, 11, 21, 31… · two 2, 12, 22, 32… · few 0, 20, 40, 60, 80, 100… · many 0.5, 1.2, 2.7… (decimals) · other 3-10, 13-19, 23-29…
Maori mi 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Marathi mr 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Mongolian mn 2 one 1 · other 0, 2-999…, 1.2, 2.07…
N'Ko nqo 1 other 0-999, 1.2…
Nahuatl languages nah 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Nepali ne 2 one 1 · other 0, 2-999…, 1.2, 2.07…
no no 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Northern Sami se 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Norwegian Bokmål nb 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Norwegian Nynorsk nn 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Occitan (post 1500) oc 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Oriya or 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Oromo om 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Panjabi pa 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Papiamento pap 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Pedi nso 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Persian fa 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Polish pl 4 one 1 · few 2-4, 22-24, 32-34… · many 0, 5-21, 25-31, 35-41 · other 1.2, 2.07, 5.94…
Portuguese pt 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Pushto ps 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Romanian ro 3 one 1 · few 0, 2-19, 101-119, 201-219… · other 20-100, 120-200, 220-300…, 1.2, 2.07, 20.94…
Romansh rm 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Russian ru 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
Sami languages (Other) smi 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Sango sg 1 other 0-999, 1.2…
Santali sat 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Sardinian sc 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Serbian sr 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
Serbo-Croatian sh 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
ses ses 1 other 0-999, 1.2…
shi shi 3 one 0, 1 · few 2-10 · other 11-999…, 0.5, 1.2…
Sicilian scn 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Sinhala si 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Skolt Sami sms 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Slovak sk 4 one 1 · few 2-4 · many 0.0-1.5, 10.0, 100.0… (decimals) · other 0, 5-20, 25-30…
Slovenian sl 4 one 1, 101, 201, 301, 401, 501… · two 2, 102, 202, 302, 402, 502… · few 3, 4, 103, 104, 203, 204… · other 0, 5-100, 105-200, 205-300…, 1.2, 2.07, 3.94, 5.81…
Somali so 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Southern Sami sma 3 one 1 · two 2 · other 0, 3-999…, 1.2, 2.07, 3.94…
Spanish es 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Sundanese su 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Swahili sw 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Swedish sv 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Swiss German gsw 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Syriac syr 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Tagalog tl 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Tamil ta 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Telugu te 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Thai th 1 other 0-999, 1.2…
Tibetan bo 1 other 0-999, 1.2…
Tigrinya ti 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Tonga (Tonga Islands) to 1 other 0-999, 1.2…
Turkish tr 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Turkmen tk 2 one 1 · other 0, 2-999…, 1.2, 2.07…
tzm tzm 2 one 0, 1, 11-99 · other 2-10, 100-999…
Uighur ug 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Ukrainian uk 4 one 1, 21, 31, 41, 51, 61… · few 2-4, 22-24, 32-34… · many 0, 5-20, 25-30, 35-40… · other 1.2, 2.07, 5.94…
Urdu ur 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Uzbek uz 2 one 1 · other 0, 2-999…, 1.2, 2.07…
vec vec 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Vietnamese vi 1 other 0-999, 1.2…
Walloon wa 2 one 0, 1 · other 2-999…, 1.2, 2.07, …
Welsh cy 6 zero 0 · one 1 · two 2 · few 3 · many 6 · other 4, 5, 7-999…, 0.2, 1.07…
Western Frisian fy 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Wolof wo 1 other 0-999, 1.2…
Xhosa xh 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Yakut sah 1 other 0-999, 1.2…
Yiddish yi 2 one 1 · other 0, 2-999…, 1.2, 2.07…
Yoruba yo 1 other 0-999, 1.2…
Zulu zu 2 one 1 · other 0, 2-999…, 1.2, 2.07…

The distribution, at a glance

Forms Languages Notable members
1 25 Chinese, Japanese, Korean, Vietnamese, Thai, Indonesian, Malay, Burmese
2 106 English, German, Spanish, Italian, Dutch, Portuguese, Turkish, Greek, Hebrew‡
3 15 Russian, Czech, Ukrainian, Serbian, Croatian, Lithuanian, Latvian, Polish‡
4 13 Polish, Slovenian, Maltese, Gaelic, Breton
5 1 Manx
6 3 Arabic, Welsh, Cornish

‡ CLDR revises these over time; read the table above rather than this summary when it matters.

Two takeaways for planning. First, the single-form languages are not a rounding error — a quarter of the world’s largest language markets are in that column, and for them any plural machinery you build is pure overhead. Second, the long tail at four, five and six forms is where the bugs live, because it is the part of the matrix nobody on an English-speaking team can eyeball for correctness.

Rules change, and stale rules are silent

CLDR ships roughly annually and plural rules do get revised. A language that had three categories in one release can have four in the next, or the number ranges behind a category can shift. Nothing in your application will announce this. The file still parses, the missing category simply never renders, and the language quietly falls back.

WebTranslateIt tracks the CLDR version behind each project’s rules and flags an “Outdated Plurals?” badge on the Languages & Stats page when a project’s stored rules diverge from the current release, with a one-click option to adopt the new defaults or dismiss the warning if the divergence is deliberate. If you maintain plural rules by hand, put a calendar reminder against each CLDR release instead — the failure mode is too quiet to catch any other way.

A short checklist

  • Pass the count to your i18n library. Never branch on == 1 in application code.
  • Generate translation files from the CLDR categories for each target language, not from the source language’s shape.
  • Validate that every plural segment has every category the language requires, before release.
  • Remember decimals select categories too, and often different ones than the nearby integers.
  • Re-check your rules after each CLDR release.

Frequently asked questions

How many plural forms does each language have?
It ranges from one to six. Chinese, Japanese, Korean, Vietnamese, Thai and about twenty other languages have a single form. English, German, Spanish and most of Europe have two. Russian, Polish, Czech and the Slavic languages generally have three or four. Arabic and Welsh have six. The full table in this guide lists all 163 languages defined by CLDR.
Does the CLDR category one always mean the number 1?
No, and this is the most common mistake in plural handling. In French, one covers both 0 and 1. In Russian, one covers 1, 21, 31, 41 and every other number ending in 1 except those ending in 11. The categories are names for sets of numbers, and each language defines its own sets.
What are the six CLDR plural categories?
zero, one, two, few, many and other. Every language uses other as its catch-all; the remaining five are used only by languages that need them. A language never uses a category that its rules do not define, so a translation file should contain exactly the categories CLDR lists for that language.
What happens if a translation is missing a plural form?
At runtime the lookup for that category fails and you get either a fallback string in the wrong language, a visible key, or a crash, depending on the framework. This is why plural completeness is worth validating before the file ships rather than discovering it from a bug report in a language nobody on the team reads.

Keep reading

Translate your app without the spreadsheet round-trip

WebTranslateIt reads the file formats and placeholder syntax described on this page, validates them as translators work, and syncs the results straight back into your repository.