Internacionalización en JSF, ¿cuándo usar el paquete de mensajes y el paquete de recursos?

84

¿Cuándo y cómo debo utilizar las etiquetas <resource-bundle>y <message-bundle>para la localización en faces-config.xml? Las diferencias entre esos dos no son muy claras para mí.

jsfQ
fuente

Respuestas:

148

<paquete de mensajes>

Se <message-bundle>debe usar siempre que desee anular los mensajes de error / advertencia predeterminados de JSF que han sido utilizados por la validación / conversión de JSF. Puede encontrar claves de los mensajes de error / advertencia predeterminados en el capítulo 2.5.2.4 de la especificación JSF .

Por ejemplo, Messages_xx_XX.propertiesarchivos en el com.example.i18npaquete como se muestra a continuación, que anula el required="true"mensaje predeterminado :

com/example/i18n/Messages_en.properties

javax.faces.component.UIInput.REQUIRED = {0}: This field is required

com/example/i18n/Messages_nl.properties

javax.faces.component.UIInput.REQUIRED = {0}: Dit veld is vereist

se puede configurar de la siguiente manera (sin el especificador de configuración regional _xx_XXy la extensión del archivo):

<message-bundle>com.example.i18n.Messages</message-bundle>

<paquete de recursos>

Se <resource-bundle>debe usar siempre que desee registrar un paquete de recursos localizado que esté disponible en toda la aplicación JSF sin la necesidad de especificar <f:loadBundle>en cada vista.

Por ejemplo, Text_xx_XX.propertiesarchivos en el com.example.i18npaquete como se muestra a continuación:

com/example/i18n/Text_en.properties

main.title = Title of main page
main.head1 = Top heading of main page
main.form1.input1.label = Label of input1 of form1 of main page

com/example/i18n/Text_nl.properties

main.title = Titel van hoofd pagina
main.head1 = Bovenste kop van hoofd pagina
main.form1.input1.label = Label van input1 van form1 van hoofd pagina

se puede configurar de la siguiente manera (sin el especificador de configuración regional _xx_XXy la extensión del archivo):

<resource-bundle>
    <base-name>com.example.i18n.Text</base-name>
    <var>text</var>
</resource-bundle>

y utilizarse de la main.xhtmlsiguiente manera:

<h:head>
    <title>#{text['main.title']}</title>
</h:head>
<h:body>
    <h1 id="head1">#{text['main.head1']}</h1>
    <h:form id="form1">
        <h:outputLabel for="input1" value="#{text['main.form1.input1.label']}" />
        <h:inputText id="input1" label="#{text['main.form1.input1.label']}" />
    </h:form>
</h:body>

ValidationMessages (Validación de Bean JSR303)

Desde Java EE 6 / JSF 2, hay también la nueva API JSR303 Bean Validation que está representado por aquellos @NotNull, Size, @Max, etc anotaciones del javax.validation.constraintspaquete. Debe comprender que esta API no tiene ninguna relación con JSF. No es parte de JSF, pero JSF simplemente tiene soporte durante la fase de validación. Es decir, determina y reconoce la presencia de una implementación JSR303 (por ejemplo, Hibernate Validator) y luego le delega la validación (que se puede deshabilitar usando <f:validateBean disabled="true"/>, por cierto).

Según el capítulo 4.3.1.1 de la especificación JSR303 , el archivo de mensajes de validación JSR303 personalizado debe tener exactamente el nombre ValidationMessages_xx_XX.propertiesy debe colocarse en la raíz de la ruta de clase (por lo tanto, ¡no en un paquete!).


Localización

En los ejemplos anteriores, _xx_XXen el nombre del archivo representa el idioma (opcional) y los códigos de país. Si esto está completamente ausente, se convierte en el paquete predeterminado (de reserva). Si el idioma está presente, por ejemplo _en, se usará cuando el cliente haya solicitado explícitamente este idioma en el Accept-Languageencabezado de la solicitud HTTP. Lo mismo se aplica al país, por ejemplo, _en_USo _en_GB.

Puede especificar las configuraciones regionales admitidas para el mensaje y el paquete de recursos de forma genérica en el <locale-config>elemento de faces-config.xml.

<locale-config>
    <default-locale>en</default-locale>
    <supported-locale>nl</supported-locale>
    <supported-locale>de</supported-locale>
    <supported-locale>es</supported-locale>
    <supported-locale>fr</supported-locale>
</locale-config>

La configuración regional deseada debe establecerse mediante <f:view locale>. Consulte también Localización en JSF, cómo recordar la configuración regional seleccionada por sesión en lugar de por solicitud / vista .

BalusC
fuente
1
Hola Balus C, ¿podemos usar varios <message-bundle> y cómo llamarlo desde Java Bean?
T8Z
Se debe prestar especial atención a la estructura de la carpeta cuando se utiliza <resource-bundle>. Si dice que tiene lo siguiente en faces-config.xml <resource-bundle> <base-name> org.abc.def.messages </base-name> <var> msg </var> </resource-bundle> entonces todos los message.properties, message_es.properties, message_de.properties deben estar en la carpeta 'src / main / resources / org / abc / def' solamente. es decir, no cree una carpeta 'mensajes' en la carpeta 'def'. Hasta que 'def' es lo que el paquete de recursos espera donde espera encontrar todos los archivos messages_xx.properties.
Rahul Saini