2012-08-17 16 views
5

Capisco come internazionalizzare un programma java, ma ho un problema. La lingua nel mio programma può essere cambiata in qualsiasi momento, ma il mio programma può esistere in molti stati, il che significa che può avere o meno vari JLabels, JPanel, JFrames, ecc. Aperti. Esiste una classe o un metodo che aggiornerà la GUI corrente alla lingua commutata, oppure deve essere eseguita manualmente?Java Swing: cambia la locale in modo dinamico al runtime

Se nient'altro funziona, mi limiterò a richiedono all'utente di riavviare il programma per cambiare la lingua, ma il cambiamento di esecuzione sarebbe bello ...

+0

Avete stringhe localizzate per ogni lingua possibile? Come stai attualmente recuperando quelle stringhe? O le stringhe sono attualmente codificate in ogni elemento? –

+0

Non ho ancora scritto il programma in modo accurato, solo un paio di righe, esattamente per evitare questo problema. Sono aperto a tutto! – Karlovsky120

+0

Che tipo di programma Java stai scrivendo? Un'app Web che utilizza JavaEE/JSF/etc o qualcos'altro? – jahroy

risposta

1

La soluzione generalmente utilizzato è quello di avere un hash di user-facing stringhe in una classe dirigente centrale. Si effettua una chiamata in quella classe ogni volta che si desidera popolare un campo con i dati:

JLabel label = new JLabel(); 
label.setText(LocalizationManager.get("MY_LABEL_TEXT")); 

All'interno della LocalizationManager si dovrà prendere la lingua corrente del programma, poi cercare la stringa appropriata per MY_LABEL_TEXT nella appropriata linguaggio. Il gestore restituisce quindi la stringa ora 'localizzata', oppure alcuni di default se la lingua o la stringa non sono disponibili.

Pensa al gestore come a una mappa leggermente più complicata; sta mappando da una chiave (cioè 'MY_LABEL_TEXT') a ciò che vuoi mostrare ("Buongiorno!" o "Bienvenido!") a seconda della lingua in cui ti trovi. Ci sono molti modi per implementarlo, ma tu vuoi che il gestore sia statico o un singleton (caricato una volta) per ragioni di memoria/prestazioni.

Ad esempio: (1)

public class LocalizationManager { 
    private SupportedLanguage currentLanguage = SupportedLanguage.ENGLISH;//defaults to english 
    private Map<SupportedLanguage, Map<String, String>> translations; 

    public LocalizationManager() { 
    //Initialize the strings. 
    //This is NOT a good way; don't hardcode it. But it shows how they're set up. 

    Map<String, String> english = new HashMap<String, String>(); 
    Map<String, String> french = new HashMap<String, String>(); 

    english.set("MY_LABEL_TEXT", "Good day!"); 
    french.set("MY_LABEL_TEXT", "Beinvenido!");//is that actually french? 

    translations.set(SupportedLanguage.ENGLISH, english); 
    translations.set(SupportedLanguage.FRENCH, french); 
    } 

    public get(String key) { 
    return this.translations.get(this.currentLanguage).get(key); 
    } 

    public setLanguage(SupportedLanguage language) { 
    this.currentLanguage = language; 
    } 

    public enum SupportedLanguage { 
    ENGLISH, CHINESE, FRENCH, KLINGON, RUSSIAN; 
    } 
} 

(1) non ho testato questo, né è un singoletto, ma è un off il bracciale esempio.

+0

Quindi vorrei invocare il gestore sull'interruttore della lingua e aggiornerebbe tutte le stringhe che devono essere aggiornate (che sono sotto la sua giurisdizione)? – Karlovsky120

+0

Potresti dirmi di più su LocalizationManager, non riesco a trovare nulla con Google? – Karlovsky120

+1

@ Karlovsky120 Ho aggiornato la mia risposta per provare a fornire un esempio. Non aggiornare tutte le stringhe sulla commutazione di una lingua; fallo una volta Meglio ancora, fallo pigramente, ma questo è il prossimo passo. Se hai un'interfaccia come quella che ho mostrato, puoi migliorare l'implementazione. –