Skip to content

Supported Locales

Total CMS ships a curated registry of locale codes used by:

  • Default locale (Settings → Internationalization → Default Locale) — drives PHP intl, CakePHP I18n, and Faker for date / number / currency formatting, the admin UI translation language, and (Pro) the default tab on localized content fields. One setting drives both runtime formatting and the content default. Operators who need the two to differ can override $settings['locale'] at the top level in config/tcms.php — that wins for $config->locale while i18n.default keeps driving content defaults.
  • Available content locales (Settings → Internationalization → Available Content Locales) — Pro edition. List of codes that show up as tabs in localizedtext, localizedtextarea, and localizedstyledtext fields.

All codes use the mixed-case POSIX format (lowercase language, uppercase region, underscore separator: en_US, pt_BR, zh_CN). Bare language codes (de, fr, pt) are also valid and stand for “any region speaking that language” — useful when a site doesn’t care about regional variants.

The native name column is what operators see on locale-picker tabs and in the admin form. Two patterns:

  • Single-variant languages (Czech, Japanese, Italian, Polish, etc.) get just the language name — Čeština, 日本語, Italiano. The country is redundant when only one variant exists.
  • Multi-variant languages (English, German, French, Spanish, Portuguese, Arabic, Chinese) get the language name plus the ISO 3166 alpha-2 country code in parens — English (US), Português (BR), Deutsch (AT). Keeps the localized-field tab strip compact while still distinguishing variants.

The settings UI picker appends the full POSIX code in square brackets to every label so operators see the code when configuring (English (US) [en_US]). The English name column is for documentation reference and English-speaking integrators who don’t recognize a native script.

CodeNative name (UI)English nameDirection
arالعربيةArabicRTL
ar_SAالعربية (SA)Arabic (Saudi Arabia)RTL
bn_BDবাংলাBengali (Bangladesh)LTR
cs_CZČeštinaCzech (Czechia)LTR
da_DKDanskDanish (Denmark)LTR
deDeutschGermanLTR
de_ATDeutsch (AT)German (Austria)LTR
de_CHDeutsch (CH)German (Switzerland)LTR
de_DEDeutsch (DE)German (Germany)LTR
el_GRΕλληνικάGreek (Greece)LTR
enEnglishEnglishLTR
en_AUEnglish (AU)English (Australia)LTR
en_CAEnglish (CA)English (Canada)LTR
en_GBEnglish (GB)English (United Kingdom)LTR
en_SGEnglish (SG)English (Singapore)LTR
en_USEnglish (US)English (United States)LTR
esEspañolSpanishLTR
es_ESEspañol (ES)Spanish (Spain)LTR
es_MXEspañol (MX)Spanish (Mexico)LTR
fa_IRفارسیPersian (Iran)RTL
fi_FISuomiFinnish (Finland)LTR
frFrançaisFrenchLTR
fr_CAFrançais (CA)French (Canada)LTR
fr_FRFrançais (FR)French (France)LTR
he_ILעבריתHebrew (Israel)RTL
hi_INहिन्दीHindi (India)LTR
hu_HUMagyarHungarian (Hungary)LTR
id_IDBahasa IndonesiaIndonesian (Indonesia)LTR
it_ITItalianoItalian (Italy)LTR
ja_JP日本語Japanese (Japan)LTR
jv_IDBasa JawaJavanese (Indonesia)LTR
km_KHខ្មែរKhmer (Cambodia)LTR
ko_KR한국어Korean (South Korea)LTR
ms_MYBahasa MelayuMalay (Malaysia)LTR
nl_NLNederlandsDutch (Netherlands)LTR
no_NONorskNorwegian (Norway)LTR
pa_INਪੰਜਾਬੀPunjabi (India)LTR
pl_PLPolskiPolish (Poland)LTR
ptPortuguêsPortugueseLTR
pt_BRPortuguês (BR)Portuguese (Brazil)LTR
pt_PTPortuguês (PT)Portuguese (Portugal)LTR
ro_RORomânăRomanian (Romania)LTR
ru_RUРусскийRussian (Russia)LTR
sv_SESvenskaSwedish (Sweden)LTR
sw_KEKiswahiliSwahili (Kenya)LTR
ta_INதமிழ்Tamil (India)LTR
th_THไทยThai (Thailand)LTR
tl_PHTagalogTagalog (Philippines)LTR
tr_TRTürkçeTurkish (Turkey)LTR
uk_UAУкраїнськаUkrainian (Ukraine)LTR
ur_PKاردوUrdu (Pakistan)RTL
vi_VNTiếng ViệtVietnamese (Vietnam)LTR
zh_CN中文 (CN)Chinese (Mainland)LTR
zh_TW中文 (TW)Chinese (Taiwan)LTR
SurfaceReads fromWhat it shows
Settings UI dropdowns (default locale)LocaleRegistry::options()Native name [code] — e.g. Deutsch (DE) [de_DE]
Settings UI list field (available content locales)LocaleRegistry::options()Same — autocomplete suggests matching codes as the operator types
Localized field tabs in the admin formLocaleRegistry::expand() (driven by Config::$i18n['available'])Native name on the tab; dir propagates to inputs
Twig: cms.locale.languages()LocaleRegistry::all(){ "Deutsch": "de", ... } (label → code map for custom pickers)

The registry is the single source of truth for what locales T3 understands. Adding a new locale anywhere means adding to the registry (src/Domain/Locale/LocaleRegistry.php) — every consumer picks it up automatically.