【问题标题】:Specify Java Localization File指定 Java 本地化文件
【发布时间】:2011-04-17 14:15:39
【问题描述】:

我正在尝试使用 ResourceBundle 类为我的应用程序检索特定于语言环境的文本,但遇到了一些错误。

java.lang.ClassCastException: org.project.MyClass cannot be cast to ResourceBundle

java.util.MissingResourceException: Can't find bundle for base name org.project.MyClass, locale en_US

我用来创建 ResourceBundle 的代码如下:

static final ResourceBundle i18ln = ResourceBundle.getBundle("org.project.MyClass", Locale.getDefault());

我已经搜索了大约一个小时关于如何指定资源文件的位置但没有成功。我的项目设置如下:

项目文件夹/ 源/ 组织/ 项目/ MyClass.java 测试/ 库/ 资源/ 图片/ 组织/ 项目/ MyClass.properties

我的项目结构是否与 Java ResourceBundle 不兼容?有谁知道我怎样才能让它工作?

【问题讨论】:

    标签: java localization internationalization directory-structure


    【解决方案1】:

    MyClass.java 是 ResourceBundle 的某种子类吗?我怀疑不是,因此是 ClassCastException。

    如果 MyClass 不是 ResourceBundle 类型,请尝试将 MyClass.properties 重命名为 MyResource.properties 之类的其他名称,并将 res 目录放在类路径中以找到您的资源包。确保在使用 ResourceBundle.getResource 时更改资源的名称,如下所示:

    static final ResourceBundle i18ln = ResourceBundle.getBundle("org.project.MyResource", Locale.getDefault());
    

    【讨论】:

    • 保持资源属性文件与类同名的目的是保持特定于该类的本地化文本约定。
    • 您是否按照我的建议尝试将属性文件放在类路径中?仅此一项就可以解决您的问题。
    • 我第一次阅读您的答案时没有注意到这一点。将 res 文件夹添加到类路径确实有效!谢谢。
    • 是的,很抱歉关于更改属性文件名的那一点。那 ClassCastException 让我有点吃惊。
    【解决方案2】:

    ResourceBundle 将在尝试加载属性文件之前尝试实例化一个名为org.project.MyClass 的类。曾几何时,人们将他们的代码编译成具体的类是很正常的,但现在你不再经常看到这种情况了。

    资源包的文档在the javadoc 中进行了描述。

    • 首先,它尝试使用候选包加载一个类 name. 如果可以找到这样的类 并使用指定的类加载 loader,与赋值兼容 ResourceBundle,可从 ResourceBundle,并且可以是 实例化后,getBundle 创建一个新的 此类的实例并将其用作 结果资源包。
    • 否则,getBundle 会尝试定位属性资源文件。它 从生成路径名 通过替换所有候选包名称 “。”带有“/”并附加的字符 字符串“.properties”。它试图 查找具有此名称的“资源” 使用 ClassLoader.getResource。 (笔记 是某种意义上的“资源” getResource 与 资源包的内容,它是 只是一个数据容器,例如 文件。)如果它找到一个“资源”,它 试图创造一个新的 PropertyResourceBundle 实例来自 它的内容。如果成功,这 实例成为结果资源 捆。

    如果没有结果资源包 发现,一个 MissingResourceException 是 扔了。

    按照惯例,许多项目都会为属性文件指定一个相关的包名称。例如,foo.bar 包将附带一个用于 l10n 资源的 foo.bar.nls 包。

    【讨论】:

      【解决方案3】:

      您在 res 文件夹中有 MyClass.properties。将 MyClass.properties 复制到 src 文件夹中,它应该可以工作。

      【讨论】:

      • 这不是我想要的项目设置方式。这是使 ResourceBundle 工作的唯一方法吗?
      【解决方案4】:

      当属性文件和类的大小写不匹配时,也会出现此问题。例如:MyClass.javamcyclass.properties

      这似乎是特定于平台的;在我的情况下,我能够在我的 Mac 上本地构建,但是当推送到 Team City Linux 构建代理时,构建失败并出现异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 2017-08-09
        • 2019-08-29
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多