2012-08-17 23 views
5

Entiendo cómo internacionalizar un programa Java, pero tengo un problema. El idioma de mi programa se puede cambiar en cualquier momento, pero mi programa puede existir en muchos estados, lo que significa que puede tener o no varios JLabels, JPanels, JFrames, etc. abiertos. ¿Hay una clase o un método que actualizará la GUI actual al idioma cambiado, o tiene que hacerse manualmente?Java Swing: cambie la configuración regional dinámicamente en el tiempo de ejecución

Si nada de esto funciona, voy a necesitar que el usuario reiniciar el programa para cambiar el idioma, pero el cambio de tiempo de ejecución sería bueno ...

+0

¿Tiene cadenas localizadas para cada idioma posible? ¿Cómo estás buscando esas cadenas? ¿O están las cadenas actualmente codificadas en cada elemento? –

+0

Todavía no he escrito el programa, solo un par de líneas, exactamente para evitar ese problema. ¡Estoy abierto a todo! – Karlovsky120

+0

¿Qué tipo de programa va a escribir? ¿Una aplicación web con JavaEE/JSF/etc. u otra cosa? – jahroy

Respuesta

1

La solución utilizada generalmente es tener un hash de usuario orientada cadenas en una clase de gerente central. Realizar una llamada a esa clase siempre que lo desee para rellenar un campo con datos:

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

Dentro de la LocalizationManager tendrá que buscar el idioma actual del programa, a continuación, busque la cadena apropiada para MY_LABEL_TEXT en el apropiado idioma. El administrador luego devuelve la cadena ahora 'localizada', o algunos valores predeterminados si el idioma o la cadena no está disponible.

Piense en el administrador como un mapa un poco más complicado; es mapear desde una clave (es decir, 'MY_LABEL_TEXT') a lo que desea mostrar ("¡Buen día!" o "Bienvenido!") según el idioma en el que se encuentre. Hay muchas maneras de implementar esto, pero usted quiere que el administrador sea estático o un singleton (cargado una vez) por razones de memoria/rendimiento.

Por ejemplo: (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) No he probado esto, ni tampoco es un singleton, pero es un fuera de la ejemplo manguito.

+0

Entonces invocaría al administrador al cambiar de idioma y actualizaría todas las cadenas que se actualizarán (que son bajo su jurisdicción)? – Karlovsky120

+0

¿Podría decirme más acerca de LocalizationManager (s), parece que no puedo encontrar nada con Google? – Karlovsky120

+1

@ Karlovsky120 He actualizado mi respuesta para tratar de dar un ejemplo. No actualice todas las cadenas para cambiar un idioma; hazlo una vez Mejor aún, hazlo perezosamente, pero ese es el próximo paso. Si tiene una interfaz como la que he mostrado, puede mejorar la implementación. –

Cuestiones relacionadas