在我的应用程序中,我使用 java 资源包来翻译其标签。
我目前有两个文件:
- 带有英语标签的 resources.properties(默认语言)
- 带有法语标签的 resources_fr.properties
然后,我使用以下命令加载捆绑包属性:
ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale);
... 在哪里locale
是用户的区域设置。
当我使用法语网络浏览器时,没关系,我收到的所有消息都是法语,因为我的区域设置已正确设置为 fr。
但是当我将浏览器切换到美国英语时,它们仍然是法语!
The locale
变量已使用 en_US 语言环境正确设置,但getBundle
方法返回给我一个带有 fr 语言环境的包,而不是仅仅返回默认的包...
这是正常行为吗?我很惊讶,因为我期待的是英语价值观resources.properties
当语言环境没有附加特定资源包时使用(例如法语)...
这是正常的结果,如果您还没有阅读过(相当长的)描述,那么这仍然是相当令人惊讶的获取捆绑包 https://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html#getBundle-java.lang.String-java.util.Locale-java.lang.ClassLoader-小心。重要的部分是:
如果没有找到匹配的资源包,则调用默认控件的 getFallbackLocale 方法,该方法返回当前的默认区域设置。使用此区域设置生成新的候选区域设置名称序列,并再次搜索,如上所述。
这有点出乎意料。只有在尝试了除指定区域设置之外的默认区域设置之后,该方法才会执行您所期望的操作:
如果仍然没有找到结果包,则仅查找基本名称。
对于桌面应用程序来说,这是合理的行为。毕竟,如果您在给定机器默认语言环境的情况下成功启动了 Java 应用程序,那么您应该知道如何处理该应用程序(如果该应用程序使用默认语言环境而不是您指定的语言环境)。但是,如果您的应用程序是 Web 服务器,并且使用服务器的区域设置而不是您在浏览器中指定的首选项,则生成的页面可能会相当令人困惑。
处理此问题的正确方法是禁止使用后备区域设置。您可以通过指定附加参数在代码中执行此操作ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT)
, 导致
ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale,
ResourceBundle.Control.getNoFallbackControl(
ResourceBundle.Control.FORMAT_DEFAULT));
(当我多次需要这个参数时,我通常会在某个地方为附加参数定义一个常量。)这会导致您期望的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)