2012-04-25 24 views
2

我們的Wicket應用程序需要每個用戶單獨的UI語言和數字/日期格式區域設置(例如英文,數字和日期格式爲德文的UI)。Wicket應用程序中的單獨語言和格式區域設置?

如果將會話語言環境設置爲Locale.GERMAN,則會同時獲得德語數字和日期格式與德語資源(例如MyForm_de.properties)。

我們通過將會話區域設置爲數字和日期區域設置,然後使用自定義ComponentStringResourceLoader來加載字符串(返回super.loadStringResource(clazz,key,language!= null?new Locale(language):locale ,風格,變體))。但是,它看起來像字符串正在被緩存,因爲如果我以不同的用戶身份登錄,我開始混合使用各種語言。

任何人都知道控制緩存(假設是造成問題)?注意:我不想阻止緩存(因爲這可能會損害性能)。我想我想重寫緩存行爲,以便它可以正確使用我們的自定義資源加載器。

或者有沒有更好的方法來解決這個問題?

下面是我們用於自定義StringResourceLoader的代碼。

ComponentStringResourceLoader myComponentStringResourceLoader = new ComponentStringResourceLoader() { 
@Override 
public String loadStringResource(Class<?> clazz, String key, Locale locale, String style, String variation) { 
    return super.loadStringResource(clazz, key, getLoggedOnUser().getUILanguageLocale(), style, variation); 
    } 
}; 
getResourceSettings().getStringResourceLoaders().add(0, myComponentStringResourceLoader); 

以下是設置會話區域設置(用於數字和日期格式)的代碼。

getSession().setLocale(getLoggedOnUser().getNumberAndDateLocale()); 

回答

1

您可以使用會話的區域設置爲標籤的國際化,要麼重寫#getLocale()或#getConverter()用於應使用不同的區域設置日期的組件。我猜你會談論TextField,它需要在德語區域設置中呈現它的值。如果是這樣,只需創建GermanTextField,它總是在#getLocale()中返回Locale.GERMAN。

+0

感謝馬丁 - 所以如果我理解你是對的,你是說反其道而行之 - 將用戶的UI語言設置爲會話區域設置(所以我不需要搞亂資源加載器)並始終使用自定義在需要日期和格式的情況下使用用戶格式區域設置的組件。我必須嘗試一下,但我認爲你是對的,這種方式會比我嘗試的方式造成更少的麻煩。 – 2012-04-25 16:28:12

+0

好的 - 我重新編寫了代碼來使用您的建議,它完美地工作!再次感謝馬丁! – 2012-04-26 12:40:22

相關問題