2011-09-09 52 views
5

我想知道國際化如何在JSF中工作?我已閱讀coreservlets.com關於它的教程,但在我的情況下,它的工作原理略有不同。該教程中說,我必須使用JSF 2.0的國際化

FacesContext.getCurrentInstance().getViewRoot().setLocale(newLocale); 
中的ActionListener

(偵聽改變區域),也支持bean必須有物業getCurrentLocale()<f:view>標籤來使用它。

我有2個屬性文件的消息(默認和指定的區域設置),他們在faces-config.xml註冊。 <f:view>標籤我有僅在一個頁面(的index.xhtml)

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

另外我有2個按鈕(帶的ActionListener)爲每個區域設置。在支持bean中,我只需修改當前的語言環境變量(不要使用getViewRoot().setLocale(newLocale))。但對於所有頁面(即使他們沒有<f:view locale="#{bean.locale}">

回答

22

可以說,語言環境的變化你有以下兩條消息文件

messages.properties 
    messages_de.properties 

設置應用程序語言環境
有設置的三種方式應用程序語言環境,我認爲您需要第一個在這裏。

1-您可以讓瀏覽器選擇區域設置。

坐落在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> 

當瀏覽器連接到你的應用程序的默認和支持的語言環境,它通常包含在HTTP頭中的Accept-Language值

2,您可以設置編程的語言環境。

調用UIViewRoot對象的的setLocale方法:

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

3-可以設置區域設置爲單個頁面
通過使用f:view元件與locale的屬性,例如:

<f:view locale="de"> 

區域設置可以動態地設置:

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


聲明消息包現在
的區域設置,您可以使用以下兩種方法來聲明消息一個捆綁

1 - 通過面向-配置 最簡單的方法是提供一個名爲faces-config的文件。XML的應用程序的WEB-INF目錄下,其內容如下:

<?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,在需要訪問它的每個JSF頁面。 而不是使用一個全球性的資源包的聲明,你可以添加F:loadBundle元素需要訪問捆綁,這樣每個JSF頁面:

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

在這兩種情況下,被捆綁的消息通過名稱爲msgs的地圖變量訪問。

按鈕顯示相應的標籤 現在讓我們說默認的屬性文件,即英語已經財產

next=Next 

和德國有equivallent即

next=Weiter 

而且你已經設置的語言環境,並宣佈MESG捆綁您可以訪問它將標籤放在命令按鈕上,如

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

以上答案摘自Hortsmen Core Java Server Faces book

+0

我想補充一點:在3.和2.點。不要爲每個JSF頁面執行此操作,您可以在template.xhtml中進行操作。 – karlihnos