2012-04-25 49 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

相关问题