Cuando tenemos aplicaciones web, que pueden ser visitadas por muchos tipos de clientes, es conveniente internacionalizar la misma. En Java, el método para ello, suele ser siempre el mismo, se crea un fichero
properties por cada idioma, y las cadenas de texto que aparecen en nuestra página se cargan desde ese fichero.
En JSF o ADF el proceso es similar, a continuación vamos a explicar paso a paso, como internacionalizar nuestra propia aplicación web.
Lo primero que debemos hacer será crear nuestro fichero properties, el nombre que debemos darle a este fichero, variará dependiendo de los idiomas que queramos que soporte nuestra página. Por ejemplo, si queremos que la aplicación soporte los idiomas inglés y español, deberemos crear dos properties con el siguiente formato :
- mensajes_ES.properties
- mensajes_EN.properties
Donde el código que va siguiendo al caracter _, será el correspondiente al idioma que se usa en el mismo.
El contenido de estos ficheros siempre será el mismo:
KEY = CADENA
Por ejemplo si queremos mostrar el mensaje Bienvenido debemos rellenar en nuestros ficheros properties lo siguiente:
SALUDO = Bienvenido
SALUDO = Welcome
Debemos de tener en cuenta que las cadenas que insertamos en estos ficheros no llevan la doble comilla.
Vamos a ver ahora, como cargar estos ficheros en nuestras páginas. Estos ficheros se cargan justamente debajo de la declaración de directivas del fichero .jsf, y para ello hacemos uso del componente de JSF llamado <f:loadBundle>. A este componente debemos setearle dos propiedades:
- basename : nombre del fichero properties sin incluir el código del idioma.
- var : nombre por el que vamos a referenciar al fichero.
… <f:view>
<f:loadBundle basename="mensajes"
var="msg">
…
Ya sólo queda asociarle dichos mensajes, a los distintos componentes que tengamos en nuestra ventana, esto se hace mediante el etiquetado EL:
<af:panelBox text="#{msg['SALUDO']}">
Si queremos asociar varias cadenas diferentes dentro de una misma propiedad, el formato sería el siguiente:
<af:panelBox text="#{msg['SALUDO']} #{msg['USUARIO']}">
Para terminar, sólo quedaría definir los lenguajes que soporta nuestra aplicación, en el fichero de configuración faces-config.xml, así como el bundle que vamos a utilizar:
<application>
<default-render-kit-id>
oracle.adf.core
</default-render-kit-id>
<locale-config>
<default-locale>es</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
<message-bundle id="mensajes">mensajes</message-bundle>
</application>
Desde los ficheros .java, muchas veces, también mostramos mensajes por pantalla al usuario, estos mensajes también se pueden internacionalizar. La manera de realizarlo es creandonos un objeto de tipo ResourceBundle:
…
ResourceBundle bundle = ResourceBundle.getBundle("mensajes");
…
Y a través de este nuevo objeto, podemos acceder a las cadenas contenidad en el fichero properties que le hemos pasado como parámetro:
//String mensajeSaludo = bundle.getString(key);
String mensajeSaludo = bundle.getString("SALUDO");
Es importate recordar, que las diferentes key que definamos, tienen que estar soportadas en todos los archivos properties que tengamos asociados a la aplicación, ya que sino, corremos el riesgo que a los usuarios, le aparezcan mensajes de error en la lectura del fichero, si no está soportado dicho mensaje en su idioma. Por tanto, es recomendable, si no sabemos traducir una palabra en otro idioma, dejar esa key sin traducir, al menos así, no le apareceran mensajes de error a los usuarios.
El idioma se configura automaticamente, es el navegador del cliente de nuestra aplicación, el que va a detectar, que fichero properties debe usar en cada momento. Por tanto, no debemos nosotros crear ninguna regla ni condición en nuestro código para ello.