Ir al contenido principal

JSF 2.0: Message bundles

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
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 web
Y 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

Comentarios

  1. Hola Ana,
    me 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

    ResponderEliminar
  2. Hola Luca,
    si 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.

    ResponderEliminar
  3. Hola Ana,
    este 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

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Leer un fichero properties con java.util.Properties

Los ficheros .properties son simples ficheros de texto que se suelen utilizar para guardar parámetros de configuración, en forma de pares clave-valor. Ejemplo de fichero: configuration.properties #User parameters user.name=Ana user.language=spanish Si estamos usando Java, podemos utilizar la clase java.util.Properties para leer los parámetros de este fichero: private static final String USER_NAME = "user.name"; private static final String USER_LANGUAGE = "user.language"; public void showProperties() throws Exception { Properties p = new Properties(); InputStream is = App.class.getResourceAsStream("/configuration.properties"); p.load(is); is.close(); String userName = p.getProperty(USER_NAME); String userCountry = p.getProperty(USER_LANGUAGE); System.out.println("userName: "+userName); System.out.println("userLanguage: "+userCountry); } Después de ejecutar este método, obtendríamos la siguiente salida: ...

JSF 2.0: Managed Beans (III)

Anteriormente ya hemos visto que cuando se declara un bean, tenemos que darle un scope: application, session, view, request, none. Un scope es un mapeo entre nombres y objetos que se almacena durante un determinado periodo de tiempo. En este post vamos a explicar cada uno de ellos. Si declaramos el bean desde el fichero faces-config.xml, indicamos el scope en <managed-bean-scope> y si queremos hacerlo con anotaciones, utilizaremos @{Application,Session,View,Request,None}Scoped Application Con este scope, se guarda la información durante toda la vida de la aplicación web, independientemente de todas las peticiones y sesiones que se realicen. Este bean se instancia con la primera petición a la aplicación y desaparece cuando la aplicación web se elimina del servidor. Si queremos que el bean se instancie antes de que se muestre la primera página de la aplicación, usamos la propiedad eager a true. @ManagedBean(eager=true) ó <managed-bean eager="true"> Session...