JavaFX Internationalisierung zur Laufzeit

DefconDev

Bekanntes Mitglied
Hallo zusammen,

kann man zur Laufzeit irgendwie die Sprache ändern ohne jede Komponenten die Text enthält aufzurufen?

Zurzeit übergebe ich die Sprache direkt beim Aufbau des GUIs.
Code:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/matchMakerView/MatchMaker_MainScene.fxml"), new Language("GER").getBundle());

Code:
Language lang = new Language("GER");
               
                //Root für die Spieler im Treeview
                spieler_MainRoot        = new CheckBoxTreeItem<Object>(lang.getBundle().getString("tv_PlayerRoot"));
                spieler_Root_aktiv        = new CheckBoxTreeItem<Object>(lang.getBundle().getString("tv_PlayerActive"));
                spieler_Root_Inaktiv    = new CheckBoxTreeItem<Object>(lang.getBundle().getString("tv_PlayerInactive"));

Ich komme zurzeit auf ca. 40-50 Componenten die ich mit solch einem Code aufrufen müsste. Empfinde ich als ziemlich statisch und ist verbunden mit einiger Schreibarbeit.


Den Versuch die Locale oder das RessourceBundle in der FXML zur Laufzeit zu ändern funktioniert nicht wirklich, zumin. finde ich keine Methode die zu ändern.

Jemand eine Idee was ich übersehe oder falsch mache.
 
Eine Alternative könnte wie folgt sein:
du legst am besten ein Listener an deine Variable: lang .an.
Änder sich der Inhalt rufst du eine Methode auf in der du über eine schleife in ein Array mit all deinen Componenten durch gehst, um die Anzeige an die neue Sprache anzupassen.
 
Das funktioniert nicht, die Componenten sind alle komplett verschieden, also die in ein Array zu packen oder ähnliches ist nicht machbar. Selbst wenn ich mit IDs arbeiten würde, müsste ich einen ziemlichen Aufwand betreiben.
 
Erst mal ein Dank für deine Antworten.

Weißt du zufälligerweise ob und wie man zur Laufzeit Strings in das args Argument permanent speichern kann?

Idee, der User wählt die Sprache und nach einem manuellen Neustart des Programms wird die Sprache geladen die er zuvor ausgewählt hat.
 
Hm... Wozu gibt es noch einmal das ResourceBundle? Richtig: Für Internationalisierung von Anwendungen.

Wie kann man das mit JavaFX (also Properties) verheiraten? Hm... Las mich in meinem Repo nachschauen:
https://github.com/bgmf/poc/tree/master/shared/src/main/java/eu/dzim/shared/resource
Kern des Ganzen: Ein Interface und eine Implementierung, die ich in dem Beispiel mit Guice (also Dependency Injection) verwende - was aber absolut kein "Muss" ist!

Interface: https://github.com/bgmf/poc/blob/master/shared/src/main/java/eu/dzim/shared/resource/Resource.java
Implementierung: https://github.com/bgmf/poc/blob/ma...ava/eu/dzim/shared/resource/BaseResource.java
Und finales "Beispiel" hier: https://github.com/bgmf/poc/blob/ma...u/dzim/shared/resource/impl/ResourceImpl.java

Und um es irgendwo zu nutzen muss man nun entweder einen Listener auf die #localeProperty oder #resourceBundleProperty setzen (ich nutze, wenn dann das Erste) - und den Text mittels #getGuaranteedString oder so holen. Oder (was in den meisten Fällen mein präferierter Weg ist) ich binde einen zu übersetzenden Text (z.B. Label#textProperty) mittels der Methode #getBinding(key, params...) (wobei ich meistens nie einen Parameter brauche, daher kann man meist nur #getBinding(key) schreiben). Das ist denkbar einfach und in 99% aller fälle ausreichend.

Und die zu übersetzenden Texte? Properties-Dateien im Format <frei-wählbarer-name>[_<sprache>[_<land>]].properties. Man kann auch eigene Files einbinden, hab ich aber noch nie gebraucht und dünkt mich daher unnötig.
 
Danke für deine Antwort. Ich denke mal für mein nächstes privat-Projekt werde ich das umsetzen, hatte aber gehofft es gibt eine sehr kleine Lösung.
 

Zurück
Oben