Flutter Internationalization (i18n): Complete Guide to Global Apps in 2026
Learn how to internationalize your Flutter apps with built-in i18n support, flutter_localizations, and the intl package for reaching global audiences.
Published on • September 19, 2026
AI Assistant

Flutter Internationalization (i18n): Complete Guide to Global Apps in 2026
Flutter makes internationalization (i18n) a first-class concern. With built-in support for localized widgets, the flutter_localizations package, and the intl package, you can build apps that speak any language and respect any cultural convention.
Why Internationalization Matters
Over 7 billion people speak thousands of languages. If your app only works in English, you’re leaving money and users on the table. Internationalization isn’t just about translating strings — it’s about adapting your entire app experience for different locales, including:
- Date and time formats (MM/DD/YYYY vs DD/MM/YYYY)
- Currency formatting ($1,234.56 vs 1.234,56 €)
- Pluralization rules (1 item vs 2 items vs 0 items)
- Text direction (LTR for English, RTL for Arabic)
- Number formatting (1,000 vs 1.000)
Setting Up Flutter Internationalization
Step 1: Add Dependencies
Add these to your pubspec.yaml:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: true
Step 2: Configure l10n.yaml
Create an l10n.yaml file in your project root:
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
Step 3: Create ARB Files
Create your translation files in lib/l10n/:
// app_en.arb
{
"@@locale": "en",
"appTitle": "My App",
"@appTitle": {
"description": "The title of the application"
},
"greeting": "Hello, {name}!",
"@greeting": {
"description": "Greeting message",
"placeholders": {
"name": {
"type": "String",
"example": "World"
}
}
},
"itemCount": "{count, plural, =0{No items} =1{1 item} other{{count} items}}",
"@itemCount": {
"description": "Item count with pluralization"
}
}
// app_ar.arb
{
"@@locale": "ar",
"appTitle": "تطبيقي",
"greeting": "!مرحباً، {name}",
"itemCount": "{count, plural, =0{لا عناصر} =1{عنصر واحد} other{{count} عناصر}}"
}
Step 4: Configure Your App
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: const [
Locale('en', ''),
Locale('ar', ''),
Locale('ja', ''),
],
home: const HomeScreen(),
);
}
}
Step 5: Use Localized Strings
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(
title: Text(l10n.appTitle),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(l10n.greeting('World')),
const SizedBox(height: 16),
Text(l10n.itemCount(5)),
],
),
),
);
}
}
Advanced Features
Pluralization
ARB files support ICU message syntax for plurals:
"messages": "{count, plural, =0{You have no messages} =1{You have one message} other{You have {count} messages}}"
Gender Select
"greeting": "{gender, select, male{Hello sir} female{Hello ma'am} other{Hello there}}"
Date and Number Formatting
import 'package:intl/intl.dart';
// Format dates according to locale
final dateFormat = DateFormat.yMMMMd(AppLocalizations.of(context)!.localeName);
print(dateFormat.format(DateTime.now())); // September 19, 2026
// Format numbers
final numberFormat = NumberFormat.currency(
locale: AppLocalizations.of(context)!.localeName,
symbol: '\$',
);
print(numberFormat.format(1234.56)); // $1,234.56
Best Practices
- Use ARB files — they’re the standard and integrate with Flutter’s code generation
- Always provide a template ARB — use it as the source of truth
- Don’t hardcode strings — always use localized strings from ARB files
- Test with different locales — use the locale picker in Flutter DevTools
- Handle missing translations gracefully — provide fallback strings
Resources
Internationalization is no longer optional — it’s a requirement for any app that aspires to reach a global audience. Flutter’s built-in i18n tooling makes it straightforward to support multiple languages, date formats, currencies, and text directions without leaving your Dart codebase.