Есть ли хорошая альтернатива методу gettext _ () в Java? - PullRequest
4 голосов
/ 26 ноября 2010

Это распространенный способ отделить текстовые сообщения и исходный код в C / Python / PHP / и т. Д. С помощью набора gettext .Я пытаюсь сделать нечто подобное в своем Java-проекте, согласно этой инструкции .Это самый лучший способ?Или мне стоит попробовать что-то другое и более продвинутое?

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

[...]
public String howBigIsTheFile(File f) {
  String name = f.getAbsolutePath();
  long length = f.length();
  return _("The file %s is %d bytes long", name, length);
}

Что-то вроде gettext-commons возможно?

Ответы [ 2 ]

3 голосов
/ 26 ноября 2010

Я предполагаю, что этот вопрос касается автономного приложения (командная строка, SWING и т. Д.), А не о серверном приложении (с одновременным доступом нескольких пользователей).

ВСамым простым приложением является создание одного статического класса доступа , который будет отвечать за загрузку одиночного пакета ресурсов и последующий поиск строк в этом пакете ресурсов.

Примерно так:

public class ResourceUtil {

    private static ResourceBundle rb;

    static {
        //set the default locale
        setLocale(Locale.ENGLISH);
    }

    public static void setLocale(Locale locale) {
        rb = ResourceBundle.getBundle("Resources", locale);
    }

    public static String tr(String key, Object... args) {
        return MessageFormat.format(rb.getString(key), args);
    }

}

Вы можете изменить активную локаль с помощью метода setLocale(Locale) и получить доступ к переведенным строкам с помощью метода tr(String,Object...).

Затем вы можете вызвать его изВаш класс выглядит так:

import static ResourceUtil.tr;

public String howBigIsTheFile(File f) {
  String name = f.getAbsolutePath();
  long length = f.length();
  return tr("The file %s is %d bytes long", name, length);
}

Обратите внимание на статический импорт.

Отказ от ответственности : весь предоставленный код находится на уровне псевдокода и не гарантирует компиляцию.

В зависимости от размера вашего приложения может оказаться полезным использовать Поддержка экстернализации строк IDE (например, см. Главу в Справка Eclipse JDT , я уверен, что другиеIDE хаМы также можем использовать несколько комплектов ресурсов и / или несколько статических классов - это зависит от размера вашего приложения и ваших личных предпочтений.См. этот вопрос для дальнейшего обсуждения этого вопроса.

В серверной среде, использующей статический подход, подобный описанному выше, могут возникнуть проблемы, поскольку разные пользователи будут иметь разные локали.В зависимости от среды вашего веб-приложения вы решите эту проблему по-разному (например, используйте MessageSource в Spring ).

0 голосов
/ 26 ноября 2010

Если вы думаете о I18N / L10N, у Java здесь есть свой собственный механизм: файл свойств.Вы можете увидеть пример в уроках интернационализации .Это даже проще, чем gettext:).

...