Java加载了错误的资源

Java加载了错误的资源,java,resources,properties,locale,Java,Resources,Properties,Locale,我的资源文件夹中有这2个属性文件: 消息\u hr\u hr.properties和消息.properties 我不使用javas的Locale类,而是使用我的自定义Locale类: public class Locale { private String bundleName; private String localeName; private String iconPath; public Locale(String bundleName, String

我的资源文件夹中有这2个属性文件: 消息\u hr\u hr.properties消息.properties

我不使用javas的Locale类,而是使用我的自定义Locale类:

public class Locale {

    private String bundleName;
    private String localeName;
    private String iconPath;

    public Locale(String bundleName, String localeName, String iconPath) {
        super();

        this.bundleName = bundleName;
        this.localeName = localeName;
        this.iconPath = iconPath;
    }

    public String getBundleName() {
        return bundleName;
    }
    public void setBundleName(String bundleName) {
        this.bundleName = bundleName;
    }
    public String getLocaleName() {
        return localeName;
    }
    public void setLocaleName(String localeName) {
        this.localeName = localeName;
    }

    public String getIconPath() {
        return iconPath;
    }

    public void setIconPath(String iconPath) {
        this.iconPath = iconPath;
    }
}
我让Messages类使用静态方法返回键的值:

public class Messages {

    private Messages() {
        // do not instantiate
    }


    private static List<Locale> availableLocales;
    private static Locale defaultLocale = new Locale("messages.messages", "EN", "/images/icons/locale/en.png");
    static {
        availableLocales = new ArrayList<Locale>();

        availableLocales.add(defaultLocale);
        availableLocales.add(new Locale("messages.messages_hr_HR", "HR", "/images/icons/locale/hr.png"));   
    }

    private static Locale LOCALE = defaultLocale;
    private static ResourceBundle RESOURCE_BUNDLE = loadBundle();
    private static ResourceBundle loadBundle() {
        return ResourceBundle.getBundle(LOCALE.getBundleName());
    }

    public static String getString(String key) {
        try {
            ResourceBundle bundle = RESOURCE_BUNDLE == null ? loadBundle() : RESOURCE_BUNDLE;
            return bundle.getString(key);
        } catch (MissingResourceException e) {
            return "!" + key + "!";
        }
    }

    public static void setLocale(Locale locale) {
        LOCALE = locale;
        RESOURCE_BUNDLE = loadBundle();
    }

    public static Locale getLocale() {
        return LOCALE;
    }
    public static List<Locale> getAvailableLocales() {

        return availableLocales;
    }
}
公共类消息{
私人消息(){
//不要实例化
}
可用的私有静态列表;
private static Locale defaultLocale=new Locale(“messages.messages”、“EN”、“/images/icons/Locale/EN.png”);
静止的{
availableLocales=new ArrayList();
添加(默认语言环境);
添加(新的区域设置(“messages.messages\hr\u hr”、“hr”、“/images/icons/Locale/hr.png”);
}
私有静态语言环境=默认语言环境;
私有静态ResourceBundle RESOURCE_BUNDLE=loadBundle();
私有静态ResourceBundle loadBundle(){
返回ResourceBundle.getBundle(LOCALE.getBundleName());
}
公共静态字符串getString(字符串键){
试一试{
ResourceBundle bundle=RESOURCE\u bundle==null?loadBundle():资源\u bundle;
返回bundle.getString(键);
}捕获(丢失资源异常e){
返回“!”+键+“!”;
}
}
公共静态void setLocale(区域设置){
语言环境=语言环境;
资源_BUNDLE=loadBundle();
}
公共静态区域设置getLocale(){
返回区域设置;
}
公共静态列表getAvailableLocales(){
返回可用的日历;
}
}
然后,在我的GUI中,我有可用语言的radiobutton菜单,当用户单击一些时,我只调用
Messages.setLocale(clickedLanguageLocale)

所以您可以看到,我负责加载特定的文件,而不是java

问题是,在某些计算机上,它的行为很奇怪。有些文字是英文(messages.properties),有些文字是克罗地亚文(messages\u hr\u hr)。我首先想到的是一些操作系统默认的语言环境,但它没有任何意义,因为我使用我的类


对于这种行为有什么想法吗?

如果没有看到完整的代码,很难猜测消息的加载顺序。 我猜想,如果GUI应用程序中涉及多个线程,那么在资源束上就会出现数据竞争。 GUI在加载新的资源包之前开始读取新的文本键。 这就是为什么其中一部分用英语出现,而其余用克罗地亚语出现的原因

编辑:这是实际的解决方案,如下面的评论所述:


此外,您还可以使用此版本的getBundle()docs.oracle.com/javase/6/docs/api/java/util/…显式传递您要使用的区域设置。

您是否尝试过在
String getString(String key)
处使用断点调试生成英文消息的键?

Hmm,可能是因为这些静态加载?但我认为这不是问题所在,因为GUI必须加载才能选择我想要的语言。所以,如果GUI被加载,资源也会被加载。然后在GUI类中,我在该单选按钮组上有一个侦听器:
localeMenuItem.addActionListener(新ActionListener(){@Override public void actionPerformed(ActionEvent e){Messages.setLocale(locale);setTringValue();})我设置了新的区域设置。嗯,看起来您使用的是默认的getBundle(),这可能是一个问题。请阅读以下文档:。getBundle()将在用户系统中使用默认的java.util.Locale,而不一定是您在Locale类中提到的默认值。这可能就是问题所在。如何加载具有其名称的捆绑包?但另一件奇怪的事情是,locale类中不存在HR语言环境,并且不知何故,
getBundle()
方法决定将其作为默认值。您可以使用java.util.locale.getAvailableCales()来查找用户系统中支持的语言环境。此外,您还可以使用此版本的getBundle()显式传递要使用的区域设置。问题是,在我的计算机上,它的行为正常。其他计算机都在我的学院(我的教授),所以我不能直接去那里安装Eclipse来调试:S