2013-07-25 25 views
3

在我的应用程序中,我使用java资源包来翻译其标签。 我目前有两个文件:英语加载了错误的Java资源包

  • resources.properties用标签(默认语言)
  • resources_fr.properties与标签在法国

然后,我用下面的加载包的属性命令:

ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale); 

...其中locale是用户的语言环境。

当我使用法语网络浏览器工作时,没关系,我用法语收到了所有消息,因为我的语言环境正确设置为fr。 但是,当我将浏览器切换到英语美国时,他们仍然是法语!

locale变量的设置是否正确与en_US区域设置,但getBundle方法返回我与FR语言环境,而不是仅仅返回默认包捆...

它是一个正常的行为?我很惊讶,因为我期待的resources.properties英语值时,该区域具有连接到它(如法国)没有具体的资源包使用...

+0

您是否尝试设置英文区域设置? – Lenymm

+2

好吧,我想通过这种方法会发生什么: - 首先,检查提供的区域设置(“en_US”和“en”)的捆绑 - 如果它们不可用,系统的默认区域设置(这里是法文) - 最后,如果没有找到,则使用带有基本名称(即没有任何语言或国家代码)的包文件 因此,即使我可以保留我的'resources.properties'文件作为默认文件,我应该将其复制到'resources_en.properties'文件以避免使用系统区域设置(fr)。 –

+0

很好的工作,找出自己。如果您还有其他问题,请务必阅读下面的链接。 – Lenymm

回答

0

这可能有助于澄清你的问题:

http://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html

这些语言环境的对象应该与 前两个步骤中创建的属性文件。例如,Locale.FRENCH对象对应于LabelsBundle_fr.properties文件的 。 Locale.ENGLISH没有匹配LabelsBundle_en.properties文件的 ,所以默认文件将使用 。

1

这是正常的结果,如果您还没有仔细阅读(相当长的)getBundle的描述,这是非常令人惊讶的。重要的部分是:

如果找不到匹配的资源包,则调用默认控件的getFallbackLocale方法,该方法返回当前的默认语言环境。使用此语言环境生成候选语言环境名称的新序列,然后再次搜索,如上所述。

这有点意外。只有在使用默认区域设置和指定区域设置之后,该方法才会执行您期望的操作:

如果仍未找到任何结果数据包,则只查找基本名称。

这是桌面应用程序的合理行为。毕竟,如果您已经成功地启动了一个Java应用程序,并指定了该计算机的默认语言环境,那么您应该知道如何使用默认语言环境而不是您指定的语言环境来处理该应用程序。但是,如果您的应用程序是一个Web服务器,并且使用了服务器的语言环境而不是您在浏览器中指定的首选项,则生成的页面可能是一个难题。

处理此问题的正确方法是禁止使用备用区域设置。你可以通过指定额外的参数ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT),导致

ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale, 
    ResourceBundle.Control.getNoFallbackControl(
     ResourceBundle.Control.FORMAT_DEFAULT)); 

做到这一点在你的代码(我通常会定义一个常数附加参数的地方,当我需要不止一次这样了。)这将导致以下行为:如果您期待着。