2012-03-15 47 views
2

在我的XHTML頁面我已經包含了以下標籤:JSF 2.0 - 使用h切換語言環境:commandLink - 消息包不同步

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

我實現了一個語言豆:

@ManagedBean(name = "languageBean") 
@SessionScoped 
public class LanguageBean implements Serializable { 

    private static final long serialVersionUID = -4260383661321467037L; 

    ...  

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

    public String switchToDE() { 
    LOGGER.info("switching to german"); 
    Locale german = Locale.GERMAN; 
    FacesContext.getCurrentInstance().getViewRoot().setLocale(german); 
    this.locale = german; 
    return null; 
    } 

    public String switchToEN() { 
    LOGGER.info("switching to english"); 
    Locale english = Locale.ENGLISH; 
    FacesContext.getCurrentInstance().getViewRoot().setLocale(english); 
    this.locale = english; 
    return null; 
    } 

    public Locale getLocale() { 
    return locale; 
    } 

    public void setLocale(final Locale locale) { 
    this.locale = locale; 
    } 

} 

然後我想渲染commandLinks切換語言環境:

<ul> 
    <li> 
     <h:form> 
      <h:commandLink class="" action="#{languageBean.switchToDE}">Deutsch</h:commandLink> 
     </h:form> 
    </li> 
    <li> 
     <h:form> 
      <h:commandLink action="#{languageBean.switchToEN}">English</h:commandLink> 
    </h:form> 
    </li> 
</ul> 

在我的頁面有些地方我有一些產出,我渲染消息:

#{msg['message.key.1'] 

在我faces-config.xml中我已經配置:

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

現在我的問題:第一次點擊訪問切換區域設置方法,但消息包不在頁面中刷新。如果我再次點擊同一種語言,則會更新消息包。消息包查找總是比區域切換落後一步。 我怎樣才能切換語言環境與h:commandButton標記(我需要一個鏈接和風格指南不允許使用或),所以消息包查找同步?

我正在使用GF 2.1和Mojarra 2.0.9(基於Servlet API 2.5的JSF 2.0)。 歡迎任何建議。

編輯:

好吧,我發現這是我的錯的原因,我們嘗試了一些「特殊」的事情;-)

我試圖解釋什麼,我們有什麼,我們嘗試:

  • 我們正在建設我們的軟件與Maven
  • 我們已經構建TI期間SVN回購
  • 分離出不同的商業目的邏輯上不同的網絡應用我,我們集中所有的Web應用程序到一個(WAR-疊加)
  • 因此,我們必須爲每個業務旨意Web App的一個faces-config- <企業的webapp-ID > .XML註冊
  • 每個Web App有它自己的資源束名稱爲「<企業的webapp-ID >味精」
  • 註冊,我們有一個共同的web應用(框架),這使得導航項目的所有已註冊的Web應用程序
  • 每個網站都有註冊導航項的可能性。
  • 該框架現在嘗試在返回當前導航項的階段將所有資源包合併成一個大的資源包。

我發現我們的導航bean上的方法「getItems()」在觸發switchLocale方法之前調用,因此切換語言環境爲時已晚。

現在我試着詢問是否有可能使用h:commandLink或使用ah:outputLink切換語言環境,以便在「getItems()」的支持bean方法之前切換語言環境觸發?

我希望我已經解釋了我的「挑戰」,這是可以理解的。

+0

在你真正的代碼,是不是使用AJAX來切換語言?要排除一個或另一個,如果重定向回來或返回非null,該怎麼辦? (例如空字符串) – BalusC 2012-03-15 15:30:17

+0

我不使用ajax來切換語言環境。並且我返回null,因爲每個頁面都應該可以切換語言環境,因此我不知道此時的確切結果。我怎麼能重新導入到一個JSF支持bean? – Walter 2012-03-16 08:49:46

+1

執行'return「」;'而不是'return null;'強制JSF創建一個新視圖,或者執行'return viewRoot.getViewId()+「?faces-redirect = true」;'強制JSF發送一個重定向到相同的視圖。 – BalusC 2012-03-16 11:17:25

回答

1

我不知道如何以及爲什麼會導致此問題。您可以嘗試以下操作來強制JSF重新創建視圖。而不是返回操作方法null,返回一個空字符串或強制重定向到相同的視圖。

public String switchToDE() { 
    // ... 
    return ""; 
} 

public String switchToDE() { 
    // ... 
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; 
} 

無關的具體問題,如果你的環境支持EL 2.2,它會更DRY,如果你使用一個單一的操作方法這一點。例如。

public String switchLanguage(String language) { 
    // ... 
} 

<h:commandLink action="#{languageBean.switchLanguage('EN')}">English</h:commandLink> 
+0

非常感謝。正如我之前所說的那樣,重定向和getViewId()爲我做了訣竅,並且確實足夠。當你在這裏提到它時,我已經將這些東西重構成單一的方法。因爲我們在Glassfish 2.1中運行,所以我們不能使用帶有參數的EL,我添加了一個標記來首先填充所選的語言環境。 – Walter 2012-03-16 12:19:16