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 categories — zero, 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
== 1in 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
-
ICU MessageFormat: a practical guide
The syntax for plurals, gender selection, number and date formatting in one message string — with the escaping rules and the mistakes translators reliably make.
-
en-GB vs en_GB: hyphen or underscore in locale codes?
The standard says hyphen, half your toolchain says underscore. Here is which format each ecosystem expects, why the split exists, and how to convert between them safely.
-
Customising plural rules in WebTranslateIt (documentation)
Edit a language's plural rules per project, and see when your rules have fallen behind a CLDR release.
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.