2011-09-09 31 views
5

Me pregunto cómo funciona la internacionalización en jsf? He leído tutorial en coreservlets.com al respecto, pero en mi caso funciona de manera ligeramente diferente. En ese tutorial dicho que tengo que utilizarInternacionalización en JSF 2.0

FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale); 

en actionListener (oyente para cambiar la configuración regional) y también copias de frijol tiene que tener propiedad getCurrentLocale() utilizarlo en <f:view> etiqueta.

Tengo 2 archivos de propiedades con mensajes (por defecto y con la configuración regional especificada), están registrados en faces-config.xml. <f:view> etiqueta Tengo solamente en una página (index.xhtml)

<f:view locale="#{bean.locale}"> 
... 
</f:view> 

También tengo 2 botones (con actionListener) para cada entorno local. En Backing Bean simplemente modifico la variable locale actual (no use getViewRoot().setLocale(newLocale)). Pero los cambios de entorno local para todas las páginas (incluso si no tienen <f:view locale="#{bean.locale}">)

Respuesta

22

Digamos que tiene dos siguientes archivos de mensajes

messages.properties 
    messages_de.properties 

Configuración de la localidad de aplicaciones
Hay tres formas de establecer la La configuración regional de la aplicación y creo que necesita la primera aquí.

1-Puede permitir que el navegador elija la configuración regional.

establecer el valor predeterminado y locales soportados en WEB-INF/faces-config.xml:

<faces-config> 
    <application> 
     <locale-config> 
     <default-locale>en</default-locale> 
     <supported-locale>de</supported-locale> 
     </locale-config> 
    </application> 
</faces-config> 

Cuando un navegador se conecta a su aplicación, por lo general incluye un valor Accept-Language en la cabecera HTTP

2-Puede configurar la configuración regional programáticamente.

Llame al método setLocale del objeto UIViewRoot:

UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot(); 
viewRoot.setLocale(new Locale("de")); 

3-Usted puede configurar el idioma para una página individual
Al utilizar el elemento f:view con un atributo, por ejemplo local:

<f:view locale="de"> 

La configuración regional se puede establecer dinámicamente:

<f:view locale="#{user.locale}"/> 


mensaje Declarar lía
Ahora que la configuración regional está establecida puede utilizar una de las dos formas siguientes para declarar el mensaje lía

1-Via enfrenta-config La forma más sencilla es suministrar un archivo llamado faces-config.XML en el directorio WEB-INF de su aplicación, con el siguiente contenido:

<?xml version="1.0"?> 
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 
    <application> 
     <resource-bundle> 
     <base-name>com.corejsf.messages</base-name> 
     <var>msgs</var> 
     </resource-bundle> 
    </application> 
</faces-config> 

2-En cada página JSF que necesita tener acceso a ella. En lugar de utilizar una declaración global paquete de recursos, se puede añadir el f: Elemento loadBundle a cada página JSF que necesita acceso al paquete, así:

<f:loadBundle basename="com.corejsf.messages" var="msgs"/> 

En cualquier caso, los mensajes en el paquete son accesible a través de una variable de mapa con el nombre msgs.

Mostrando etiqueta apropiada en el botón Ahora digamos que presentar propiedades por defecto es decir Inglés tiene la propiedad

next=Next 

y alemán tiene equivallent es decir

next=Weiter 

y ha ajustado la configuración regional y declaró mesg paquete puede acceder a él para poner la etiqueta en un botón de comando como

<h:commandButton value="#{msgs.next}"/> 

La respuesta anterior se extrae y modifica de Hortsmen Core Java Server Faces book.

+0

Me gustaría agregar algo: En el punto 3. y 2.. En lugar de hacerlo para cada página JSF, puede hacerlo en template.xhtml. – karlihnos

Cuestiones relacionadas