2011-01-20 21 views
5

Zaimplementowałem internacjonalizację w mojej aplikacji JSF zgodnie z opisem here.JSF setLocale nie działa poprawnie

Ale napotkałem problem: Po zmianie ustawień regionalnych wszystkie teksty na mojej stronie zmieniają się. Ale jeśli kliknę link nawigacyjny, aby przejść do innej strony, ustawienia narodowe wrócą do standardowego locale!

Myślę, że tęsknię za czymś tutaj. Więc zapewnić mój kod poniżej i nadzieję, że może pomóc:

LocaleBean.java:

@ManagedBean(name="locale") 
    @SessionScoped 
    public class LocaleBean { 

    private Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale(); 

    public Locale getLocale() { 
     return locale; 
    } 

    public void setLanguage(String language) { 
     locale = new Locale(language); 
     FacesContext.getCurrentInstance().getViewRoot().setLocale(locale); 
    } 

    public String getLanguage() { 
     return locale.getLanguage(); 
    } 
    } 

JSF część (to jest część mojego szablonu):

<h:outputText value=" #{text['common.language']}: " /> 
     <h:selectOneMenu value="#{locale.language}" onchange="submit()"> 
      <f:selectItem itemValue="de" itemLabel="Deutsch" /> 
      <f:selectItem itemValue="en" itemLabel="English" /> 
     </h:selectOneMenu> 

twarze -config.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
      <locale-config> 
       <default-locale>de</default-locale> 
       <supported-locale>en</supported-locale> 
      </locale-config> 
     <resource-bundle> 
     <base-name>org.dhbw.stg.wwi2008c.mopro.ui.text</base-name> 
     <var>text</var> 
     </resource-bundle> 
    </application> 
</faces-config> 

Ja następnie Text.java z samouczka i tylko zmieniono ścieżkę pakietu.

Oto mój katalog:

Jeśli coś ważnego brakuje poprosić o to proszę.

Odpowiedz

9

FacesContext to instancja o zasięgu żądania. więc twoja wartość byłaby ustawiona tylko dla tego konkretnego żądania.

dodać na xhtml

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

OR:

Zarejestruj się widok Handler
w twarze-config.xml

<application> 
      ... 
     <view-handler>com.yourcompany.MyLocaleViewHandler</view-handler> 

i

public class MyLocaleViewHandler extends ViewHandler { 

    private final ViewHandler base; 


    @Override 
    public Locale calculateLocale(FacesContext context) { 
     //fetch the session scoped bean and return the 
     LocaleBean bean = (LocaleBean) context.getExternalContext().getRequest().getSession().getAttribute("locale");//this line is not tested. 
     return locale; 
    } 
     //other stuff.. 


    }