Подтвердить что ты не робот

Изменение языка во время выполнения в Swing

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

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

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

4b9b3361

Ответ 1

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

  • Создайте интерфейс:

    interface LocaleChangeListener {
        void onLocaleChange();
    }
    

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Есть два очевидных подхода, которые я вижу:

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

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