Каковы лучшие практики для интернационализации настольного приложения Java Swing? - PullRequest
6 голосов
/ 23 июля 2010

Я уверен, что есть много методов, но какой рекомендуемый способ сделать это, который имеет минимальное влияние на ваш код?

Очевидно, что вы создаете файлы свойств, но как поменять значения при рендеринге?В J2EE вы всегда просто перерисовываете всю страницу, так что это легко.Но в приложениях Swing вы просто добавляете код для .getProperty () в метод paintComponent (Graphics g)?

Если это так, разве это не кажется тяжелым, поскольку теперь вам придется переопределять этот метод везде, где раньше вам не нужно было ...

Дополнительно: Как настроить систему уведомлений для повторного рендеринга всех видимых в настоящее время компонентов, не применяя какой-либо шаблон регистрации?

Я предполагаю, если я перезаписываю paintComponent (Graphics g) всенужно вызвать событие, что-то изменилось, и будет вызван метод paintComponent (Graphics g) ...

Ответы [ 5 ]

3 голосов
/ 27 июля 2010

Насколько я знаю, некоторые приложения используют компоновщик / компонент builders (по совету Карстена Ленцша и части JGoodies API).Эти компоновщики включают код для локализации компонентов (используя ResourceBundle под капотом).

Другие люди (включая меня) предпочитают внедрение ресурсов ;обычно это наименее навязчивый метод.Это путь, выбранный Swing Application Framework (JSR-296) и другими структурами GUI, такими как Guts-GUI .

Вы также можете посмотретьна этот вопрос , который очень похож на ваш.

Что касается изменений языка "на лету" (Locale уведомление об изменении), я думаю, что это легче реализовать при использовании внедрения ресурсов(Я уже реализовал это в Guts-GUI, Swing Application Framework может также иметь его, но я не уверен в этом).

Java не предлагает способа прослушать изменения Locale, поэтому вам нужно создатьу вас есть «служба локали» (к которой должен быть адресован любой запрос на смену локали).В этом сервисе вам нужно будет перечислить все видимые окна (это возможно с Window.getWindows(), нет необходимости регистрировать видимые компоненты раньше), а затем снова внедрить ресурсы.

Если вам нужен пример, посмотритев пакете resource в исходный код GUTS-GUI :

  • ResourceInjector показывает внедрение ресурсов и метод для изменения Locale, который отправляет уведомлениесобытие (для этого используется шина событий , но простые слушатели тоже подойдут) об этом изменении
  • WindowController прослушивает события изменения локали

Интересный код для обновления всех видимых окон скопирован ниже:

for (Window window: Window.getWindows())
{
    if (window.isVisible())
    {
        injectResources(window);
        window.repaint();
        if (window instanceof RootPaneContainer)
        {
            ((RootPaneContainer) window).getRootPane().revalidate();
        }
    }
}
1 голос
/ 26 ноября 2012

Единственное решение, которое я придумал, - это создать огромный реестр всех компонентов, которые необходимо будет перерисовать. Затем, если сделан вызов для переключения Locale, вы можете просто вызвать реестр, и он пройдет через все зарегистрированные компоненты и скорректирует их значения. Так, например, для всех зарегистрированных JLabels он будет делать что-то вроде

for(JLabel specificJLabel : REGISTRY.registeredJLabels)
{
  String localeKey = specificJLabel.getActionCommand();
  specificJLabel.setText(ResourceBundle.getString(localeKey)); 
}

где ключ Locale хранится в компонентах ActionCommand. Тогда какой бы экран в данный момент не отображался, основная родительская панель отвечает за его повторную визуализацию. Таким образом, реестру не нужно управлять ключами Locale, они полностью отделены от реестра. Каждый компонент отвечает за управление своими собственными языковыми ключами в ResourceBundle.

1 голос
/ 10 ноября 2011

Java 6 SE позволяет перезагрузить пакеты ресурсов на лету.Просто вызовите статическую функцию clearCache() класса ResourceBundle.Затем снова вызовите getBundle ().

См. эту статью в разделе Cache Controls

1 голос
/ 24 июля 2010

Поддержка динамических изменений языка - сложная проблема. Самое простое решение - организовать ваш пользовательский интерфейс таким образом, чтобы вы могли воссоздать любые видимые панели. Это избавляет от необходимости регистрировать или обновлять компоненты, когда язык меняется, вы просто воссоздаете представление.

Очевидно, что вы теряете состояние всех видимых компонентов, что может быть проблемой, но обычно это то же самое в веб-приложении при обновлении страницы.

0 голосов
/ 24 июля 2010

Вам нужен ResourceBundle, который позволяет вам иметь файл свойств, основанный на Locale, к которому вы просто обращаетесь, как файл свойств.

Вот пример того, как это сделать

...