8

我正在测试 Java 的 i18n 功能并遇到问题,当语言文件不在类根目录中时,我无法加载它。现在我的文件在/lang目录中。

在 SO 中查看了几个答案,将其放在classes子目录中并加载它lang.Messages,使用完整的位置路由/Test/lang/Message(测试是项目名称),使用只是/lang/Message并且仍然得到:

java.util.MissingResourceException: Can't find bundle for base name

错误。

还有什么要尝试的吗?

我的文件结构是:

Test/lang/Messages_es.properties

Test/src/test/Main.java

import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.JFrame;

public class Main {

     public static void main(String[] args) {

    Locale currentLocale;
    ResourceBundle messages;

    currentLocale = new Locale("es");

    messages = ResourceBundle.getBundle("Messages", currentLocale);
    System.out.println(messages.getString("Messagesgreetings"));
    System.out.println(messages.getString("Messagesinquiry"));
    System.out.println(messages.getString("Messagesfarewell"));
    }
}
4

1 回答 1

8

您需要在属性文件名中包含您的语言环境名称。

将您的属性文件重命名为Messages_es.properties

由于您没有声明任何包,因此您编译的类文件和属性文件都可以在同一个根目录中。

编辑回应评论:

假设你有这个项目结构:

test\src\foo\Main.javafoo是包名)

test\bin\foo\Main.class

test\bin\resources\Messages_es.properties(属性文件位于resources类路径的文件夹中)

您可以使用以下命令运行它:

c:\test>java -classpath .\bin foo.Main

更新的源代码:

package foo;
import java.util.Locale; 
import java.util.ResourceBundle;
import javax.swing.JFrame;

public class Main {

  public static void main(String[] args) {

    Locale currentLocale;
    ResourceBundle messages;

    currentLocale = new Locale("es");

    messages = ResourceBundle.getBundle("resources.Messages", currentLocale);
    System.out.println(messages.getString("Messagesgreetings"));
    System.out.println(messages.getString("Messagesinquiry"));
    System.out.println(messages.getString("Messagesfarewell"));
  }
}

如您所见,我们正在加载名称为“resources.Messages”的属性文件

希望这可以帮助。

于 2010-08-01T18:36:15.167 回答