Il sistema di localizzazione integrato di Flutter utilizza file Application Resource Bundle (ARB) e il pacchetto intl per offrire esperienze completamente native in qualsiasi lingua. Questa guida copre tutto, dalla configurazione del progetto e i dettagli del formato ARB al cambio lingua, la pluralizzazione e l’automazione delle traduzioni con l10n.dev.
La localizzazione Flutter è l’approccio ufficiale per adattare la tua app a più lingue e regioni. Si basa su file ARB per memorizzare le stringhe tradotte e sul generatore di codice flutter_gen per produrre accessor Dart type-safe. A runtime, Flutter seleziona il file ARB corretto in base alla localizzazione del dispositivo - senza bisogno di riavviare quando si cambia la lingua programmaticamente.
La pipeline di localizzazione di Flutter è guidata da due file di configurazione: pubspec.yaml e l10n.yaml. Abilita la generazione del codice in pubspec.yaml e indica a Flutter la directory dei file ARB.
Aggiungi flutter_localizations e intl come dipendenze, quindi abilita il flag generate affinché Flutter generi automaticamente le classi Dart di localizzazione dai tuoi file ARB.
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: truePosiziona un file l10n.yaml nella root del progetto per configurare la directory ARB, il file template e il nome del file di output generato.
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartARB (Application Resource Bundle) è un formato basato su JSON progettato specificamente per l’internazionalizzazione Flutter. Ogni chiave mappa a una stringa traducibile, e le chiavi di metadati opzionali (prefissate con @) contengono descrizioni, definizioni di segnaposto e contesto per i traduttori.
{
"@@locale": "en",
"@@last_modified": "2026-01-15T10:30:00Z",
"appTitle": "My App",
"@appTitle": {
"description": "The title of the application"
},
"welcome": "Welcome, {name}!",
"@welcome": {
"description": "Welcome message shown on the home screen",
"placeholders": {
"name": {
"type": "String",
"example": "Alice"
}
}
},
"unreadMessages": "{count, plural, =0{No unread messages} =1{1 unread message} other{{count} unread messages}}",
"@unreadMessages": {
"description": "Number of unread messages",
"placeholders": {
"count": {
"type": "int"
}
}
}
}Dopo la traduzione, le stringhe UI sono localizzate mentre la struttura dei metadati resta intatta. l10n.dev aggiorna automaticamente @@locale e @@last_modified.
{
"@@locale": "fr",
"@@last_modified": "2026-01-15T10:30:01Z",
"appTitle": "Mon Application",
"@appTitle": {
"description": "The title of the application"
},
"welcome": "Bienvenue, {name} !",
"@welcome": {
"description": "Welcome message shown on the home screen",
"placeholders": {
"name": {
"type": "String",
"example": "Alice"
}
}
},
"unreadMessages": "{count, plural, =0{Aucun message non lu} =1{1 message non lu} other{{count} messages non lus}}",
"@unreadMessages": {
"description": "Number of unread messages",
"placeholders": {
"count": {
"type": "int"
}
}
}
}I file ARB seguono un modello di denominazione semplice: un prefisso (di default app_) seguito dal codice locale e dall’estensione .arb. Flutter e l10n.dev usano underscore per separare codici lingua e regione.
# Default pattern (recommended)
app_en.arb
app_fr.arb
app_en_US.arb # Locale with region (underscore format)
app_zh_CN.arb # Chinese Simplified
# Custom prefix patterns also supported
my_app_en.arb
my_app_fr.arb
# Note: ARB files use underscores, not hyphens
# ✓ app_en_US.arb
# ✗ app_en-US.arbOrganizza tutti i tuoi file ARB dentro una cartella dedicata l10n all’interno di lib/. Il generatore di codice di Flutter li rileva automaticamente basandosi sul parametro arb-dir in l10n.yaml e produce classi Dart pronte all’uso.
lib/
├── l10n/
│ ├── app_en.arb ← Source (English)
│ ├── app_fr.arb ← French
│ ├── app_de.arb ← German
│ ├── app_ja.arb ← Japanese
│ ├── app_zh_CN.arb ← Chinese Simplified
│ └── app_es.arb ← Spanish
├── main.dart
└── ...
# Generated output (do not edit manually)
.dart_tool/
└── flutter_gen/
└── gen_l10n/
└── app_localizations.dartCollega la classe Dart di localizzazione generata con MaterialApp fornendo localizationsDelegates e supportedLocales. Flutter risolverà così i dati ARB corretti per la localizzazione del dispositivo.
Passa i quattro delegati richiesti - il tuo AppLocalizations.delegate generato più i tre delegati del Flutter SDK - e elenca tutte le localizzazioni supportate dalla tua app. Usa AppLocalizations.of(context)! ovunque nell’albero dei widget per accedere alle stringhe tradotte.
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
// Required delegates
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
// Supported locales
supportedLocales: AppLocalizations.supportedLocales,
home: const HomePage(),
);
}
}
// Use in a widget
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(l10n.appTitle)),
body: Center(child: Text(l10n.welcome('Alice'))),
);
}
}Flutter permette di cambiare la localizzazione dell’app a runtime aggiornando la proprietà locale di MaterialApp. Un modello comune è mantenere un Locale in uno StatefulWidget o in una soluzione di state management ed esporre una callback per modificarlo. L’albero dei widget si ricostruisce automaticamente con la nuova localizzazione.
// Manage locale state at the app level
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Locale _locale = const Locale('en');
void _changeLocale(Locale locale) {
setState(() => _locale = locale);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
locale: _locale,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
home: SettingsPage(onLocaleChange: _changeLocale),
);
}
}
// Language selector widget
class LanguageSelector extends StatelessWidget {
final void Function(Locale) onLocaleChange;
const LanguageSelector({super.key, required this.onLocaleChange});
@override
Widget build(BuildContext context) {
return DropdownButton<Locale>(
value: Localizations.localeOf(context),
items: AppLocalizations.supportedLocales
.map((locale) => DropdownMenuItem(
value: locale,
child: Text(locale.toLanguageTag()),
))
.toList(),
onChanged: (locale) {
if (locale != null) onLocaleChange(locale);
},
);
}
}Flutter usa la sintassi messaggi ICU per la pluralizzazione all’interno dei file ARB. Il pacchetto intl gestisce tutte le categorie plurali CLDR, applicando automaticamente la forma corretta in base alle regole della lingua di destinazione.
{
"cartItems": "{count, plural, =0{Your cart is empty} =1{1 item in your cart} other{{count} items in your cart}}",
"@cartItems": {
"description": "Cart item count",
"placeholders": {
"count": { "type": "int" }
}
},
"daysLeft": "{days, plural, =1{1 day left} other{{days} days left}}",
"@daysLeft": {
"description": "Days remaining",
"placeholders": {
"days": { "type": "int" }
}
}
}l10n.dev è progettato per integrarsi perfettamente con il flusso di lavoro ARB di Flutter. Carica il tuo file ARB sorgente e ricevi traduzioni accurate e strutturate correttamente:
Usa il pacchetto npm ai-l10n per tradurre il tuo file ARB sorgente da linea di comando o come parte di una pipeline CI/CD. Installa una volta, poi traduci in qualsiasi numero di lingue con un solo comando.
# Install the CLI
npm install ai-l10n
# Translate your source ARB to multiple languages
npx ai-l10n translate lib/l10n/app_en.arb \
--languages fr,de,ja,zh_CN,es,koPuoi integrare ai-l10n direttamente nel processo di build di Flutter in modo che le traduzioni siano sempre aggiornate prima che l'app venga compilata. Due approcci comuni sono uno script package.json o un Makefile.
Aggiungi uno script di traduzione e usa l'hook del ciclo di vita prebuild di npm per eseguirlo automaticamente prima di ogni build. Esegui npm run build:android (o build:ios / build:web) e ai-l10n tradurrà per primo, per poi passare il controllo a Flutter.
{
"scripts": {
"translate": "ai-l10n translate lib/l10n/app_en.arb --languages fr,de,ja,zh_CN,es,ko --update",
"prebuild": "npm run translate",
"build:android": "flutter build apk",
"build:ios": "flutter build ios",
"build:web": "flutter build web"
}
}Se il tuo team usa Make, dichiara un target di traduzione e rendi ogni target di build dipendente da esso. L'esecuzione di make build-android (o build-ios / build-all) tradurrà tutte le lingue di destinazione prima di richiamare flutter build.
LANGUAGES = fr,de,ja,zh_CN,es,ko
translate:
npx ai-l10n translate lib/l10n/app_en.arb --languages $(LANGUAGES) --update
build-android: translate
flutter build apk
build-ios: translate
flutter build ios
build-web: translate
flutter build web
build-all: translate
flutter build apk
flutter build ios
flutter build webPer integrazione CI/CD, aggiornamenti incrementali, traduzione batch su più file ed esempi di workflow GitHub Actions, consulta la Guida all’Automazione della Localizzazione.
L’estensione l10n.dev per VS Code porta la traduzione Flutter ARB direttamente nel tuo editor. Clicca col tasto destro su un file ARB e traducilo nelle lingue di destinazione senza uscire da VS Code.
Ecco un esempio live di traduzione di un file Flutter ARB in uzbeko dentro VS Code:

Pronto a raggiungere utenti globali? Puoi tradurre i file ARB direttamente nello spazio di lavoro l10n.dev, automatizzare con la CLI npm o tradurre direttamente dentro VS Code:
Scopri perché la traduzione potenziata dall'IA è migliore per i file i18n rispetto ai metodi tradizionali
Integra la localizzazione potenziata dall'IA direttamente nella tua pipeline CI/CD
Porta la localizzazione AI nel tuo flusso di lavoro con le nostre estensioni e plugin
Grazie per aver usato l10n.dev per localizzare la tua app Flutter! 🚀
Se questa guida ti è stata utile, condividila con altri sviluppatori Flutter che vogliono raggiungere un pubblico globale.
Insieme, possiamo rendere le app Flutter più inclusive e pronte per il mondo.