Multilingual Support in Flutter: From Setup to Implementation
- 30 ΠΎΠΊΡ. 2025 Π³.
- 6 ΠΌΠΈΠ½. ΡΡΠ΅Π½ΠΈΡ
Nowadays, apps often reach beyond a single country, and users expect a comfortable and understandable interface in their own language π. However, many apps still operate without localization support, limiting their audience and preventing them from reaching their full potential on the global market π«
Lack of multilingual support can lead to lower user engagement π: it becomes harder for users to consume content, they lose trust in the app, and may stop using it. For example, an e-commerce app πavailable in only one language could lose a significant portion of international customers, even if its functionality is perfect.

Multilingual support isnβt just about translating text π. It also involves adapting date and time formats β°, currency π°, numbers, and even content display styles to specific regions. Flutter provides flexible tools to implement these features, allowing developers to create apps that are understandable and user-friendly worldwide π.
In this article, weβll explore how to implement multilingual support in Flutter, from project setup to dynamic language switching π. Youβll get a practical guide and tips to make your app truly global and convenient for users anywhere in the world π.
i18n and l10n: Whatβs the Difference?
Whenever we talk about multilingual support in apps, two concepts always come up β i18n (internationalization)Β and l10n (localization). They often go hand in hand and are sometimes even confused with each other.
i18n
i18n is the process of preparing an app for multiple languages, even before any translations exist. Its goal is to make adding a new language simple and code-safe.
Key aspects:
Moving all texts and content into separate resourcesΒ (files, databases)
Supporting date, time, number, and currency formatsΒ for different locales
Designing app architectureΒ with the ability to add new languages in mind
Instead of hardcoding text in a widget:
Text('Hello, user!')We use a resource:
Text(AppLocalizations.of(context).helloUser)l10n
l10n is the process of localizing an app for a specific language or region. If i18n prepares the ground, l10n βplants the seedsβ.
Key aspects:
Creating translationsΒ (e.g., English, French, Japanese)
Setting up localized formatsΒ (dates, numbers, currencies)
Considering cultural differencesΒ (e.g., different address formats or measurement units)
app_en.arbΒ file for English translations:
{
"helloUser": "Hello, User!"
}And app_de.arbΒ for German:
{
"helloUser": "Hallo, Benutzer!"
}How Flutter Handles Multilingual Support
Flutter provides a built-in mechanism that combines preparing for multilingual support with handling specific translations. Instead of relying on third-party solutions, it offers first-class tools that integrate smoothly into the framework:
PackagesΒ β flutter_localizationsΒ and intlΒ provide core support for multiple languages, regional formats, dates, numbers, and currencies
Resource files (.arb)Β β JSON-like files that store translation strings for each language. They keep translations structured and easy to maintain
Automatic code generationΒ β during build, Dart classes are generated, giving type-safe and convenient access to translations instead of working with raw keys
Integration with MaterialAppΒ β through supportedLocalesΒ you define which languages your app supports, and localeΒ determines the active one. This setup ensures that both system locale preferences and user-selected settings can be respected
Together, these features make Flutterβs multilingual support both flexible and scalable. Adding a new language requires only creating an additional .arbΒ file and regenerating the code β no extra manual wiring is needed π.
Implementing Multilingual Support in Flutter
The project will remain simple, but it will clearly demonstrate how localization works in Flutter. Weβll cover not only text translations, but also formatting for dates, times, numbers, and currencies. All changes will happen dynamically β when the user switches the language in the settings, the app will immediately update its interface without requiring a restart.

Setting Up Localization: Packages, Configs, and Resource Files
Letβs begin by adding the necessary packages to the pubspec.yaml:
In addition to these packages, we also need to enable the generateΒ flag, which allows Flutter to automatically generate the localization files. This simplifies accessing translations and ensures that any changes in .arbΒ files are reflected in the app without manual wiring:
flutter:
generate: trueNext, to set up automatic file generation, we need to create an l10n.yamlΒ file at the root of the project. In this file, weβll define configuration options that control how Flutter generates localization classes from .arbΒ files, such as the directory for resource files, the template language, and other settings.
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
output-dir: lib/generated/l10nNow we can create .arbΒ files for the required languages inside the lib/l10nΒ folder. Each file will contain key-value pairs for translations.

The structure of a .arbΒ file is similar to JSON, consisting of key-value pairs where each key represents a text identifier and the value is its translation. For example, an English file might be named app_en.arb:
Hereβs an example of a .arbΒ file for German:
After running the application, Flutter automatically generates AppLocalizationsΒ files in the /generatedΒ folder. These files provide convenient, type-safe access to all translations defined in your .arbΒ files, allowing you to use them directly in your widgets.

Next we can create a L10nΒ class to define the list of supported locales and include additional helper methods. This centralizes locale-related logic, making it easier to manage available languages and perform tasks like retrieving locale names or validating supported locales.
Using Locales in Widgets
With all the setup in place, we can now use our locales in the project. By configuring the localeΒ and supportedLocalesΒ properties in MaterialApp, the app will respond to language changes dynamically and display the correct translations and formats throughout the interface.
As we mentioned earlier, to use translated text inside widgets you can simply call the generated AppLocalizationsΒ class:
AppLocalizations.of(context).titleAt this point, we can already see the magic of translation in action. By default, the app language is English, but if you change the deviceβs system language to one of the supported locales, the app will automatically switch its interface to the corresponding translation without any additional configuration.
Formatting Dates, Times, and Currency
The intlΒ package provides classes for formatting various types of data according to the current locale. For example, to format dates and times, you can use DateFormat:
DateFormat.yMMMMd(locale).add_jm().format(DateTime.now())

And to format currency, we can use NumberFormat:
NumberFormat.simpleCurrency(locale: locale,).format(10000)

Sometimes you may also need to insert variables into static text, for example when displaying a userβs name, the number of items in a cart, or a formatted date inside a sentence. Flutter localization supports this scenario out of the box β you only need to adjust the values in your .arbΒ files and use placeholders, which will then be replaced dynamically at runtime.
In the code, the usage remains almost the same β the only difference is that you now pass the parameter when calling the localization method. For example:
AppLocalizations.of(context)!.platformVersion(deviceInfo)
Changing locale manually
But not all users stick to their phoneβs system language βΒ sometimes they prefer to choose a different one inside the app. Now Iβll show you how to change the language manually.
To use and track locale changes, weβll rely on the ProviderΒ package. Itβs a lightweight state management solution that integrates directly with Flutterβs widget tree. With Provider, we can store the current locale in one place and automatically rebuild the UI whenever the language is changed, keeping the implementation clean and reactive.
provider: ^6.1.5+1Letβs create a LocaleProviderΒ class that will hold the current locale and notify the app when it changes:
LocaleProviderΒ is a ChangeNotifierΒ that stores the current app locale. It initializes with the device language if supported, otherwise falls back to the default locale, and allows updating the locale dynamically with setLocale().
To use our provider throughout the app, we need to wrap the root widget with a ChangeNotifierProvider. This way, the LocaleProviderΒ becomes available anywhere in the widget tree:
To access our provider inside any widget, we can use the following construction:
final provider = Provider.of<LocaleProvider>(context);
And to change the locale in our app, we need to use the locale provided by LocaleProviderΒ inside the MaterialApp:
locale: provider.localeNow you can design your own language switcher system that best fits your appβs UI and flow. For demonstration purposes, Iβll show how this can be implemented using a simple DropdownButton:
Now everything is in place β weβve configured localization, added translations, connected a provider for dynamic language switching, and even handled variables in text. The result is a fully functional multilingual Flutter app where both the interface and formatted data (dates, times, numbers, and currency) instantly adapt to the selected language.
Conclusion
Flutter provides everything you need to build truly multilingual applications out of the box. With the help of flutter_localizationsΒ and intl, .arbΒ resource files, and automatic code generation, you can easily manage translations and locale-specific data. By adding a simple state management solution like Provider, it becomes possible to switch languages dynamically without restarting the app, giving users full control over their experience.
Weβve seen how to set up localization, format text, dates, times, and currency, and even work with variables inside translations. The final result is a scalable and user-friendly approach that can grow together with your application. Whether youβre building a small demo or a production-ready product, Flutter makes multilingual support straightforward and efficient. π
Full project code is available belowΒ π
Go Global with Flutter π
At Igniscor, we donβt just build Flutter apps β we craft experiences that speak every userβs language. From dynamic translations to localized dates, times, and currencies, we make sure your product feels natural in any market.
Ready to scale your app worldwide? Letβs bring your idea to life β contact us today! π










ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ