2011-09-09 20 views
5

Zastanawiam się, jak działa internacjonalizacja w jsf? Czytałem tutorial o coreservlets.com o tym, ale w moim przypadku działa on nieco inaczej. W tym tutorialu, że muszę używaćInternacjonalizacja w JSF 2.0

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

w ActionListener (słuchacza na zmianę ustawień regionalnych), a także tworzenie kopii fasola musi mieć właściwość getCurrentLocale() do używania go w <f:view> tagu.

Mam 2 pliki właściwości z wiadomościami (domyślne i z określonymi ustawieniami regionalnymi), są one zarejestrowane w faces-config.xml. <f:view> tag mam tylko po jednej stronie (index.xhtml)

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

Również mam 2 przyciski (z ActionListener) dla każdej lokalizacji. W backingu po prostu modyfikuję bieżącą zmienną locale (nie używaj getViewRoot().setLocale(newLocale)). Ale locale zmiany dla wszystkich stron (nawet jeśli nie mają one <f:view locale="#{bean.locale}">)

Odpowiedz

22

Powiedzmy, że masz następujące dwa komunikaty pliki

messages.properties 
    messages_de.properties 

Ustawianie Locale Application
Istnieją trzy sposoby ustawiania Aplikacja Locale i myślę, że potrzebujesz pierwszej tutaj tutaj.

1-Możesz pozwolić przeglądarce wybrać ustawienia regionalne.

Ustaw domyślne i obsługiwanych lokalizacji w 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> 

Gdy przeglądarka łączy do aplikacji, to zazwyczaj zawiera wartość Accept-Language w nagłówku HTTP

2-można ustawić lokalnie programowo.

wywołać metodę setlocale obiektu UIViewRoot:

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

3-Można ustawić ustawienia regionalne dla pojedynczej strony
Wykorzystując element f:view z przykładu atrybutu, dla locale:

<f:view locale="de"> 

ustawienia regionalne mogą być dynamicznie ustawić:

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


Deklarowanie wiadomość wiązki
Teraz, Locale jest ustawiona można użyć jednego z dwóch poniższych sposobów deklarują wiadomość wiązki

1-Via faces-config Najprostszym sposobem jest dostarczyć plik o nazwie faces-config.xml w katalogu WEB-INF swojej aplikacji, o następującej treści:

<?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-Na każdym JSF strona, która potrzebuje do niego dostęp. Zamiast globalnego deklarację pakunku zasobów, można dodać f: loadBundle elementu do każdej strony JSF, który potrzebuje dostępu do pakietu, tak:

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

W obu przypadkach wiadomości w wiązce są dostępne za pośrednictwem zmiennej mapy o nazwie msgs.

Pokazuje odpowiednią etykietę przycisku Teraz powiedzmy plik właściwości domyślne czyli po angielsku ma właściwość

next=Next 

i niemiecki ma equivallent tj

next=Weiter 

i zostało ustawione locale i ogłosił mesg pakiet, do którego można uzyskać dostęp, aby umieścić etykietę na przycisku polecenia, takim jak

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

Powyżej Odpowiedź jest wyodrębniana i modyfikowana od Hortsmen Core Java Server Faces book.

+0

Chciałbym dodać coś: w punkcie 3. i 2.. Zamiast robić to dla każdej strony JSF, możesz to zrobić w template.xhtml. – karlihnos

Powiązane problemy