2011-04-10 85 views
2

我試圖做一個JSF重新加載區域(在視圖中定義)刷新頁面加載新的語言環境

<f:view locale="#{admin.userLocale}"> 
    <h:commandButton image="images/ukflag.gif" action="#{admin.returnToEnglish}" immediate="true" onclick="window.location.reload()" /> 
    <h:commandButton value="1" action="#{admin.returnToEnglish}" immediate="true" onclick="window.location.reload()" /> 
    <h:commandButton value="2" action="#{admin.returnToEnglish}" immediate="true" onclick="history.go(0)" /> 
    <h:commandButton value="3" action="#{admin.returnToEnglish}" immediate="true" onclick="window.location.href=window.location.href" /> 
    <h:commandLink value="4"> 
     <a4j:support event="onclick" reRender="GeneralConfigForm" action="#{admin.returnToEnglish}" /> 
    </h:commandLink> 
</f:view> 

我嘗試了所有的上述按鈕。 他們都做同樣的事情 - 他們調用方法更改語言環境,頁面重新加載,但新的語言環境標籤未正確加載。 此時,如果我再次重新載入更改,並且語言環境顯示正確。

如何讓按鈕更早地更新本地,以便頁面在顯示時顯示新的區域設置?

謝謝!

P.S - 在JSF 1.2

回答

5

我不知道如何得到它刷新後工作。 #{admin.userLocale}是否存儲在請求範圍而不是會話範圍中?前四個按鈕根本不會調用任何JSF操作。 onclick中的JS函數首先被執行,它會更改當前頁面,因此默認操作會被完全中止。第五個似乎是唯一的應該工作,雖然<h:form>缺少所有這些按鈕,但我敢打賭,這只是代碼示例的簡單化。

無論如何,通常的做法是將用戶指定的語言環境存儲在會話範圍中。當您想通過JSF操作方法更改它時,則需要事後發送重定向,以便使用所需的區域設置創建新視圖。否則,最初的語言環境的確會在響應中使用,因此你必須

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

的操作方法來改變自己的觀點。