Skip to content
Blog

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

  1. Use ARB files — they’re the standard and integrate with Flutter’s code generation
  2. Always provide a template ARB — use it as the source of truth
  3. Don’t hardcode strings — always use localized strings from ARB files
  4. Test with different locales — use the locale picker in Flutter DevTools
  5. 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.