checklist - i18n java
Paquete de recursos Java incorrecto cargado (2)
Esto podría ayudar a aclarar su pregunta:
http://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html
Estos objetos Locale deben coincidir con los archivos de propiedades creados en los dos pasos anteriores. Por ejemplo, el objeto Locale.FRENCH corresponde al archivo LabelsBundle_fr.properties. El archivo Locale.ENGLISH no tiene un archivo LabelsBundle_en.properties coincidente, por lo que se usará el archivo predeterminado.
En mi aplicación, estoy usando el paquete de recursos de Java para la traducción de sus etiquetas. Actualmente tengo dos archivos:
- resources.properties con etiquetas en inglés (idioma predeterminado)
- resources_fr.properties con etiquetas en francés
Luego, cargo las propiedades del paquete con el siguiente comando:
ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale);
... donde la locale
es la del usuario.
Cuando estoy trabajando con un navegador web francés, está bien, obtengo todos mis mensajes en francés, ya que mi configuración regional está configurada correctamente en fr. Pero cuando cambio mi navegador a inglés de EE. UU., ¡Todavía están en francés!
La variable locale
se establece correctamente con la configuración regional getBundle
, pero el método getBundle
me devuelve un paquete con la configuración regional fr en lugar de simplemente devolver el paquete predeterminado ...
¿Es un comportamiento normal? Estoy muy sorprendido, ya que esperaba que se utilizaran los valores en inglés de resources.properties
cuando la configuración regional no tiene un paquete de recursos específico adjunto (como el francés) ...
Es el resultado normal, que sin embargo es bastante sorprendente si no has leído la descripción (bastante larga) de getBundle con cuidado. La parte importante es:
Si no se encuentra un paquete de recursos coincidentes, se llama al método getFallbackLocale del control predeterminado, que devuelve la configuración regional predeterminada actual. Se genera una nueva secuencia de nombres de lugares candidatos utilizando esta configuración regional y se vuelve a buscar, como se indicó anteriormente.
Esto es un poco inesperado. Solo después de haber probado con la configuración regional predeterminada además de la configuración regional especificada, el método hace lo que cabría esperar:
Si todavía no se encuentra el paquete resultante, se busca el nombre base solo.
Este es un comportamiento razonable para una aplicación de escritorio. Después de todo, si ha tenido éxito al iniciar una aplicación Java dada la configuración regional predeterminada de la máquina, debe saber cómo manejar la aplicación si aparece utilizando la configuración regional predeterminada en lugar de la que ha especificado. Pero si su aplicación es un servidor web y se utiliza la configuración regional del servidor en lugar de las preferencias que ha especificado en su navegador, la página resultante puede ser todo un rompecabezas.
La forma correcta de manejar esto es suprimir el uso de la configuración regional alternativa. Puede hacer esto en su código especificando el argumento adicional ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT)
, lo que resulta en
ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale,
ResourceBundle.Control.getNoFallbackControl(
ResourceBundle.Control.FORMAT_DEFAULT));
(Por lo general, defino una constante para el argumento adicional en algún lugar cuando lo necesito más de una vez). Esto da como resultado el comportamiento que esperabas.