File ARB e flusso di localizzazione gen_l10n
Configuri la pipeline flutter_localizations e gen_l10n per generare traduzioni tipizzate.
File ARB e flusso di localizzazione gen_l10n è una lezione Flutter Mobile Development gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Flutter Mobile Development, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Flutter Mobile Development include 4 lezioni in totale.
Parti di questa lezione non sono ancora state tradotte e vengono mostrate in inglese.
Step 1: Why gen_l10n + dependencies
Hard-coding strings like Text('Welcome') makes an app impossible to translate. Flutter's official solution is gen_l10n: you write translations in ARB (Application Resource Bundle, a JSON format) files, and the build tool generates a typed Dart class so typos become compile-time errors.
Two pieces are required in pubspec.yaml. The flutter_localizations SDK package supplies Material/Cupertino/Widgets translations, and the generate: true flag turns on the gen_l10n build step.
intlis pulled in because generated code uses it for plurals and dates.- After editing, run
flutter pub get.
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: trueStep 2: l10n.yaml config
Create an l10n.yaml file at the project root. It tells gen_l10n where your ARB files live and what to name the generated class.
arb-dir— folder holding the.arbfiles.template-arb-file— the source-of-truth locale that defines keys and metadata.output-localization-file— name of the generated Dart file.output-class— the class name you import in code.
# l10n.yaml
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
output-class: AppLocalizationsStep 3: The template ARB file
The template locale (here app_en.arb) defines every key. Each key maps to a translated value. Keys starting with @ are metadata: they describe the entry but produce no string.
@@localedeclares which locale this file is.@welcomecan carry adescriptionto help translators.
The filename pattern is app_<localeCode>.arb.
{
"@@locale": "en",
"welcome": "Welcome",
"@welcome": {
"description": "Greeting shown on the home screen"
},
"settings": "Settings"
}Step 4: A translated ARB file
For each additional language, add a sibling file with the same keys but translated values. Metadata (the @ keys) is only required in the template; translations may omit it.
- Here
app_tr.arbprovides Turkish strings. - Missing keys fall back to the template locale, so keep the template complete.
{
"@@locale": "tr",
"welcome": "Hoş geldiniz",
"settings": "Ayarlar"
}Step 5: Generate the code
Code generation runs automatically during flutter run or flutter build when generate: true is set. You can also force it with flutter gen-l10n.
- Output lands in
.dart_tool/flutter_gen/gen_l10n/by default. - The generated
AppLocalizationsclass exposes one getter per key. - Add the generated path to your IDE's import suggestions; do not commit generated files.
Step 6: Wire into MaterialApp
Register the generated delegates and supported locales on MaterialApp. AppLocalizations.localizationsDelegates bundles your delegate plus the Material/Widgets/Cupertino ones, and supportedLocales lists what you ship.
- Flutter picks the best match between the device locale and
supportedLocales. - If none match, the first entry in
supportedLocalesis used.
import 'package:flutter/material.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(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const HomeScreen(),
);
}
}Step 7: Read a string
Inside a widget you fetch the localized instance with AppLocalizations.of(context) and read a getter. The call is null only if the delegates are missing, so the common idiom uses !.
- Each key from the ARB becomes a strongly-typed getter.
- Rename a key in the ARB and every wrong usage fails to compile.
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
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.settings)),
body: Center(child: Text(l10n.welcome)),
);
}
}Step 8: Placeholders
To inject values, declare placeholders in the template metadata. The value uses {name} syntax, and gen_l10n turns the getter into a method.
- Each placeholder needs a
type(e.g.String,int,DateTime). - The generated method signature follows the placeholder order.
{
"@@locale": "en",
"greeting": "Hello, {name}!",
"@greeting": {
"description": "Personalized greeting",
"placeholders": {
"name": { "type": "String" }
}
}
}Step 9: Call a placeholder method
Because greeting takes an argument, the generated member is a method, not a getter. You pass the value at the call site.
l10n.greeting('Ada')returns "Hello, Ada!".- Types are enforced: passing an
intwhere aStringis expected fails to compile.
Widget buildGreeting(BuildContext context, String userName) {
final l10n = AppLocalizations.of(context)!;
return Text(l10n.greeting(userName));
}Step 10: Plurals with ICU
ARB supports ICU message syntax for plurals. A {count, plural, ...} block selects the right wording per language. Declare the placeholder as num (or int).
=0,one, andotherare common categories.#is replaced by the formatted number.- Different locales have different plural rules — ICU handles them automatically.
{
"itemCount": "{count, plural, =0{No items} one{1 item} other{{count} items}}",
"@itemCount": {
"placeholders": {
"count": { "type": "int" }
}
}
}Step 11: A plain-Dart formatter
The selection logic ICU performs is just rules over a number. Here is a tiny standalone Dart program that mimics English plural selection — useful for understanding what gen_l10n generates under the hood.
- Real apps use the generated method; this is only for intuition.
String itemCount(int count) {
if (count == 0) return 'No items';
if (count == 1) return '1 item';
return '$count items';
}
void main() {
for (final n in [0, 1, 5]) {
print(itemCount(n));
}
}Quick Check
You added a new key logout only to app_en.arb but forgot it in app_tr.arb. A Turkish-locale user opens the screen. What happens?
Recap
You built the full Flutter localization pipeline:
- Added
flutter_localizations+intland setgenerate: true. - Configured
l10n.yaml(arb-dir, template, output class). - Wrote a template ARB plus per-locale translations.
- Let gen_l10n create the typed
AppLocalizationsclass. - Registered
localizationsDelegatesandsupportedLocales, then read strings viaAppLocalizations.of(context)!. - Used placeholders for dynamic values and ICU plurals for count-aware text.
The payoff: translations are type-checked, missing template keys are caught early, and translators work in a clean JSON format.
Domande Frequenti
La lezione «File ARB e flusso di localizzazione gen_l10n» è gratuita?
Sì — il testo completo di «File ARB e flusso di localizzazione gen_l10n» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Flutter Mobile Development, passa a CoddyKit PRO. Il corso Flutter Mobile Development include 4 lezioni in totale.
Cosa imparerò in «File ARB e flusso di localizzazione gen_l10n»?
Configuri la pipeline flutter_localizations e gen_l10n per generare traduzioni tipizzate. Eserciti Flutter Mobile Development con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Flutter Mobile Development?
Non è richiesta alcuna esperienza precedente. Flutter Mobile Development su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «File ARB e flusso di localizzazione gen_l10n»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Flutter Mobile Development?
Sì. Ogni lezione Flutter Mobile Development include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- File ARB e flusso di localizzazione gen_l10n
- Plurali, genere e formattazione dei messaggi ICU
- Layout RTL e gestione della direzionalità
- Semantica, screen reader e widget accessibili