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.

Prenota una demo

Prenota una demo

Porta un piccolo campione ARB e i controlli richiesti dalla tua build

Inizia prova gratuita

Inizia prova gratuita

15 giorni gratis, senza carta di credito

Progetto di localizzazione software in Smartcat con l'avanzamento della traduzione per lingua di destinazione

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: true

Risolvi 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.dart

Usa 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.

ApproccioRisorse tipicheGenerazione del codiceGestione dei pluraliUtile quando
gen-l10n integratoARBGenera accessor Dart tipizzatiSintassi dei messaggi in stile ICUVuoi il processo ufficiale di Flutter per le risorse
easy_localizationJSON per impostazione predefinita, con altri loader disponibiliStrumenti di generazione facoltativiAPI per i plurali del pacchetto e regole basate sulla linguaPreferisci le sue convenzioni per il caricamento degli asset e la gestione delle lingue
Traduzioni GetXMappe indicizzate per lingua nel suo processo di base documentatoNon necessaria per l'API di base con mappetrPlural usa chiavi singolari e plurali; valuta a parte le grammatiche più complesseLa 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:

ControlloEsempio
Copertura delle risorseOgni chiave obbligatoria del modello ha un valore localizzato o un fallback voluto
Argomenti dei messaggiNomi 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 selectStati noti più un valore inatteso che arriva a other
Comportamento della linguaLingua di sistema, selezione esplicita, riavvio e preferenza non supportata
LayoutTesto espanso, caratteri grandi e contenuti da destra a sinistra
SignificatoRevisione 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:

  1. Scegli un campione rappresentativo

    Seleziona un piccolo campione ARB con stringhe semplici, metadati, segnaposto tipizzati, plurali e select.

  2. 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.

  3. Fornisci risorse linguistiche e contesto

    Fornisci un glossario, la memoria di traduzione quando opportuno e un contesto chiaro per ogni messaggio.

  4. Traduci e proteggi la struttura

    Traduci e revisiona il testo visibile agli utenti proteggendo gli identificatori del programma e la struttura.

  5. Confronta e ripristina

    Confronta le risorse restituite con il contratto della sorgente e ripristinale nei percorsi di progetto previsti.

  6. 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.

  7. 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

SintomoPrimo controllo
L'import generato non viene trovatoLa generazione è andata a buon fine e l'import corrisponde al percorso di output configurato
AppLocalizations.of(context) non è disponibileIl contesto si trova sotto il provider di localizzazione dell'applicazione
Un metodo di messaggio ha argomenti inattesiMetadati dei segnaposto nel modello e API generata
Un select mostra sempre il fallbackL'identificatore dell'applicazione corrisponde esattamente al ramo della risorsa
Manca una linguaFile di risorse, lingue supportate e configurazione della risoluzione della lingua
La traduzione si rompe dopo l'esportazioneChiavi, 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.

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.