[JavaFX] Kann man die Änderung der Sprache kompakter umsetzen?
Hier die Methoden, die durch ein Klick auf die jeweilige Sprache ausgeführt werden:
Ich habe es schon mal in einer einzigen Methode in einer separaten Klasse mit (Bsp.):
gMI.getController().window_language_GERMAN.setOnAction(v -> {
...
});
gMI.getController().window_language_ENGLISH.setOnAction(v -> {
...
});
...
versucht, jedoch tut sich dort erst nach dem 2. Klick etwas. Dass man erst 2x auf eine Sprache klicken muss, damit alles funktioniert, ist nur 1x am Anfang so.
Ich möchte auch ungerne 10 verschiedene Methoden da herumschwimmen haben, die jeweils eine eigene Klasse aufrufen...
Danke.
1 Antwort
Möchtest du so etwas die grafische Oberfläche multilingual gestalten? Dafür solltest du Resource Bundles verwenden, die bei Bedarf dynamisch ausgetauscht werden.
Ich habe einmal zwei Artikel herausgesucht, die jeweils eine Beispielimplementation zeigen.
In kurz hier erklärt: Für die Texte werden Platzhalter bestimmt, die wiederum für die Texte der Oberflächenkomponenten (bspw. in deiner FXML) gesetzt werden. In einzelnen XML-Dateien (eine XML-Datei für eine Sprache) werden die Platzhalter mit den richtigen Texten assoziiert. Je nachdem, welche Sprache angezeigt werden soll, wird die entsprechende XML-Datei geladen.
Für den Language Switcher kann man eine ComboBox nehmen.
Wie man vorgeht, sollte man wohl besser am Aufbau der Oberfläche abwägen (auch im Hinblick darauf, inwiefern sich das Programm noch weiterentwickeln soll). Es gibt öfter statische Komponenten, deren Texte zwar übersetzt werden müssen, die sich aber sonst nicht ändern. Für all diese Komponenten Bindings anzulegen, würde zusätzliche Code-Zeilen und erfordern und zur Laufzeit würden die dafür nötigen Objekte auch Speicherplatz verbrauchen. Womöglich ist das immer noch nicht so aufwendig wie das erneute Lesen und Parsen der FXML-Datei, dafür aber erspart man sich im Projektcode einen Fokus auf unwichtige View-Elemente. Ziel eines gut wartbaren Projekts ist es ja, View-Logik möglichst in der FXML-Datei zu belassen.
Stimmt, absolut, es ist wirklich viel schöner, wenn alles über mehrere FXML-Dateien laufen. Das ganze Gedöns steht ja dann in der .fxml-Datei, wo ich sowieso nur alle paar Jahre reinschaue.
Ich habe zuerst die Methode ausprobiert, wo ich einfach die Texte ändere, dann die mit dem FXML-Wechsel. Beides ausprobiert - für eins entschieden.
Also dieser FXML-Wechsel heißt View-Logik oder ist es eine Art?
Das Wechseln der FXML hat keinen Namen/Fachbegriff.
Mit View-Logik meinte ich Folgendes: Es macht Sinn, alles was mit der grafischen Oberfläche (View) zutun hat, möglichst von jeglichem anderen Code zu trennen. Zum einen kann das ein Projekt übersichtlicher/geordneter machen und zum anderen flexibler (es fällt einfacher, diesen Teil gegen einen anderen auszutauschen; Stichwort: Lose Kopplung). Schau dir Entwurfsmuster wie MVC oder MVVM an.
Ich denke , dass es - auch wenn es keineswegs spürbar ist - länger dauert bzw. aufwendiger ist, wenn man immer eine neue FXML-Datei laden lässt, anstatt dass man einfach den Text mit
verändert. Stimmt meine Vermutung oder ist es ganz anders zu beschreiben?