Простой переключатель Javafx/Scalafx i18n (с использованием fxml)
Я занимаюсь разработкой приложения scalafx (я упомянул javafx, потому что в основном я сталкиваюсь с проблемой javafx - scalafx - это просто оболочка вокруг него), и я хочу переключать i18n во время выполнения программы по желанию. Вот мое (рабочее) решение для случая без fxml (я попытаюсь объяснить любой специфичный для scala код):
val curLocale = new ObjectProperty(new SimpleObjectProperty[Locale](Locale.ENGLISH))
val curBundle: ObjectBinding[ResourceBundle] = Bindings.createObjectBinding[ResourceBundle](() => { ResourceBundle.getBundle("i18n.text", curLocale.get, control) }, curLocale)
//Creating and object property of locale (changing stored locale will change language
//in all related places of application) and object binding for resource bundle
def i18nLoad(s: String): StringBinding = {
Bindings.createStringBinding(() => { curBundle.get.getString(s) }, curBundle)
}
//method that provides binding that is used in definition of text for each element
//Then, to set text for, let's say, label:
val smth = new Label()
smth.text <== i18nLoad("window.smth")
//<== is scalafx operation for one-directional binding,
//"window. smth" is record name in properties file
Но у меня нет аналогичного решения для fxml. Я рассмотрел стандартный подход для i18n, и он включает передачу пакета ресурсов в класс загрузчика FXML. Есть ли способ (с помощью некоторых внешних библиотек, расширения FXMLLoader вручную или полностью переписать его), чтобы передать привязку, которая содержит пакет ресурсов, в конструктор и заставить его связываться для соответствующего значения (как в данном примере) вместо просто читать это из свойств? Я попытался просмотреть исходный код FXMLLoader, но не нашел смысла, с которым такое изменение могло бы быть возможным.