2015-10-22 68 views
0

在我的xpage中,我需要在頁面加載之前設置用戶定義的語言。要設置的語言被存放在一個文件在數據庫如何在X頁面中設置用戶定義的語言

所以我在beforePageLoad

var lang = getUserDoc().getItemValueString("Language") 
facesContext.getViewRoot().setLocale(new java.util.Locale(lang)); 
context.reloadPage(); 

這樣做的問題是,如果我不這樣做context.reloadPage語言未設置。

但是當加載頁面時,context.reloadPage會給出所有其他問題 我需要找到更好的方法。

有無論如何,我可以在不重新加載頁面的情況下設置頁面的語言。

+0

我我看來是沒有辦法來設置頁面的語言無需重新加載它。你對這個解決方案有什麼樣的其他問題? –

+0

解釋有點複雜。在頁面超時後或者重建應用程序後,用戶會遇到奇怪的重新加載問題。它造成服務器的大量命中。 –

回答

1

希望我已經正確地得到它,只是在這裏延長我的答案,每Henrik的解決方案(基於最後的評論),用於設置資源包正確或許你可以只是計算它?像這樣?

<xp:this.resources> 
     <xp:bundle var="application"> 
      <xp:this.src><![CDATA[#{javascript:if(context.getLocale()=="en_US") 
return "/application.properties"; 
else 
return "/application_de.properties";}]]></xp:this.src> 
     </xp:bundle> 
    </xp:this.resources> 

我剛剛在這裏使用了上下文變量,但我確信文檔變量也可以訪問。

希望這會有所幫助。

+0

非常感謝秦丹,不明白爲什麼我沒有想過這個!似乎工作得很好,可能是我翻譯問題的答案。我會再做一些測試,再次感謝 –

+0

很高興它有幫助,實際上很容易錯過,因爲XPages在「所有屬性」中隱藏了計算的東西,而不是直接顯示它可以在資源選項卡下計算。 –

1

問題是beforePageLoad運行得太晚 - 組件已使用相關語言加載到組件樹中。

如果您使用ViewHandler,如Jesse Gallagher在OpenNTF上的Scaffolding框架中,它可能會有效。但在撥打super.createView()之前,您肯定需要確定語言。

要使用beforePageLoad,我想你會隨後需要通過控制迭代和修改標籤等等

+0

Sven的代碼在設置語言的'ViewHandler'中不起作用,因爲'UIViewRoot'只能通過調用'super'來創建。createView()',但是在調用之前需要設置語言。關鍵是要弄清楚它從哪裏獲取該語言環境 - 它必須保存在會話範圍內的某個地方,否則你會在每個視圖上默認使用應用程序的默認語言。 –

1

設置一個階段偵聽器將根據用戶的配置相應的語言環境。

見斯文哈塞爾巴赫這篇博客瞭解更多詳情:http://hasselba.ch/blog/?p=649

我在使用基於從斯文的做法下一階段監聽器的幾個應用程序這種做法。該代碼讀取用戶豆的語言環境:

public class LocalizationSetter implements PhaseListener { 

    private static final long serialVersionUID = -1L; 

    public void afterPhase(PhaseEvent event) { 
    } 

    public void beforePhase(PhaseEvent event) { 
     FacesContext facesContext = event.getFacesContext(); 
     UIViewRoot view = facesContext.getViewRoot(); 
     view.setLocale(User.get().getLocale()); 
    } 

    public PhaseId getPhaseId() { 
     return PhaseId.RENDER_RESPONSE; 
    } 
} 
+0

看起來不錯!但是,來自Sven的示例仍然需要重新加載頁面,我需要頁面在加載頁面時設置正確的語言。 –

+0

不需要重新加載。這是一個階段監聽器,在加載過程中進行。我使用這種方法根據配置爲匿名用戶設置默認語言,並根據用戶偏好設置語言。 –

+0

你在哪裏設置會話變量,在beforePageLoad?在Svens上的最後一個帖子是: 更改語言後需要全面更新! –

2

本文檔建議使用context.setLocale/setLocaleString而不是viewRoot.setLocale。優點是上下文語言環境用於瀏覽器會話的其餘部分。在加載任何後續viewRoot時,上下文語言環境將設置爲viewRoot語言環境,因此您不必爲每個頁面重新設置語言環境。儘管如此,它仍然需要一個context.reloadPage作爲當前的viewRoot,所以它不完全是你所要求的。

的文檔是: Locale use in XPages: Programmatically setting the locale

相關問題