如何根据用户所属的国家/地区设置区域设置值

时间:2012-04-30 10:37:14

标签: java internationalization

目前,我的J2EE应用程序支持以下国家/地区

MessagesBundle_en_GB.properties (United Kingdom )
MessagesBundle_en_US.properties (United States )
MessagesBundle_it_IT.properties (Italy )
MessagesBundle_pt_BR.properties (Brazil )
MessagesBundle_sv_SE .properties (Sweden)

因此,我为上述所有国家/地区制作了属性文件,并在其中定义了键值对。 我正在使用Resource Bundle来实现这个概念。

我将以这种方式访问​​密钥名称

bundle.getString("userName"));
bundle.getString("Mobile"));

现在我的问题是,

如何在JSP页面中设置Locale值,因为用户可能属于上述任何国家/地区

请让我知道,非常感谢

//这个是硬编码的,我怎样才能动态设置?

ResourceBundle bundle = ResourceBundle.getBundle("MessagesBundle", Locale.UK);

3 个答案:

答案 0 :(得分:1)

使用ResourceBundle.getBundle(BUNDLE_NAME).getString(key);访问字符串。

更新默认区域设置时,例如通过Locale.setDefault(<REQUIRED_LOCALE>);清除Resourcebundle缓存:ResourceBundle.clearCache();

ResourceBundle.getBundle(BUNDLE_NAME).getString(key);的下一次调用应该返回所选区域设置的本地化字符串。

答案 1 :(得分:0)

最简单的方法是实施HttpFilter。在web.xml中将其称为示例LocaleHttpFilter . It should be mapped to / *`,因此每次请求到达您的应用程序时都会调用它。

过滤器会发现您的请求并决定当前的区域设置。它可能基于URL参数,HTTP标头,GeoIP查找等做出决定。一旦确定了它应该调用的语言环境:

Locale.setDefault(locale)

然后你可以使用

ResourceBundle.getBundle("MessageBundle").getString("hello");

代码中的任何位置。此行将根据设置到过滤器中的当前区域设置返回字符串"hello"的值。

答案 2 :(得分:0)

首先要做的是:您可以在 后端 代码中使用ResourceBundle.getBundle(Locale)。但是,您应该 从不 直接在JSP页面中使用它。您应该use JSTL代替。现在,让我们详细介绍。

有两个原因导致没有必要直接使用ResourceBundle。一个与此相关:

<% 
try {
  ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
} catch (MissingResourceException mre) {
   // LOG THIS!
}
%>

这看起来很难看,不是吗?那是因为如果没有您要查找的基本名称的捆绑包,您必须要小心MissingResourceException。更糟糕的是,如果给定方案中没有密钥,则可能抛出相同的异常:

rb.getString("key");

所以你还需要考虑到这一点:

<% 
try {
  rb.getString("key");
} catch (MissingResourceException mre) {
   // LOG THIS!
}
%>

外观如何? 当然,您可以从ResourceBundle派生并覆盖这些方法,这样它们就不会抛出异常,但这远远不止于此:

<fmt:setLocale value="fr_CA" scope="session"/>
<fmt:bundle basename="com.taglib.weblog.Greeting">
<fmt:message key="com.taglib.weblog.Greeting.greeting">

这就是你应该在JSP中使用JSTL的原因。在this article中了解有关如何在i18n中使用JSTL的更多信息。

现在,您最初的问题是语言协商(W3C术语),或者您喜欢的区域设置检测。如何在JSP应用程序中执行此操作? 最简单和最典型的方案是读取HTTP的Accept-Language标头的内容。在Java Servlet世界中,这意味着调用ServletRequest's getLocale()getLocales()方法并分配给HttpSession对象中的变量,该变量可从JSP页面访问。如果您想知道如何在servlet端访问HttpSession,那么有getSession()方法。

如果您可以直接访问Servlet,那么该方法很有效。如果您不需要创建(或分配现有的)Locale过滤器,它将为您完成所有这些操作。如您所想,这是相当常见的情况。这就是人们已经写过(很久以前)必要课程的原因。你可以在很少的框架中找到,让我特别提到Spring Framework 我知道这可能听起来很奇怪,但是如果你正在寻找简单的解决方案,那么学习和使用常见的Web框架(即Spring MVC)会更好地重新发明轮子。我知道学习曲线可能有点陡峭,但值得。