i18n checklist java swing internationalization

java - checklist - Cambio de configuración regional en tiempo de ejecución en Swing



i18n java (5)

Me gustaría poder cambiar la configuración regional en mi aplicación Swing en tiempo de ejecución y hacer que todos los elementos de texto en la pantalla se actualicen con texto localizado desde un ResourceBundle de la nueva configuración regional.

¿Se puede hacer esto sin personalizar los componentes swing o crear UIDelegates para todos los componentes que manejan la representación de texto localizado?

Si no, ¿cuál es una buena solución que puedo considerar implementar?


  1. Tiene un método que se utiliza para cambiar la configuración regional de la aplicación (y probablemente persista el nuevo valor) y otra para obtener cadenas localizadas.

  2. Crea una interfaz:

    interface LocaleChangeListener { void onLocaleChange(); }

    Impleméntelo por los componentes de la interfaz de usuario que necesitan para poder cambiar la configuración regional en el tiempo de ejecución y establecer los nuevos valores en reemplazos onLocaleChange() .

  3. Ahora, tenga una lista de oyentes que serán notificados sobre el cambio de lugar por el primer método.


¿Qué tal, al cambiar la configuración regional, haga un firePropertyChangeEvent ("locale", "..."), luego agregue propertyChangeListener () y regístrelos, dondequiera que se vayan a actualizar las etiquetas y similares?


Es posible que desee guardar la preferencia de idioma y luego requerir un reinicio de la aplicación para que los cambios surtan efecto.

Entonces, debería poder usar Locale.setDefault(Locale.<desired language>); en el inicio, antes de renderizar la GUI. Eso debería cambiar correctamente su configuración regional, lo que dará como resultado la carga de los archivos .properties deseados.


Hay dos enfoques obvios que veo:

En lugar de obtener un String del ResourceBundle , obtenga algún tipo de titular de String fuente de evento. Document sería una solución muy pesada, pero cualquier cosa que pueda manejar el reemplazo de un valor inmutable lo hará. En lugar de simplemente configurar el texto en una etiqueta, digamos, tener un método que también configure un oyente. Tenga en cuenta que esta es una solución bastante "pesada".

Alternativamente, tenga un repositorio central de oyentes que se activen en un cambio de configuración regional, que cada uno regrese y vuelva a ejecutar la parte relevante del código de configuración (no duplicar). Para casos comunes en los que tiene, por ejemplo, un JLabel utilizando literalmente una cadena de recursos, puede combinarlos todos en un único oyente con un WeakHashMap<JLabel,String> . A veces resulta mejor evitar a muchos pequeños oyentes.


use ResourceBundle.getBundle(BUNDLE_NAME).getString(key); para acceder a las cuerdas.

al actualizar la Locale.setDefault(Locale.GERMAN); regional predeterminada, por ejemplo, a través de Locale.setDefault(Locale.GERMAN); borre el caché ResourceBundle: ResourceBundle.clearCache();

la próxima llamada de ResourceBundle.getBundle(BUNDLE_NAME).getString(key); debe devolver la cadena localizada de la configuración regional elegida.