Partiamo dalla questione sul java.util.Locale. Le soluzioni sono 2 (almeno .. ho in mente queste adesso):Originariamente inviato da mishima
Tuttavia il mio problema resta. Se l'utente sceglie di cambiare lingua, diciamo vuole passare all'inglese del file language
Come posso cambiare con poco codice tutti i testi presenti nelle JLabel, le JTextArea, i JTextField, i JMenuItem, i JButton etc.. ?
Non voglio credere di essere costretto a fare un .setText per ognuno di questi elementi nel listener del bottone per il cambio della lingua. Ora la mia interfaccia è semplice, saranno 20 voci... Ma in caso di interfacce complesse con 200 voci? O anche di più?
1) Settare il Locale di default (setDefault di Locale) in modo che tutto il resto che si basa sul locale di "default" vada automaticamente a posto. Questo sarebbe positivo non solo per il ResourceBundle ma anche quando, ad esempio, da qualche parte prendi es. un NumberFormat o un DateFormat per il locale predefinito.
2) Usare una tua variabile Locale (globale in qualche modo), inizialmente settata con il locale di default. Quindi una gestione "a monte" di quella del framework, dove tutto nella tua applicazione girerebbe in funzione di questa tua variabile. Non mi piace molto come soluzione ma l'ho detta giusto per completezza.
Passiamo alla questione del "cambio" della interfaccia utente. Questa è più "spinosa".
Se hai pochi componenti "localizzabili", potresti anche fare una gestione specializzata e veloce. Anche con dei banali setText ma intendo dire che potresti anche non voler "generalizzare" la cosa (spiego dopo).
C'è solo un problema se vuoi cambiare i testi nella interfaccia "al volo" mantenendo la interfaccia "viva" senza ricostruirla: i testi potrebbero essere più lunghi o più corti e a seconda del/dei layout manager che hai usato, un banale cambio dei testi potrebbe portare ad una interfaccia un po' "sballata".
Certo ... si potrebbe sempre fare un pack() sul frame (ammesso, ripeto, che ci siano i layout manager) ma in ogni caso è da valutare.
Le altre soluzioni sono almeno tre:
1) Notificare all'utente che il cambio di lingua avverrà al prossimo avvio della applicazione (ovviamente la lingua devi salvarla in modo persistente da qualche parte, es. file di configurazione o altro). Non è una soluzione tanto brutta quanto sembra. Molte applicazioni multi-lingua fanno così.
2) Senza dover terminare l'applicazione, semplicemente "distruggere" il/i frame/dialog della applicazione (che vuol solo dire chiuderli e farli diventare non più raggiungibili) e poi ricrearli con la nuova lingua.
Chiaramente ci vuole un po' di "logica", nel senso che si tratta di predisporre un possibile "loop" per ricreare la GUI. Ma nulla di complicato.
3) Mantenere la interfaccia viva e cambiare solo i testi localizzabili. A patto poi di fare in modo che la interfaccia si presenti bene dal punto di vista visivo.
Questo tecnicamente si può fare in svariati modi: dal modo più diretto in cui avendo i riferimenti ai componenti fai tanti setText di fila in un tuo metodo a modi più generici in cui magari crei i tuoi componenti es. MyLabel che estende JLabel, ecc... che hanno in più la informazione sul "id" da usare per il testo e magari implementano una interfaccia es. Localizzabile. A quel punto basta una scansione in profondità partendo da un contenitore per trovare tutti i "Localizzabile" invocando su ognuno es. localizza().
Questa sarebbe una architettura più "generica" ma va pensata e strutturata prima di partire "in quinta" marcia con lo sviluppo della applicazione!