There is no supported-language list
Give a project a BCP-47 tag and Transglot resolves the rest from ICU: display name, native name, CLDR plural categories and text direction. 708 locales are recognised outright, and the long tail validates structurally instead of being rejected.
Four values, computed rather than curated
Adding a language writes one row. Every field on it comes from ICU and the CLDR plural table shipped with the app, so nobody maintains a list by hand.
The English display name and the name in the language’s own script, so a translator picking a locale reads it the way they write it.
The CLDR categories the locale actually uses, from one for Japanese to six for Arabic. The editor draws exactly that many plural inputs, and QA fails a row with a category missing.
Derived from the locale’s likely script, not from a hand-kept list of four languages. It rides in the API response, so your app can lay out the string it just pulled.
A tag is canonicalised and checked before it is accepted. Real long-tail locales pass on structure; xx-XX does not.
Locales teams start with
A sample, not a catalogue. Each row carries the values the app would compute for that tag today — filter it to find the shape of your own market.
| Locale | BCP-47 | Script | Plural forms | Direction | Quality suite |
|---|---|---|---|---|---|
| GermanDeutsch | de | Latin | 2one · other | LTR | scored |
| Frenchfrançais | fr | Latin | 3one · many · other | LTR | scored |
| French (Canada)français (Canada) | fr-CA | Latin | 3one · many · other | LTR | — |
| Spanishespañol | es | Latin | 3one · many · other | LTR | scored |
| Spanish (Latin America)español (Latinoamérica) | es-419 | Latin | 3one · many · other | LTR | — |
| Portuguese (Portugal)português (Portugal) | pt-PT | Latin | 3one · many · other | LTR | — |
| Portuguese (Brazil)português (Brasil) | pt-BR | Latin | 3one · many · other | LTR | — |
| Italianitaliano | it | Latin | 3one · many · other | LTR | — |
| DutchNederlands | nl | Latin | 2one · other | LTR | — |
| Swedishsvenska | sv | Latin | 2one · other | LTR | — |
| Danishdansk | da | Latin | 2one · other | LTR | — |
| Norwegian BokmålNorwegian Bokmål | nb | Latin | 2one · other | LTR | — |
| Finnishsuomi | fi | Latin | 2one · other | LTR | — |
| Icelandicíslenska | is | Latin | 2one · other | LTR | — |
| Polishpolski | pl | Latin | 4one · few · many · other | LTR | — |
| Czechčeština | cs | Latin | 4one · few · many · other | LTR | — |
| Slovakslovenčina | sk | Latin | 4one · few · many · other | LTR | — |
| Hungarianmagyar | hu | Latin | 2one · other | LTR | — |
| Romanianromână | ro | Latin | 3one · few · other | LTR | — |
| Croatianhrvatski | hr | Latin | 3one · few · other | LTR | — |
| Slovenianslovenščina | sl | Latin | 4one · two · few · other | LTR | — |
| Serbianсрпски | sr | Cyrillic | 3one · few · other | LTR | — |
| Bulgarianбългарски | bg | Cyrillic | 2one · other | LTR | — |
| Russianрусский | ru | Cyrillic | 4one · few · many · other | LTR | scored |
| Ukrainianукраїнська | uk | Cyrillic | 4one · few · many · other | LTR | — |
| GreekΕλληνικά | el | Greek | 2one · other | LTR | — |
| TurkishTürkçe | tr | Latin | 2one · other | LTR | — |
| Lithuanianlietuvių | lt | Latin | 4one · few · many · other | LTR | — |
| Latvianlatviešu | lv | Latin | 3zero · one · other | LTR | — |
| Estonianeesti | et | Latin | 2one · other | LTR | — |
| Catalancatalà | ca | Latin | 3one · many · other | LTR | — |
| Arabicالعربية | ar | Arabic | 6zero · one · two · few · many · other | RTL | scored |
| Hebrewעברית | he | Hebrew | 3one · two · other | RTL | — |
| Persianفارسی | fa | Arabic | 2one · other | RTL | — |
| SwahiliKiswahili | sw | Latin | 2one · other | LTR | — |
| AfrikaansAfrikaans | af | Latin | 2one · other | LTR | — |
| Amharicአማርኛ | am | Ethiopic | 2one · other | LTR | — |
| Hindiहिन्दी | hi | Devanagari | 2one · other | LTR | — |
| Banglaবাংলা | bn | Bangla | 2one · other | LTR | — |
| Tamilதமிழ் | ta | Tamil | 2one · other | LTR | — |
| Teluguతెలుగు | te | Telugu | 2one · other | LTR | — |
| Marathiमराठी | mr | Devanagari | 2one · other | LTR | — |
| Urduاردو | ur | Arabic | 2one · other | RTL | — |
| Japanese日本語 | ja | Han + Kana | 1other | LTR | scored |
| Korean한국어 | ko | Hangul | 1other | LTR | — |
| Chinese (Simplified)中文(简体) | zh-Hans | Han (Simplified) | 1other | LTR | — |
| Chinese (Traditional)中文(繁體) | zh-Hant | Han (Traditional) | 1other | LTR | — |
| Thaiไทย | th | Thai | 1other | LTR | — |
| VietnameseTiếng Việt | vi | Latin | 1other | LTR | — |
| IndonesianIndonesia | id | Latin | 1other | LTR | — |
| MalayMelayu | ms | Latin | 1other | LTR | — |
| FilipinoFilipino | fil | Latin | 2one · other | LTR | — |
| Georgianქართული | ka | Georgian | 2one · other | LTR | — |
| Armenianհայերեն | hy | Armenian | 2one · other | LTR | — |
The part that breaks quietly
A locale with four plural forms filled in as two is a bug nobody sees until a count hits the wrong branch. Plural handling is wired to the CLDR table, end to end.
The grid draws the categories the locale declares — no more, no fewer. Polish gets four, Japanese gets one, Arabic gets six.
Formats that cannot represent plurals skip them cleanly and report what was skipped in an X-Skipped-Keys header. CSV and XLSX carry them as key[one] rows.
An incoming Plural-Forms expression is evaluated over a fixed range of counts and matched to a plural family, so formatting variants and equivalent rewrites all land in the right CLDR category.
Direction is data, not a special case
The rtl flag is computed from the locale's script and stored on the language row, so it reaches the editor, the exports and the API response without anyone remembering to set it.
- arالعربيةArabic · 6 plural forms
- heעבריתHebrew · 3 plural forms
- faفارسیPersian · 2 plural forms
- urاردوUrdu · 2 plural forms
Add the locale you were told to wait for
No request form and no enablement call. If ICU knows the tag, a project can have it today — two locales on Free, unlimited on every paid plan.