Настройки Java и интернационализация (i18n) - PullRequest
9 голосов
/ 08 апреля 2011

В руководствах по Java рекомендуется использовать API настроек поверх файлов свойств. Файлы свойств и ResourceBundles являются рекомендуемым способом обработки требований интернализации в приложениях.

Я подумываю об использовании обоих приложений для настольных компьютеров, которые будут отображать настройки в зависимости от локали.

Кто-нибудь может указать на проблемы с этим подходом?

Может быть, я просто должен использовать период Свойства файлов?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Я рассматриваю возможность использования обоих для настольного приложения, которое будет отображать предпочтения в соответствии с локалью.

ОК, так что вам нужно перевести файл конфигурации в виде:

some_translated_key=some_value

Ну, если только вы не хотите поддержать MUI в какой-то момент, это не должно иметь большого значения.Однако, если вы это сделаете, чтобы разные пользователи на одном компьютере могли использовать разные языки или пользователь мог переключать язык, у вас могут возникнуть проблемы с сопоставлением ключа со свойством.При чтении ключа вам придется сканировать все переводы, и вы наверняка получите несколько записей для одного и того же ключа.Как решить это?Что ж, это хороший вопрос.

По моему опыту, файлы конфигурации должны быть независимыми от языка (нейтральная культура) и никогда не должны редактироваться вручную (то есть перевод ключей не имеет значения).

Я думал, что может быть проблема с кодировкой символов, но следующий фрагмент кода работает без проблем (файлы в кодировке UTF-8):

public class Main {
    private static final String FILE_NAME = "i18ned.properties";
    private File propertiesFile;
    private Properties properties;

    public Main() {
        properties = new Properties();
        propertiesFile = new File(FILE_NAME);
        if (propertiesFile.exists()) {
            try {
                properties.load(new BufferedReader(new FileReader(
                        propertiesFile)));
            } catch (FileNotFoundException e) {
                // not likely, but should be logged either way
            } catch (IOException e) {
                // logger should be used instead
                e.printStackTrace();
            }
        }
    }

    public void saveProperties() {
        try {
            properties
                    .store(new BufferedWriter(new FileWriter(propertiesFile)), "");
        } catch (IOException e) {
            // oops, use logger instead
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.storeSome();
        main.readSome();
    }

    private void readSome() {
        String highAsciiKey = "żółć";
        String value = properties.getProperty(highAsciiKey);
        System.out.println(value);
    }

    private void storeSome() {
        String highAsciiKey = "żółć";
        String highAsciiValue = "łąkę";
        properties.setProperty(highAsciiKey, highAsciiValue);
        saveProperties();
    }

}
2 голосов
/ 08 апреля 2011

Использование комплекта ресурсов для локализации приложений является стандартным способом в Java.Проблемы этого способа:

  1. нет проверки времени компиляции количества и типа параметров, требуемых для ресурса.
  2. Сложно содержать файлы в чистоте, например, нетмеханизм помогает удалить неиспользуемые строки
  3. Трудно заставить все тексты переводить на все поддерживаемые языки.

и т. д.

Вероятно, лучшая интернационализацияМеханизм предложен Google в их GWT.Они генерируют класс с методом на строку.Например, если у вас есть текст Hello, {0}, он сгенерирует метод String hello(String name);

Таким образом, вы не можете передать ни 0, ни 2 аргумента этому методу.Только один.

Это частично решает и вторую проблему.Легче увидеть, если метод не используется во всем проекте.В любом случае, это не решает третью проблему.

...