Java загружает неверный ресурс - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть 2 файла свойств в моей папке ресурсов: messages_hr_HR.properties и messages.properties

Я не использую класс Locale javas, я использую мойПользовательский класс 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;
    }
}

Затем в моем графическом интерфейсе у меня есть меню переключателя с доступными языками и когдапользователь нажимает на некоторые, которые я просто называю Messages.setLocale(clickedLanguageLocale);

Итак, вы можете видеть, что я отвечаю за загрузку определенного файла, а не Java.

Проблема в том, что на некоторых компьютерах это действует странно.Часть текста написана на английском языке (messages.properties), а часть - на хорватском (messages_hr_HR).Первое, что мне пришло в голову, это какая-то локаль по умолчанию для ОС, но это не имеет никакого смысла, так как я использую свои классы.

Есть идеи для такого поведения?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Вы пытались отлаживать с точкой останова на String getString(String key) для ключей, которые приводят к сообщениям на английском языке?

0 голосов
/ 07 декабря 2011

Трудно угадать порядок загрузки сообщений, не видя весь код. Я предполагаю, что существует гонка данных на RESOURCE_BUNDLE, если в приложении с графическим интерфейсом участвуют несколько потоков. Графический интерфейс начинает чтение новых текстовых клавиш до того, как будет загружен новый RESOURCE_BUNDLE. Вот почему часть из них отображается на английском языке, а часть на хорватском.

Редактировать: это оказалось реальным решением, как отмечено в комментарии ниже:

Кроме того, вы можете использовать эту версию getBundle () docs.oracle.com/javase/6/docs/api/java/util/…, чтобы явно передать локаль, которую вы хотите использовать.

...