Los message bundles son ficheros .properties que guardan mensajes del tipo clave=valor. Si centralizamos todos los mensajes de nuestra aplicación en estos ficheros, es más fácil poder localizarlos si queremos realizar algún cambio y también nos ayuda para la internacionalización de la aplicación.
Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes
2) De manera global en faces-config.xml
Esta opción es más eficiente ya que sólo crea el bundle una vez para toda la aplicación
Java ya se encarga de hacer referencia al fichero adecuado según el idioma actual que tenga cargado. Si no se carga ninguno, coge el de por defecto, que en nuestro ejemplo sería messages.properties.
1) En el fichero faces-config.xml
2) En una página JSF
3) En una clase
Ejemplo: messages.properties (en src/java/com/examples) con dos mensajes
name=Tu nombre: age=Tu edad:
¿Cómo los declaramos?
1) En cada página JSF donde lo necesitemos<f:loadBundle basename="com.examples.messages" var="msgs"/>
2) De manera global en faces-config.xml
<application> <resource-bundle> <base-name>com.examples.messages</base-name> <var>msg</var> </resource-bundle> </application>
Esta opción es más eficiente ya que sólo crea el bundle una vez para toda la aplicación
¿Cómo accedemos a los mensajes desde una página JSF?
Siguiendo con el ejemplo, sería algo tan sencillo como #{msg.name}¿Podemos tener mensajes parametrizados?
Sí. Podemos tener un mensaje que sea:saludo=Bienvenido {0} a nuestra webY en nuestra página JSF, en {0} mostramos lo que queramos con <f:param>
<h:outputFormat value="#{msg.saludo}"> <f:param value="#{userBean.name}"/> </h:outputFormat>Se pueden poner varios parámetros {0}, {1}, {2} y así sucesivamente.
¿Cómo internacionalizamos nuestros mensajes?
Si por un casual nos fuéramos a Munich (guiño guiño) y quisiéramos añadir también mensajes en alemán, sólo tendríamos que crear un nuevo .properties con el mismo nombre que el anterior y añadiendo un guión bajo y el código ISO-639 del idioma. Para nuestro ejemplo, tendríamos que crear el fichero messages_de.properties.Java ya se encarga de hacer referencia al fichero adecuado según el idioma actual que tenga cargado. Si no se carga ninguno, coge el de por defecto, que en nuestro ejemplo sería messages.properties.
¿Cómo definimos el idioma de nuestra aplicación?
Tenemos tres maneras: de manera global en el faces-config.xml, localmente en una página JSF o en una clase.1) En el fichero faces-config.xml
<application> <locale-config> <default-locale>es</default-locale> <supported-locale>de</supported-locale> </locale-config> </application>
2) En una página JSF
<f:view locale="de">O de manera dinámica (por ejemplo, para cuando dejemos que el usuario seleccione el idioma)
<f:view locale="#{userBean.locale}"/>
3) En una clase
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("de"));
¿Cómo cambiar los mensajes JSF por defecto?
Si por ejemplo quisiéramos cambiar los mensajes de error de validación que se muestran por pantalla, que están definidos por defecto en el Message.properties de jsf-impl.jar, sólo tendríamos que añadirlos en nuestro propio fichero .properties y ponerles el mensaje que queramos:javax.faces.component.UIInput.REQUIRED=Error de validación
Hola Ana,
ResponderEliminarme ha gustado mucho este post pero no consigo la localization de los mensages, creo que me equivoco sobre la dirección del base-name.
Yo tengo los archivos de los mensages en resources/localization, puedes intentar ayudarme?
Gracias
Luca Jonathan Panetta
Hola Luca,
ResponderEliminarsi tienes tu messages.properties en src/main/resources/localization, utiliza el basename localization.messages. Si no, tienes que mirar en qué paquete del WEB-INF/classes se te generan y utilizar ese paquete más el nombre del fichero properties como basename.
Hola Ana,
ResponderEliminareste artículo está genial pero no consigo personalizar mis mensajes. Te comento... estoy intentando parametrizar los mensajes pero no termina de hacerlo bien. Tengo creado un fichero .properties con la siguiente línea:
javax.faces.component.UIInput.REQUIRED= Error de Validación: El campo {0} es obligatorio.
Dentro de mi jsp tengo puesto lo siguiente:
Pues bien, en lugar de mostrarme el texto: "Error de Validación: El campo código de usuario es obligatorio" me muestra: "Error de Validación: El campo user-login-form:codigoUsuario es obligatorio"
Sabes qué puede estar pasando??
Muchas gracias de antemano.
Un saludo
Elías