[{"data":1,"prerenderedAt":22},["ShallowReactive",2],{"articolo-internazionalizzazione-in-flutter-guida-pratica-a-flutter-localizations-e-intl":3,"comments-article-internazionalizzazione-in-flutter-guida-pratica-a-flutter-localizations-e-intl":21},{"id":4,"title":5,"slug":6,"excerpt":7,"body":8,"cover_image":9,"video_url":10,"status":11,"published_at":12,"meta_title":13,"meta_description":14,"category":15,"author":19},9,"Internazionalizzazione in Flutter: guida pratica a flutter_localizations e intl","internazionalizzazione-in-flutter-guida-pratica-a-flutter-localizations-e-intl","Scopri come rendere la tua app Flutter multilingua usando flutter_localizations e il pacchetto intl, con generazione automatica delle traduzioni tramite file ARB.","## Perché internazionalizzare l'app\n\nSe vuoi pubblicare la tua app su mercati diversi, supportare più lingue non è un optional. Flutter offre un sistema di internazionalizzazione (i18n) integrato e ufficiale basato sui pacchetti `flutter_localizations` e `intl`, che permette di gestire traduzioni, formattazione di date, numeri e valute in modo strutturato.\n\nIn questa guida vedremo come configurare la localizzazione, generare automaticamente le classi di traduzione a partire dai file ARB e gestire la formattazione locale-aware.\n\n## Configurazione iniziale\n\nAggiungi le dipendenze al tuo `pubspec.yaml`:\n\n```yaml\ndependencies:\n  flutter:\n    sdk: flutter\n  flutter_localizations:\n    sdk: flutter\n  intl: any\n\nflutter:\n  generate: true\n```\n\nLa riga `generate: true` abilita la generazione automatica del codice di localizzazione da parte di Flutter.\n\n## Il file di configurazione l10n.yaml\n\nCrea un file `l10n.yaml` nella root del progetto:\n\n```yaml\narb-dir: lib\u002Fl10n\ntemplate-arb-file: app_en.arb\noutput-localization-file: app_localizations.dart\noutput-class: AppLocalizations\n```\n\nQuesto dice a Flutter dove trovare i file di traduzione e come chiamare la classe generata.\n\n## Creare i file ARB\n\nI file ARB (Application Resource Bundle) sono semplici file JSON che contengono le coppie chiave-valore delle traduzioni. Crea `lib\u002Fl10n\u002Fapp_en.arb`:\n\n```json\n{\n  \"appTitle\": \"My Application\",\n  \"@appTitle\": {\n    \"description\": \"Il titolo dell'applicazione\"\n  },\n  \"welcome\": \"Welcome, {name}!\",\n  \"@welcome\": {\n    \"description\": \"Messaggio di benvenuto\",\n    \"placeholders\": {\n      \"name\": {\n        \"type\": \"String\"\n      }\n    }\n  },\n  \"itemCount\": \"{count, plural, =0{Nessun elemento} =1{1 elemento} other{{count} elementi}}\",\n  \"@itemCount\": {\n    \"placeholders\": {\n      \"count\": {\n        \"type\": \"int\"\n      }\n    }\n  }\n}\n```\n\nE la versione italiana in `lib\u002Fl10n\u002Fapp_it.arb`:\n\n```json\n{\n  \"appTitle\": \"La mia applicazione\",\n  \"welcome\": \"Benvenuto, {name}!\",\n  \"itemCount\": \"{count, plural, =0{Nessun elemento} =1{1 elemento} other{{count} elementi}}\"\n}\n```\n\nNota la sintassi ICU per i plurali: gestisce automaticamente le forme singolare\u002Fplurale in base al valore numerico.\n\n## Generare le classi\n\nLe classi vengono generate automaticamente al primo `flutter run` o `flutter build`. In alternativa puoi forzare la generazione con:\n\n```bash\nflutter gen-l10n\n```\n\nVerrà creata la classe `AppLocalizations` con un getter tipizzato per ogni chiave.\n\n## Configurare MaterialApp\n\nOra colleghiamo tutto nel widget radice:\n\n```dart\nimport 'package:flutter\u002Fmaterial.dart';\nimport 'package:flutter_localizations\u002Fflutter_localizations.dart';\nimport 'l10n\u002Fapp_localizations.dart';\n\nclass MyApp extends StatelessWidget {\n  const MyApp({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      onGenerateTitle: (context) =>\n          AppLocalizations.of(context)!.appTitle,\n      localizationsDelegates: const [\n        AppLocalizations.delegate,\n        GlobalMaterialLocalizations.delegate,\n        GlobalWidgetsLocalizations.delegate,\n        GlobalCupertinoLocalizations.delegate,\n      ],\n      supportedLocales: const [\n        Locale('en'),\n        Locale('it'),\n      ],\n      home: const HomePage(),\n    );\n  }\n}\n```\n\n## Usare le traduzioni nei widget\n\nAccedere alle stringhe è semplice e completamente tipizzato:\n\n```dart\nclass HomePage extends StatelessWidget {\n  const HomePage({super.key});\n\n  @override\n  Widget build(BuildContext context) {\n    final l10n = AppLocalizations.of(context)!;\n    return Scaffold(\n      appBar: AppBar(title: Text(l10n.appTitle)),\n      body: Column(\n        children: [\n          Text(l10n.welcome('Marco')),\n          Text(l10n.itemCount(3)),\n        ],\n      ),\n    );\n  }\n}\n```\n\nIl vantaggio rispetto alle stringhe sparse nel codice è enorme: l'IDE ti suggerisce le chiavi disponibili e gli errori vengono segnalati a tempo di compilazione.\n\n## Formattare date, numeri e valute\n\nIl pacchetto `intl` permette di formattare valori rispettando la locale corrente:\n\n```dart\nimport 'package:intl\u002Fintl.dart';\n\nfinal locale = Localizations.localeOf(context).toString();\n\n\u002F\u002F Data: 8 febbraio 2025 in italiano\nfinal data = DateFormat.yMMMMd(locale).format(DateTime.now());\n\n\u002F\u002F Valuta: € 1.234,56\nfinal prezzo = NumberFormat.currency(\n  locale: locale,\n  symbol: '€',\n).format(1234.56);\n```\n\n## Cambiare lingua a runtime\n\nPer permettere all'utente di scegliere la lingua, puoi gestire il `locale` con uno state management (ad esempio un `ValueNotifier` o Riverpod) e passarlo a `MaterialApp`:\n\n```dart\nMaterialApp(\n  locale: selectedLocale, \u002F\u002F null = lingua di sistema\n  \u002F\u002F ... resto della configurazione\n)\n```\n\nQuando `selectedLocale` cambia, Flutter ricostruisce l'interfaccia con le nuove traduzioni.\n\n## Best practice\n\n- Mantieni il file ARB template (`app_en.arb`) sempre completo: è la fonte di verità per le chiavi.\n- Usa sempre i metadati `@chiave` con la descrizione per aiutare i traduttori.\n- Sfrutta i plurali e i placeholder ICU invece di concatenare stringhe a mano.\n- Aggiungi i delegate `Global*Localizations` per tradurre anche i widget di sistema (date picker, menu, ecc.).\n\n## Conclusione\n\nIl sistema di internazionalizzazione di Flutter è robusto, ufficiale e completamente integrato nel processo di build. Investire qualche ora nella sua configurazione iniziale ti ripaga ampiamente quando devi espandere la tua app verso nuovi mercati, mantenendo il codice pulito e type-safe.","https:\u002F\u002Fflutter.it\u002Fstorage\u002Farticles\u002F52d4c2f5-7016-4cc6-a6a6-d683e7cbfa12.jpg",null,"published","2026-06-12T04:00:37+00:00","Internazionalizzazione Flutter: i18n con intl e ARB","Guida pratica all'internazionalizzazione in Flutter: configura flutter_localizations, crea file ARB e gestisci traduzioni, plurali e formati locale.",{"id":16,"name":17,"slug":18},1,"Guide","guide",{"id":16,"name":20},"Flutter Bot",[],1781247855989]