Testando l'interfaccia multilingue di Flutter, abbiamo trovato “300 BPM” diviso su due righe

Abbiamo verificato la visualizzazione di SANGE Metronome combinando 12 lingue, 6 dimensioni dello schermo e 3 scale del testo. La divisione di “300 BPM” e i messaggi di errore lunghi ci hanno portato a correggere l'interfaccia e rivedere i controlli dei test automatizzati.

Pubblicato Aggiornato
  • Supporto multilingue
  • Flutter
  • Test dell'interfaccia
  • sviluppo personale

Abbiamo verificato la visualizzazione su schermi piccoli e con testo ingrandito in “SANGE Metronome – Esercizi di ritmo semplici”, l'app che sviluppiamo in modo indipendente.

Uno dei problemi scoperti era la divisione delle cifre di “300 BPM” nei preferiti in “30” e “0”. Il testo non fuoriusciva dallo schermo. Ciononostante, il valore del tempo era diventato difficile da leggere.

Era necessario verificare separatamente l'assenza di eccezioni di layout e la leggibilità delle informazioni necessarie.

In questo articolo descriviamo i problemi di visualizzazione scoperti con i test dei widget in 12 lingue e i controlli delle schermate nell'emulatore Android, e come li abbiamo incorporati nelle correzioni e nei test.

Panoramica della parte inferiore della schermata iniziale in francese, portoghese brasiliano, indonesiano, thailandese, vietnamita e giapponese, con scala del testo al 130%
Panoramica di sei schermate dopo la correzione. In alto, da sinistra: francese, portoghese brasiliano e indonesiano. In basso: thailandese, vietnamita e giapponese. I nomi tedeschi dei preferiti sono dati di prova comuni a tutte le lingue, usati per provare nomi lunghi.

Un layout che funziona in giapponese potrebbe non funzionare allo stesso modo in altre lingue

La schermata del metronomo mostra non soltanto il tempo, ma anche battiti, nomi dei ritmi, volume e nomi dei preferiti. La schermata di salvataggio richiede inoltre campi di input, spiegazioni degli errori e pulsanti Salva e Annulla.

Anche se un layout è adatto al giapponese, la lunghezza delle etichette cambia con la traduzione. Per esempio, “12拍” in giapponese e “12 Schläge” in tedesco richiedono larghezze diverse per il pulsante.

Ingrandendo ulteriormente il testo, gli elementi affiancati non trovano più spazio. Per questo abbiamo deciso di non limitarci a cambiare lingua, ma di combinare dimensioni dello schermo, scala del testo e schermata visualizzata nelle verifiche.

Verifica automatizzata con 12 lingue, 6 dimensioni e 3 scale del testo

Nei test dei widget abbiamo combinato le condizioni seguenti. Questi test renderizzano i componenti dell'interfaccia Flutter in un ambiente di prova per verificarli.

Dimensione della verificacondizioni
LinguaGiapponese, inglese, spagnolo, portoghese brasiliano, tedesco, francese, coreano, indonesiano, vietnamita, thailandese, cinese tradizionale e italiano
Dimensioni logiche, orientamento verticale320×568、360×640、360×800、393×873、412×915、432×960
Scala del testo100%, 130% e 200%
SchermataSchermata iniziale, battiti, suddivisione ritmica, impostazioni, selezione della lingua, salvataggio, gestione dei preferiti e elenco dei preferiti
12 lingue × 6 dimensioni × 3 scale del testo × 8 schermate = 1,728 condizioni

I dati di prova comprendevano 300 BPM, 12 battiti, semicrome, volume al 100% e tre preferiti con nomi lunghi. Nella schermata di salvataggio abbiamo visualizzato anche l'errore per un nome duplicato.

Abbiamo impostato la scala del testo con TextScaler.linear. I valori 100%, 130% e 200% di questa verifica sono condizioni di ingrandimento lineare e non riproducono integralmente tutti gli ingrandimenti del testo offerti dalle impostazioni del sistema sui dispositivi reali.

Abbiamo raccolto immagini anche nell'emulatore Android in sette lingue: tedesco, francese, portoghese brasiliano, indonesiano, thailandese, vietnamita e giapponese. Non abbiamo provato tutte le combinazioni di dimensioni, scale e lingue. Abbiamo verificato le dimensioni e le scale in tedesco, mentre le altre sei lingue sono state controllate con configurazione 360×640 e scala del 130%.

Nell'emulatore, le barre del sistema riducono l'area disponibile per l'app. Oltre alle dimensioni impostate, abbiamo registrato le dimensioni logiche durante il rendering e quelle all'interno della SafeArea.

Adattare le colonne dei pulsanti dei battiti al testo

Il primo problema rilevato era la fuoriuscita a destra del testo esplicativo del tempo e dell'unità dei battiti. L'emulatore Android ha rilevato anche un RenderFlex overflow, rendendo necessaria una revisione del layout.

Anche i pulsanti di selezione dei battiti usavano quattro colonne fisse. Tuttavia, con etichette tradotte più lunghe o una scala del testo maggiore, quel numero di colonne non offriva larghezza sufficiente.

Abbiamo quindi misurato le etichette tradotte con TextPainter e determinato il numero di colonne in base alla larghezza necessaria, considerando anche la scala del testo. Negli spazi stretti riduciamo le colonne e disponiamo i pulsanti verticalmente.

Schermata corretta di selezione dei battiti, con configurazione 320×568 e tedesco al 100%, con i pulsanti da 1 a 12 battiti su due colonne
Visualizzazione al 100% dopo la correzione. In queste condizioni è stato possibile disporre i 12 pulsanti su due colonne.
Selezione dei battiti con configurazione 320×568 e tedesco al 200%, dopo lo scorrimento verso il basso. I pulsanti da 7 a 12 battiti sono su una colonna
Con le stesse dimensioni di visualizzazione al 200%, siamo passati a una colonna. Abbiamo fatto scorrere la schermata fino al pulsante di 12 battiti e alla spiegazione sottostante. La scala del testo e la posizione di scorrimento differiscono dall'immagine precedente; entrambe mostrano lo stato dopo la correzione.

Anche nella schermata iniziale abbiamo rivisto il layout che comprimeva nomi di ritmi lunghi in due colonne strette, disponendo battiti e ritmo verticalmente quando necessario. Per risolvere la divisione delle cifre dei battiti da 10 a 12, abbiamo consentito all'intero gruppo di indicatori dei battiti di distribuirsi su più righe.

La divisione di “300” non genera necessariamente un'eccezione

Esaminando le immagini, abbiamo individuato il problema nelle schede dei preferiti con configurazione 320×568 e scala del testo al 200%.

Poiché le schede rimanevano disposte su tre colonne, “300” andava a capo nel mezzo. Anche se il testo resta nell'area di visualizzazione, dividerlo in “30” e “0” rende difficile leggere il tempo.

Il solo controllo delle eccezioni di layout non ha consentito di rilevare questo problema.

La correzione ha adeguato il numero di colonne delle schede dei preferiti alla scala del testo. Sullo schermo piccolo al 200% di questa verifica, siamo passati a una colonna per evitare che le cifre del tempo si dividessero.

Schermata corretta con configurazione 320×568 e tedesco al 200%, con i preferiti su una colonna nella parte inferiore della schermata iniziale e le cifre di 300 BPM non divise
Preferiti dopo la correzione. La parte finale dei nomi lunghi viene troncata, mentre le cifre del tempo restano unite. Non avendo salvato un'immagine precedente alla correzione in queste condizioni, non si tratta di un confronto affiancato tra prima e dopo a parità di condizioni.

Insieme alla correzione abbiamo aggiunto ai test automatizzati il controllo che un BPM di tre cifre rimanga su una sola riga. Di seguito è riportato un estratto di questo controllo.

for (var card = 0; card < 3; card++) {
  final paragraph = tester.renderObject<RenderParagraph>(
    find.text('300  BPM').at(card),
  );
  expect(
    paragraph.getBoxesForSelection(
      const TextSelection(baseOffset: 0, extentOffset: 3),
    ),
    hasLength(1),
    reason:
        '$locale/$size/$scale favorite BPM must stay on one line',
  );
}

Verifichiamo che l'intervallo di caratteri corrispondente a “300” occupi una sola casella di rendering. Nei test completi abbiamo controllato il BPM di ciascuno dei tre preferiti e i numeri dei battiti da 1 a 12 nella schermata iniziale.

Questo metodo riguarda le cifre renderizzate con lo stesso carattere tipografico in questa verifica. Non è un metodo generale per individuare le interruzioni di riga nei testi che mescolano lingue o caratteri diversi.

Definire controlli concreti in base alle informazioni da visualizzare. Un risultato utile di questa verifica è stato riportare i problemi scoperti nelle immagini nei test automatizzati, per rilevarli anche nelle modifiche future.

È possibile leggere la spiegazione dell'errore e raggiungere il pulsante Salva?

Nella schermata di salvataggio abbiamo rivisto anche il limite di righe dei messaggi di errore.

In precedenza il testo era limitato a tre righe, ma su uno schermo stretto con testo ingrandito le traduzioni lunghe potevano non entrare. Abbiamo rimosso il limite di righe per consentire la lettura dell'intera spiegazione tramite scorrimento.

Abbiamo disposto i pulsanti Salva e Annulla verticalmente sugli schermi stretti o con testo grande. Abbiamo modificato anche il titolo e il pulsante di chiusura del modale, nonché i nomi delle impostazioni e i valori selezionati, per riservare più larghezza al testo.

Schermata di salvataggio con configurazione 320×568 e tedesco al 200%, dopo lo scorrimento verso il basso, con l'errore completo per il nome duplicato e i pulsanti Annulla e Salva disposti verticalmente
Spiegazione dell'errore per il nome duplicato e pulsanti Annulla e Salva. La schermata è stata acquisita dopo lo scorrimento.

Abbiamo aggiunto controlli anche durante la digitazione. Nei test dei widget abbiamo riservato un margine inferiore di 280 pixel logici equivalente alla tastiera e verificato che, dopo lo scorrimento, il pulsante Salva fosse visualizzato sopra quell'area. Abbiamo inoltre controllato che il limite di righe non troncasse i messaggi di errore.

Nell'emulatore Android abbiamo effettivamente attivato il campo di input e verificato il layout con la tastiera aperta. Tuttavia, i PNG raccolti in quel momento catturano solo la schermata Flutter e non mostrano la tastiera del sistema. Abbiamo registrato separatamente le immagini della visualizzazione normale e della digitazione.

Risultati dopo le correzioni e ambito della verifica

Questi sono i risultati della verifica del 30 ottobre 2026.

ArticoloRisultato
Test dei widget di visualizzazioneNessuna eccezione di layout in 1,728 condizioni. Superati anche i controlli sulla divisione dei numeri, sul troncamento dei messaggi di errore e sull'accessibilità del pulsante Salva nelle schermate interessate
Tutti i test Flutter121 test superati
Analisi staticaNessun problema segnalato
Condizioni delle schermate nell'emulatore Android280 condizioni. In ogni esecuzione, layoutErrors è stato 0
PNG raccolti478 immagini, inclusi gli stati dopo lo scorrimento e durante la digitazione

1,728 è il numero di combinazioni delle condizioni di visualizzazione, mentre 121 è il numero totale di test Flutter eseguiti. Poiché i test verificano ripetutamente più condizioni di visualizzazione, i due numeri hanno significati diversi.

478 è il numero di PNG raccolti. Non abbiamo assegnato un esito visivo individuale a ogni immagine: abbiamo selezionato le schermate principali per controllare caratteri tagliati o sovrapposti, numeri divisi e visualizzazione dopo lo scorrimento. Nelle schermate principali verificate in thailandese e vietnamita non abbiamo osservato quadrati per caratteri mancanti né sovrapposizioni del testo.

Oltre a sei dimensioni sintetiche, abbiamo usato sei configurazioni di visualizzazione nell'emulatore: Galaxy A16 5G, A06 4G, S24+, S23, Redmi 14C 4G e Pixel 9. Abbiamo preparato 30 configurazioni specifiche per modello, ma ne abbiamo eseguite sei in questa verifica.

Abbiamo applicato risoluzioni e densità approssimative di prova allo stesso emulatore Android 14. Non abbiamo riprodotto sistemi personalizzati dei produttori, caratteri o fori per la fotocamera, né verificato 30 modelli su dispositivi reali. I test Flutter sono stati eseguiti su Windows; questa volta non abbiamo eseguito neppure il confronto golden pixel per pixel per Linux.

Questo resoconto riguarda la verifica della visualizzazione. I risultati relativi a rendering, attivazione del campo di input e scorrimento non dimostrano il successo della riproduzione audio o della procedura di salvataggio.

Cosa continuare a verificare nelle prossime modifiche dell'interfaccia

Questa verifica ha reso concreti gli aspetti che vogliamo mantenere nei test di visualizzazione.

  • Non dividere nel mezzo valori numerici come il tempo e i numeri dei battiti.
  • Consentire la lettura integrale delle spiegazioni degli errori.
  • Mantenere raggiungibili i pulsanti necessari con testo ingrandito e durante la digitazione.

Adattando il numero di colonne alle dimensioni del testo e alle traduzioni, e usando disposizione verticale e scorrimento, abbiamo riservato spazio per le informazioni e le operazioni necessarie.

Ripetere le condizioni nei test automatizzati e aggiungere ai controlli i problemi notati nelle immagini renderizzate. Mantenendo questo flusso, nelle prossime modifiche dell'interfaccia potremo verificare che i problemi trovati in questa occasione non si ripresentino.

← Vai all'elenco degli articoli del blog di sviluppo