Java加载错误的资源

时间:2011-12-07 16:13:46

标签: java resources properties locale

我的资源文件夹中有2个属性文件: messages_hr_HR.properties messages.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;
    }
}

然后在我的GUI中,我有radiobutton菜单,其中包含可用的语言,当用户点击某些语言时,我只需拨打Messages.setLocale(clickedLanguageLocale);

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

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

有关此行为的任何想法吗?

2 个答案:

答案 0 :(得分:0)

很难猜到加载消息的顺序而不会看到整个代码。 我的猜测是,如果GUI应用程序中涉及多个线程,则会在RESOURCE_BUNDLE上发生数据争用。 GUI在加载新的RESOURCE_BUNDLE之前开始读取新的文本键。 这就是为什么他们中的一部分用英语出现而其余部分出现在克罗地亚语中。

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

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

答案 1 :(得分:0)

您是否尝试使用String getString(String key)处的断点调试导致英文消息的密钥?