Organizzazione conforme al GDPR
Organizzazione certificata ISO 27001
Organizzazione conforme a SOC II
Localizzazione Flutter: file ARB, intl e gen-l10n spiegati
La localizzazione Flutter adatta i messaggi e l'interfaccia di un'applicazione a diverse lingue. Nel processo integrato, flutter_localizations supporta i widget del framework localizzati, mentre le risorse ARB e gen-l10n generano l'API AppLocalizations dell'applicazione, con intl a supporto dei messaggi e della formattazione dipendenti dalla lingua.

Oltre 80 delle più grandi aziende al mondo hanno scelto Smartcat
Configura flutter_localizations e gen-l10n
Questa guida configura un piccolo esempio in inglese e spagnolo, spiega i metadati dei messaggi e confronta gli approcci più comuni basati su pacchetti. Mostra inoltre cosa convalidare prima di collegare una piattaforma di traduzione a un progetto Flutter.
Usa un solo generatore di localizzazione e rendi espliciti i percorsi di input e output. L'esempio seguente presuppone un'applicazione Flutter esistente con i propri vincoli sull'SDK e una normale configurazione di progetto.
Unisci le voci pertinenti in pubspec.yaml; non duplicare le sezioni dependencies o flutter:
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: trueRisolvi le dipendenze con flutter pub get. La voce intl: any segue lo schema di configurazione ufficiale e consente alla risoluzione delle dipendenze di scegliere la versione compatibile con l'SDK Flutter; mantieni il lockfile dell'applicazione e il normale processo di revisione delle dipendenze.
Crea l10n.yaml nella radice del progetto:
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartUsa la guida all'internazionalizzazione di Flutter aggiornata per la configurazione specifica dell'SDK. Nel processo moderno i file di localizzazione generati appartengono all'albero dei sorgenti dell'applicazione. L'esempio importa da lib/l10n; evita di copiare in una nuova configurazione un vecchio import sintetico package:flutter_gen. Consulta la nota sulla migrazione dei sorgenti generati.
Scrivi file ARB con contesto e segnaposto tipizzati
Un file ARB è un resource bundle basato su JSON che contiene messaggi e metadati facoltativi. Mantieni stabili le chiavi dei messaggi, scrivi messaggi completi e usa i metadati per spiegare come viene usato il testo.
Crea lib/l10n/app_en.arb:
{
"@@locale": "en",
"appTitle": "Reading room",
"@appTitle": {
"description": "Title of the sample reading application"
},
"welcomeName": "Welcome, {name}",
"@welcomeName": {
"description": "Greeting on the home screen",
"placeholders": {
"name": {"type": "String", "example": "Sam"}
}
},
"savedBooks": "{count, plural, =0{No saved books} one{1 saved book} other{{count} saved books}}",
"@savedBooks": {
"description": "Number of books saved to the user's library",
"placeholders": {
"count": {"type": "int"}
}
},
"readingState": "{state, select, active{Reading now} paused{Reading paused} other{Ready to read}}",
"@readingState": {
"description": "Reading status; state is active, paused or another value",
"placeholders": {
"state": {"type": "String"}
}
}
}Crea lib/l10n/app_es.arb:
{
"@@locale": "es",
"appTitle": "Sala de lectura",
"welcomeName": "Te damos la bienvenida, {name}",
"savedBooks": "{count, plural, =0{No hay libros guardados} one{1 libro guardado} other{{count} libros guardados}}",
"readingState": "{state, select, active{Leyendo ahora} paused{Lectura en pausa} other{Todo listo para leer}}"
}Il modello contiene i metadati dei segnaposto usati dal generatore. Il file localizzato conserva le chiavi dei messaggi, i nomi dei segnaposto e gli identificatori di select, modificando la formulazione visibile agli utenti. Questi esempi in spagnolo illustrano il meccanismo; i testi di produzione devono ricevere una revisione madrelingua nel loro contesto di prodotto reale.
Esegui flutter gen-l10n dopo aver aggiunto o modificato le risorse. Considera gli errori del generatore come problemi concreti delle risorse e risolvili prima di integrare i file in una release.
Collega i messaggi generati a MaterialApp
Registra i delegate generati e le lingue supportate, poi leggi i messaggi localizzati da un contesto sotto il widget dell'applicazione.
L'esempio seguente va inserito in lib/main.dart dopo la generazione:
import 'package:flutter/material.dart';
import 'l10n/app_localizations.dart';
void main() => runApp(const ReadingApp());
class ReadingApp extends StatelessWidget {
const ReadingApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const ReadingHome(),
);
}
}
class ReadingHome extends StatelessWidget {
const ReadingHome({super.key});
@override
Widget build(BuildContext context) {
final messages = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(messages.appTitle)),
body: Padding(
padding: const EdgeInsetsDirectional.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(messages.welcomeName('Sam')),
Text(messages.savedBooks(3)),
Text(messages.readingState('active')),
],
),
),
);
}
}ReadingHome ha accesso alle localizzazioni fornite da MaterialApp. Richiedere AppLocalizations dal contesto del widget esterno porterebbe a cercare sopra il provider creato da quel widget. La documentazione dell'API Localizations spiega come le risorse localizzate vengono rese disponibili ai discendenti.L'API generata rende visibile nel codice la differenza tra un messaggio semplice e un messaggio con argomenti. appTitle si legge come valore; welcomeName, savedBooks e readingState ricevono i valori necessari per comporre i rispettivi messaggi.
Gestisci con attenzione plurali e messaggi select
I messaggi plurali scelgono la formulazione in base a una quantità e alla grammatica della lingua di destinazione. I messaggi select scelgono un ramo in base a un identificatore fornito dall'applicazione. Conserva sintassi e identificatori e traduci il testo mostrato da ciascun ramo.
Plurali
Nell'esempio, =0 fornisce una frase esplicita per lo stato vuoto. I rami one e other coprono le forme usate dalle lingue di esempio; non sono un modello universale per ogni lingua di destinazione. Fornisci al revisore contesto sufficiente per indicare le forme richieste dalla lingua e i valori che la tua app può produrre.
Messaggi select
Valori come active e paused sono identificatori del programma. Tradurli scollegherebbe la risorsa dal codice che li fornisce. Il ramo other offre al messaggio un fallback per i valori che non corrispondono a un ramo specifico.
Messaggi completi
Evita di concatenare frammenti come un verbo tradotto, un numero e un sostantivo tradotto. Un messaggio completo lascia alla lingua di destinazione il controllo dell'ordine delle parole. Nel brief spiega i valori, gli intervalli previsti e il contesto della schermata, così i revisori possono valutare la frase come la vedranno gli utenti.
Confronta i pacchetti di localizzazione Flutter
Scegli un pacchetto in base al formato delle risorse, all'architettura dell'applicazione e alle esigenze di manutenzione. I pacchetti seguenti adottano convenzioni diverse; usare più generatori per gli stessi messaggi crea ambiguità inutili.
| Approccio | Risorse tipiche | Generazione del codice | Gestione dei plurali | Utile quando |
|---|---|---|---|---|
| gen-l10n integrato | ARB | Genera accessor Dart tipizzati | Sintassi dei messaggi in stile ICU | Vuoi il processo ufficiale di Flutter per le risorse |
| easy_localization | JSON per impostazione predefinita, con altri loader disponibili | Strumenti di generazione facoltativi | API per i plurali del pacchetto e regole basate sulla lingua | Preferisci le sue convenzioni per il caricamento degli asset e la gestione delle lingue |
| Traduzioni GetX | Mappe indicizzate per lingua nel suo processo di base documentato | Non necessaria per l'API di base con mappe | trPlural usa chiavi singolari e plurali; valuta a parte le grammatiche più complesse | La tua applicazione usa già GetX e il suo modello di traduzione soddisfa i requisiti |
Prima di scegliere, consulta la documentazione di easy_localization e la documentazione di GetX aggiornate. Testa con i tuoi messaggi reali il comportamento di fallback, i parametri, le categorie di plurale e i processi di estrazione. Un'API comoda per le stringhe in inglese non garantisce la copertura di tutte le lingue che intendi rilasciare.
intl non è una piattaforma di gestione delle traduzioni alternativa. Fornisce utility di internazionalizzazione usate nei processi di localizzazione. gen-l10n genera gli accessor dell'applicazione dalle risorse ARB. Anche il pacchetto intl_utils genera codice di localizzazione, ma la sua pagina risultava contrassegnata come discontinued alla verifica del 30 ottobre 2026. Controlla lo stato di manutenzione prima di adottarlo in un nuovo progetto.
Testa il cambio di lingua, l'RTL e l'espansione del testo
Testa sia la correttezza delle risorse sia il comportamento del testo tradotto nell'interfaccia. Un parsing JSON riuscito o una generazione del codice senza errori non bastano a garantire che una schermata sia comprensibile e utilizzabile.
Cambio di lingua
Per un controllo mirato in fase di sviluppo, imposta MaterialApp.locale su un valore supportato come const Locale('es'). Per un selettore di lingua in produzione, conserva la lingua scelta nello stato dell'applicazione, salva la preferenza in base ai requisiti del prodotto e offri la possibilità di seguire la lingua di sistema. Convalida la preferenza salvata rispetto alle lingue effettivamente supportate dalla versione corrente dell'app.
Layout da destra a sinistra
Usa le API di layout direzionali per gli elementi che devono seguire il verso di lettura. Controlla padding, allineamento, elementi di navigazione e contenuti con direzioni miste in una vera lingua da destra a sinistra. Non dare per scontato che ogni icona debba essere specchiata: una freccia di navigazione direzionale e un simbolo del brand hanno significati diversi.
Espansione del testo
Testa traduzioni lunghe e dimensioni del testo maggiori. Controlla pulsanti, schede, finestre di dialogo, stati vuoti, errori e layout stretti. Includi valori dinamici come nomi lunghi e numeri, così il layout viene verificato con i messaggi che gli utenti riceveranno davvero.
Usa una matrice di test pratica:
| Controllo | Esempio |
|---|---|
| Copertura delle risorse | Ogni chiave obbligatoria del modello ha un valore localizzato o un fallback voluto |
| Argomenti dei messaggi | Nomi e tipi dei segnaposto restano compatibili con i metodi generati |
| Comportamento delle quantità | Zero, uno e valori che attivano le forme aggiuntive della lingua di destinazione |
| Comportamento dei select | Stati noti più un valore inatteso che arriva a other |
| Comportamento della lingua | Lingua di sistema, selezione esplicita, riavvio e preferenza non supportata |
| Layout | Testo espanso, caratteri grandi e contenuti da destra a sinistra |
| Significato | Revisione madrelingua dei principali percorsi utente |
Per la parte linguistica del processo, usa il processo di test della localizzazione. Mantieni visibili come prove distinte per la release l'approvazione linguistica e i risultati dei test funzionali.
Pianifica separatamente la localizzazione web di Flutter e la reperibilità
Flutter web può usare risorse dell'applicazione localizzate, ma localizzare l'interfaccia non crea automaticamente un sito multilingue pronto per la SEO. Selezione della lingua, routing, metadati e reperibilità dei contenuti restano decisioni architetturali.
Le FAQ web di Flutter descrivono la sua attenzione alle esperienze applicative e consigliano un approccio orientato ai documenti per i contenuti web statici e ricchi di testo. Valuta pagine marketing, di assistenza ed editoriali separate basate su HTML quando devono posizionarsi nella ricerca organica.
Mantieni la terminologia allineata tra l'app e queste pagine pubbliche. Un visitatore arrivato dalla ricerca deve riconoscere il nome della funzionalità passando dalla landing page localizzata all'applicazione, anche quando le due superfici usano sistemi di rendering diversi.
Convalida un processo di traduzione ARB prima di estenderlo
Considera l'ARB come una risorsa strutturata dell'applicazione, non solo come un file di valori di testo. Il passaggio di traduzione deve conservare chiavi, metadati, segnaposto e sintassi dei messaggi, e restituire file che superano la generazione e i test dell'app.
I formati documentati per i progetti software di Smartcat includono importazioni JSON, YAML, XML Android, .strings iOS e LocJSON. La documentazione consultata per questa guida non conferma il supporto nativo dell'ARB né un processo di conversione da ARB a JSON già testato. Non dare per scontato che cambiare l'estensione di un file ne dimostri la compatibilità. Consulta la documentazione sui progetti software.
Usa quanto segue come procedura di convalida da proporre al tuo team di implementazione, non come ricetta di connettore già testata:
Scegli un campione rappresentativo
Seleziona un piccolo campione ARB con stringhe semplici, metadati, segnaposto tipizzati, plurali e select.
Conferma importazione ed esportazione
Conferma con il team di prodotto il metodo di importazione ed esportazione supportato, incluso il trattamento dei metadati
@e dei messaggi ICU.Fornisci risorse linguistiche e contesto
Fornisci un glossario, la memoria di traduzione quando opportuno e un contesto chiaro per ogni messaggio.
Traduci e proteggi la struttura
Traduci e revisiona il testo visibile agli utenti proteggendo gli identificatori del programma e la struttura.
Confronta e ripristina
Confronta le risorse restituite con il contratto della sorgente e ripristinale nei percorsi di progetto previsti.
Genera e testa
Esegui
flutter gen-l10n, l'analisi statica e i test pertinenti nell'ambiente con la versione dell'SDK fissata per il progetto.Revisiona e registra
Revisiona l'interfaccia localizzata e registra la versione della sorgente approvata.
Automatizza la sincronizzazione del repository solo dopo che questo ciclo completo ha avuto successo. Stabilisci chi gestisce le modifiche alla sorgente, come viene invalidato lo stato di revisione e come vengono gestiti gli artefatti generati. Tieni le risorse ARB sotto controllo di versione come fonte di riferimento per il processo dell'applicazione.
Analizza il tuo processo di traduzione Flutter
Errori comuni e cosa controllare per primo
| Sintomo | Primo controllo |
|---|---|
| L'import generato non viene trovato | La generazione è andata a buon fine e l'import corrisponde al percorso di output configurato |
AppLocalizations.of(context) non è disponibile | Il contesto si trova sotto il provider di localizzazione dell'applicazione |
| Un metodo di messaggio ha argomenti inattesi | Metadati dei segnaposto nel modello e API generata |
| Un select mostra sempre il fallback | L'identificatore dell'applicazione corrisponde esattamente al ramo della risorsa |
| Manca una lingua | File di risorse, lingue supportate e configurazione della risoluzione della lingua |
| La traduzione si rompe dopo l'esportazione | Chiavi, validità del JSON, metadati e sintassi ICU sono sopravvissuti al ciclo completo |
Correggi il primo contratto rotto invece di modificare a mano il Dart generato. Il codice generato può essere rigenerato; una correzione manuale lì probabilmente sparirà alla prossima modifica delle risorse.
Domande frequenti
Cos'è un file ARB in Flutter?
Un Application Resource Bundle è un file basato su JSON che contiene messaggi localizzati e metadati facoltativi. Il processo gen-l10n di Flutter usa le risorse ARB per generare un'API di localizzazione in Dart. I metadati possono descrivere il messaggio e i suoi segnaposto, offrendo a sviluppatori e traduttori un contratto più chiaro per ogni chiave.
Qual è la differenza tra gen-l10n e intl_utils?
Entrambi generano codice di localizzazione dalle risorse ARB, ma sono strumenti distinti con convenzioni diverse di configurazione e output. gen-l10n fa parte del processo integrato di Flutter. La pagina del pacchetto intl_utils risultava contrassegnata come discontinued alla verifica per questa guida, quindi controllane lo stato di manutenzione prima di sceglierlo per una nuova implementazione.
Come devo tradurre i file ARB?
Traduci i messaggi visibili agli utenti conservando chiavi stabili, identificatori dei segnaposto, metadati e la struttura del messaggio richiesta. Usa un processo che rispetti questi requisiti, poi esegui la generazione e i test dell'applicazione sui file restituiti. La revisione madrelingua deve valutare significato e contesto, oltre alla validità strutturale.
Smartcat supporta segnaposto e plurali ARB?
La documentazione sui progetti software qui consultata non conferma il supporto nativo dell'ARB né un percorso di conversione testato che conservi tutte le funzionalità ARB. Conferma il metodo di importazione ed esportazione con il team di prodotto e convalida un ciclo completo rappresentativo prima dell'adozione. Il supporto generico del JSON da solo non dimostra la compatibilità con ARB.
La localizzazione Flutter funziona sul web?
Le applicazioni Flutter web possono usare risorse localizzate e la selezione della lingua. La reperibilità nella ricerca è una questione separata: i contenuti pubblici di marketing e assistenza possono trarre vantaggio da un'architettura basata su HTML. Testa routing, selezione della lingua e metadati per la tua esperienza web specifica, invece di presumere che la configurazione della localizzazione mobile copra anche la SEO web.
Non hai trovato la risposta? Parla con uno specialista della localizzazione
Rendi il passaggio di traduzione affidabile quanto il contratto delle tue risorse
Porta un piccolo campione ARB e i controlli richiesti dalla tua build. Analizza il processo prima di estenderlo a ogni lingua e release.