Flutter Supported Locales: Complete List of Languages 2025
Flutter's localization system supports 80+ locales out of the box through the flutter_localizations package. Here's the complete reference guide to every supported locale, including language codes, script variants, and RTL support.
Quick Reference: Most Common Locales
| Language |
Locale Code |
RTL |
Notes |
| English (US) |
en or en_US |
No |
Default in most apps |
| English (UK) |
en_GB |
No |
Different date formats |
| Spanish |
es |
No |
500M+ speakers |
| French |
fr |
No |
Used in 29 countries |
| German |
de |
No |
Longer text, plan for expansion |
| Chinese (Simplified) |
zh or zh_CN |
No |
1.1B+ speakers |
| Chinese (Traditional) |
zh_TW |
No |
Taiwan, Hong Kong |
| Japanese |
ja |
No |
Character-based |
| Korean |
ko |
No |
Character-based |
| Arabic |
ar |
Yes |
RTL, 400M+ speakers |
| Hindi |
hi |
No |
600M+ speakers |
| Portuguese (Brazil) |
pt_BR |
No |
200M+ speakers |
| Russian |
ru |
No |
Cyrillic script |
Complete List of Supported Locales
A
| Language |
Code |
Country Variant |
RTL |
| Afrikaans |
af |
South Africa |
No |
| Albanian |
sq |
Albania |
No |
| Amharic |
am |
Ethiopia |
No |
| Arabic |
ar |
Multiple |
Yes |
| Arabic (Egypt) |
ar_EG |
Egypt |
Yes |
| Arabic (Saudi) |
ar_SA |
Saudi Arabia |
Yes |
| Armenian |
hy |
Armenia |
No |
| Assamese |
as |
India |
No |
| Azerbaijani |
az |
Azerbaijan |
No |
B
| Language |
Code |
Country Variant |
RTL |
| Basque |
eu |
Spain |
No |
| Belarusian |
be |
Belarus |
No |
| Bengali |
bn |
Bangladesh/India |
No |
| Bosnian |
bs |
Bosnia |
No |
| Bulgarian |
bg |
Bulgaria |
No |
| Burmese |
my |
Myanmar |
No |
C
| Language |
Code |
Country Variant |
RTL |
| Catalan |
ca |
Spain |
No |
| Chinese (Simplified) |
zh |
China |
No |
| Chinese (Traditional) |
zh_TW |
Taiwan |
No |
| Chinese (Hong Kong) |
zh_HK |
Hong Kong |
No |
| Croatian |
hr |
Croatia |
No |
| Czech |
cs |
Czech Republic |
No |
D
| Language |
Code |
Country Variant |
RTL |
| Danish |
da |
Denmark |
No |
| Dutch |
nl |
Netherlands |
No |
| Dutch (Belgium) |
nl_BE |
Belgium |
No |
E
| Language |
Code |
Country Variant |
RTL |
| English |
en |
US (default) |
No |
| English (Australia) |
en_AU |
Australia |
No |
| English (Canada) |
en_CA |
Canada |
No |
| English (UK) |
en_GB |
United Kingdom |
No |
| English (India) |
en_IN |
India |
No |
| English (Ireland) |
en_IE |
Ireland |
No |
| English (New Zealand) |
en_NZ |
New Zealand |
No |
| English (Singapore) |
en_SG |
Singapore |
No |
| English (South Africa) |
en_ZA |
South Africa |
No |
| Estonian |
et |
Estonia |
No |
F
| Language |
Code |
Country Variant |
RTL |
| Filipino |
fil |
Philippines |
No |
| Finnish |
fi |
Finland |
No |
| French |
fr |
France |
No |
| French (Belgium) |
fr_BE |
Belgium |
No |
| French (Canada) |
fr_CA |
Canada |
No |
| French (Switzerland) |
fr_CH |
Switzerland |
No |
G
| Language |
Code |
Country Variant |
RTL |
| Galician |
gl |
Spain |
No |
| Georgian |
ka |
Georgia |
No |
| German |
de |
Germany |
No |
| German (Austria) |
de_AT |
Austria |
No |
| German (Switzerland) |
de_CH |
Switzerland |
No |
| Greek |
el |
Greece |
No |
| Gujarati |
gu |
India |
No |
H
| Language |
Code |
Country Variant |
RTL |
| Hebrew |
he |
Israel |
Yes |
| Hindi |
hi |
India |
No |
| Hungarian |
hu |
Hungary |
No |
I
| Language |
Code |
Country Variant |
RTL |
| Icelandic |
is |
Iceland |
No |
| Indonesian |
id |
Indonesia |
No |
| Italian |
it |
Italy |
No |
J
| Language |
Code |
Country Variant |
RTL |
| Japanese |
ja |
Japan |
No |
K
| Language |
Code |
Country Variant |
RTL |
| Kannada |
kn |
India |
No |
| Kazakh |
kk |
Kazakhstan |
No |
| Khmer |
km |
Cambodia |
No |
| Korean |
ko |
South Korea |
No |
| Kyrgyz |
ky |
Kyrgyzstan |
No |
L
| Language |
Code |
Country Variant |
RTL |
| Lao |
lo |
Laos |
No |
| Latvian |
lv |
Latvia |
No |
| Lithuanian |
lt |
Lithuania |
No |
M
| Language |
Code |
Country Variant |
RTL |
| Macedonian |
mk |
North Macedonia |
No |
| Malay |
ms |
Malaysia |
No |
| Malayalam |
ml |
India |
No |
| Marathi |
mr |
India |
No |
| Mongolian |
mn |
Mongolia |
No |
N
| Language |
Code |
Country Variant |
RTL |
| Nepali |
ne |
Nepal |
No |
| Norwegian (Bokmål) |
nb |
Norway |
No |
| Norwegian (Nynorsk) |
nn |
Norway |
No |
O
| Language |
Code |
Country Variant |
RTL |
| Oriya |
or |
India |
No |
P
| Language |
Code |
Country Variant |
RTL |
| Pashto |
ps |
Afghanistan |
Yes |
| Persian (Farsi) |
fa |
Iran |
Yes |
| Polish |
pl |
Poland |
No |
| Portuguese |
pt |
Portugal |
No |
| Portuguese (Brazil) |
pt_BR |
Brazil |
No |
| Punjabi |
pa |
India/Pakistan |
No |
R
| Language |
Code |
Country Variant |
RTL |
| Romanian |
ro |
Romania |
No |
| Russian |
ru |
Russia |
No |
S
| Language |
Code |
Country Variant |
RTL |
| Serbian |
sr |
Serbia |
No |
| Serbian (Latin) |
sr_Latn |
Serbia |
No |
| Sinhala |
si |
Sri Lanka |
No |
| Slovak |
sk |
Slovakia |
No |
| Slovenian |
sl |
Slovenia |
No |
| Spanish |
es |
Spain |
No |
| Spanish (Latin America) |
es_419 |
Latin America |
No |
| Spanish (Mexico) |
es_MX |
Mexico |
No |
| Spanish (US) |
es_US |
United States |
No |
| Swahili |
sw |
East Africa |
No |
| Swedish |
sv |
Sweden |
No |
T
| Language |
Code |
Country Variant |
RTL |
| Tamil |
ta |
India/Sri Lanka |
No |
| Telugu |
te |
India |
No |
| Thai |
th |
Thailand |
No |
| Turkish |
tr |
Turkey |
No |
U
| Language |
Code |
Country Variant |
RTL |
| Ukrainian |
uk |
Ukraine |
No |
| Urdu |
ur |
Pakistan |
Yes |
| Uzbek |
uz |
Uzbekistan |
No |
V
| Language |
Code |
Country Variant |
RTL |
| Vietnamese |
vi |
Vietnam |
No |
Z
| Language |
Code |
Country Variant |
RTL |
| Zulu |
zu |
South Africa |
No |
Implementing Supported Locales
Basic Setup
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
MaterialApp(
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
Locale('en'), // English
Locale('es'), // Spanish
Locale('fr'), // French
Locale('de'), // German
Locale('zh'), // Chinese (Simplified)
Locale('ja'), // Japanese
Locale('ar'), // Arabic (RTL)
Locale('he'), // Hebrew (RTL)
],
home: MyHomePage(),
)
With Country Codes
supportedLocales: [
Locale('en', 'US'), // English (US)
Locale('en', 'GB'), // English (UK)
Locale('pt', 'BR'), // Portuguese (Brazil)
Locale('pt', 'PT'), // Portuguese (Portugal)
Locale('zh', 'CN'), // Chinese (Simplified)
Locale('zh', 'TW'), // Chinese (Traditional)
]
With Script Codes
supportedLocales: [
Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'), // Simplified
Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), // Traditional
Locale.fromSubtags(languageCode: 'sr', scriptCode: 'Latn'), // Serbian Latin
Locale.fromSubtags(languageCode: 'sr', scriptCode: 'Cyrl'), // Serbian Cyrillic
]
RTL Language Support
Detecting RTL
bool isRtl(BuildContext context) {
return Directionality.of(context) == TextDirection.rtl;
}
Manual RTL Check
const rtlLanguages = ['ar', 'he', 'fa', 'ur', 'ps'];
bool isRtlLocale(Locale locale) {
return rtlLanguages.contains(locale.languageCode);
}
RTL-Aware Widget
Widget buildDirectionalWidget(BuildContext context) {
final isRtl = Directionality.of(context) == TextDirection.rtl;
return Padding(
padding: EdgeInsetsDirectional.only(
start: 16, // Left in LTR, Right in RTL
end: 8, // Right in LTR, Left in RTL
),
child: Row(
children: [
Icon(isRtl ? Icons.arrow_back : Icons.arrow_forward),
Text('Navigate'),
],
),
);
}
Locale Resolution
How Flutter Chooses a Locale
- Exact match:
en_US device → en_US supported
- Language match:
en_US device → en supported
- Country match: (rarely used)
- First supported: Fallback to first in list
Custom Resolution
MaterialApp(
localeResolutionCallback: (deviceLocale, supportedLocales) {
// Try exact match
for (var locale in supportedLocales) {
if (locale == deviceLocale) return locale;
}
// Try language match
for (var locale in supportedLocales) {
if (locale.languageCode == deviceLocale?.languageCode) {
return locale;
}
}
// Fallback to English or first supported
return supportedLocales.firstWhere(
(l) => l.languageCode == 'en',
orElse: () => supportedLocales.first,
);
},
)
Checking Available Material Localizations
import 'package:flutter_localizations/flutter_localizations.dart';
void printMaterialLocales() {
final locales = GlobalMaterialLocalizations.delegate.supportedLocales;
for (var locale in locales) {
print('${locale.languageCode}_${locale.countryCode ?? ""}');
}
}
Adding a New Locale to Your App
Step 1: Create ARB File
# Create French ARB
touch lib/l10n/app_fr.arb
Step 2: Add Translations
{
"@@locale": "fr",
"appTitle": "Mon Application",
"@appTitle": {
"description": "Titre de l'application"
}
}
Step 3: Regenerate
flutter gen-l10n
Step 4: Verify Support
// AppLocalizations.supportedLocales now includes French
print(AppLocalizations.supportedLocales);
// [Locale('en'), Locale('fr'), ...]
Market Priority by Language
Planning which languages to add? Here's a priority guide:
Tier 1: Global Reach (Essential)
- English (en) - 1.5B speakers
- Spanish (es) - 550M speakers
- Chinese (zh) - 1.1B speakers
- Hindi (hi) - 600M speakers
- Arabic (ar) - 400M speakers
Tier 2: High Value Markets
- French (fr) - 280M speakers
- German (de) - 130M speakers
- Japanese (ja) - 125M speakers
- Portuguese (pt_BR) - 220M speakers
- Russian (ru) - 250M speakers
Tier 3: Growing Markets
- Korean (ko) - 80M speakers
- Italian (it) - 65M speakers
- Turkish (tr) - 80M speakers
- Vietnamese (vi) - 85M speakers
- Indonesian (id) - 200M speakers
FlutterLocalisation: Add Languages Instantly
Translating to 80+ languages manually is overwhelming. FlutterLocalisation helps:
- ✅ AI translation to any supported locale
- ✅ Visual editor for all languages side-by-side
- ✅ Export ARB files ready for Flutter
- ✅ Placeholder validation across all locales
- ✅ Missing translation detection
Ready to go global? Try FlutterLocalisation free and add any of Flutter's 80+ supported languages with AI-powered translation.