java - 加载了错误的 Java 资源包

标签 java internationalization resources translation locale

在我的应用程序中,我使用 java 资源包来翻译它的标签。 我目前有两个文件:

  • 带有英文标签的 resources.properties(默认语言)
  • 带有法语标签的 resources_fr.properties

然后,我使用以下命令加载包属性:

ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME, locale);

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

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

locale 变量已正确设置为 en_US 语言环境,但 getBundle 方法返回给我一个包含 fr 语言环境的包,而不是仅返回默认包...

这是正常行为吗?我很惊讶,因为我期待在语言环境没有附加特定资源包(如法语)时使用 resources.properties 的英文值...

最佳答案

这是正常的结果,如果您没有阅读 getBundle 的(相当冗长的)描述,这仍然是相当令人惊讶的。小心。重要的部分是:

If no matching resource bundle is found, the default control's getFallbackLocale method is called, which returns the current default locale. A new sequence of candidate locale names is generated using this locale and and searched again, as above.

这有点出乎意料。只有在尝试使用默认语言环境和指定语言环境之后,该方法才会执行您期望的操作:

If still no result bundle is found, the base name alone is looked up.

这是桌面应用程序的合理行为。毕竟,如果您在给定机器默认语言环境的情况下成功启动了 Java 应用程序,那么您应该知道如果应用程序使用默认语言环境而不是您指定的语言环境出现时如何处理该应用程序。但是,如果您的应用程序是 Web 服务器,并且使用服务器的区域设置而不是您在浏览器中指定的首选项,则生成的页面可能会非常令人困惑。

处理此问题的正确方法是禁止使用后备语言环境。您可以通过指定附加参数 ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT) 在您的代码中执行此操作,从而导致

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

(当我不止一次需要它时,我通常会在某个地方为附加参数定义一个常量。)这会导致您期望的行为。

关于java - 加载了错误的 Java 资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17857712/

相关文章:

java - 为什么通过实例调用静态方法不会给 Java 编译器带来错误?

java - Spring 5 至少必须存在一个 JPA 元模型

java - Spring Boot中等待数据库连接无一异常(exception)

java - HTTP 404 Hello World JSP 在 eclipse 之外

amazon-web-services - Terraform - 它会删除现有资源 AWS

javascript - 如何在纯 JS 文件中获取 i18next.t()?

javascript - AngularJS:如何在弹出窗口 Controller 中使用翻译(i18n)?

MySQL 瑞典语排序规则和 'é'

java - 如果我的 java 测试资源比较大(超过 100MB),我应该把它们放在哪里?

resources - RDF 中的前缀命名空间