Изменение локали во время выполнения в Swing - PullRequest
20 голосов
/ 05 марта 2009

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

Можно ли это сделать без настройки компонентов Swing или создания UIDelegates для всех компонентов, которые обрабатывают рендеринг локализованного текста?

Если нет, то какое хорошее решение я могу рассмотреть для реализации?

Ответы [ 5 ]

18 голосов
/ 01 марта 2011

используйте ResourceBundle.getBundle(BUNDLE_NAME).getString(key); для доступа к строкам.

при обновлении локали по умолчанию, например через Locale.setDefault(Locale.GERMAN); очистить кэш Resourcebundle: ResourceBundle.clearCache();

следующий вызов ResourceBundle.getBundle(BUNDLE_NAME).getString(key); должен вернуть локализованную строку выбранной локали.

13 голосов
/ 04 мая 2009
  1. У вас есть метод, который используется для изменения локали приложения (и, возможно, для сохранения нового значения), а другой - для получения локализованных строк.

  2. Создать интерфейс:

    interface LocaleChangeListener {
        void onLocaleChange();
    }
    

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

  3. Теперь создайте список слушателей, которые будут уведомлены об изменении локали первым методом.

2 голосов
/ 05 марта 2009

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

Затем вы должны иметь возможность использовать Locale.setDefault(Locale.<desired language>); при запуске, прежде чем визуализировать графический интерфейс. Это должно правильно переключить ваш языковой стандарт, что приведет к загрузке желаемых файлов .properties.

0 голосов
/ 10 декабря 2015

Как насчет того, чтобы при изменении языкового стандарта сделать firePropertyChangeEvent ("locale", "..."), затем добавить propertyChangeListener () и зарегистрировать их, где будут обновляться метки, и тому подобное?

0 голосов
/ 05 марта 2009

Я вижу два очевидных подхода:

Вместо String от ResourceBundle, получите какой-нибудь держатель String источника событий. Document было бы очень тяжелым решением, но подойдет все, что может обработать замену неизменного значения. Вместо того, чтобы просто установить текст на метке, скажем, есть метод, который также устанавливает слушателя. Обратите внимание, это довольно «тяжелое» решение.

В качестве альтернативы, есть центральный репозиторий слушателей, которые запускаются при изменении локали, каждый из которых затем возвращается и повторно выполняет соответствующую часть кода настройки (не дублируйте). Для распространенных случаев, когда, скажем, JLabel использует строку ресурса буквально, вы можете объединить их все в один слушатель с WeakHashMap<JLabel,String>. Иногда лучше избегать маленьких слушателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...