JavaFX- Internationalisierung / i18n in FXML Dateien

Hallo zusammen,
in diesem Beitrag möchte ich euch erklären wie man i18n am Besten in JavaFX umsetzt.
Dies geht dank der Integration von i18n in SceneBuilder relativ einfach.
Alle Beispiele sind mit SceneBuilder 2.0 erstellt.

Erstellen einer Java Properties Datei

  • Erstelle eine Properies Datei: „myapp_de.properties“
  • Lege sie zum Beispiel in deinen Resources Ordner
  • Öffne die Datei in deiner IDE oder in einem Texteditor
  • Schreibe in die erste Zeile
    my.sample.key=Hallo Welt

 

Arbeiten mit i18n im JavaFX SceneBuilder

  • Öffnet / Erstellt eine .fxml Datei mit SceneBuilder
  • Klickt nun im SceneBuilder auf „Preview“ -> „Internationalization“ -> „Set Resource… “
    scene_builder_select
  • Wählt dort nun eure „myapp_de.properties“ Datei aus
  • Jetzt klickt auf ein Element welches Text enthält
  • Jetzt klickt auf der rechten Seite neben dem Text Feld auf das kleine Zahnrad.
    Dann auf „Replace with internationalized string“
    scene_builder_tokey
  • Nun wird das Textfeld automatisch in ein Key Feld umgewandelt
  • Dort kommt jetzt der Key aus der Properties Datei rein („my.sample.key“)
  • Nach verlassen des Feldes sollte der SceneBuilder automatisch den Wert aus der Properties Datei ziehen, sprich „Hallo Welt“
  • Die FXML abspeichern

 

Sprache beim Laden einer FXML Datei festlegen

  • Nun geht es im Quellcode um das Laden einer FXML mit einer bestimmten Sprache.
  • Das sieht nun folgendermaßen aus:

 ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

 URL fxmlURL = classLoader.getResource("fxmls/myview.fxml");
 InputStream inputStream = classLoader.getResource("bundles/myapp_de.properties").openStream();
 ResourceBundle bundle = new PropertyResourceBundle(inputStream);

 FXMLLoader loader = new FXMLLoader(fxmlURL, bundle);
 Parent p = loader.load();

 Stage stage = new Stage();
 stage.setScene(new Scene(p));
 stage.show();

  • Ich gehe davon von aus das die .fxml Dateien und die .properties Dateien in einem resources Ordner liegen.
    Die Struktur sieht folgendermaßen aus:

java.de.app
………..|——-Main.java

<resources>
………..|——-bundles
………………….|————–myapp_de.properties
………………….|————–myapp_en.properties
………..|——-fxmls
………………….|————–myview.fxml

 

Es ist zu beachten das die Sprache nicht währen des Betriebs geändert werden kann. Das bedeutet des die Stage neu gestartet werden muss damit eine Sprachänderung wirksam wird.

 

Download
Beispielprojekt: i18nTest.zip (3KB)

 

13 thoughts on “JavaFX- Internationalisierung / i18n in FXML Dateien

  1. Hallo,
    vielen Dank für das schöne Tutorial. Hat mir sehr geholfen, da ich von Android einen etwas anderen Ablauf gewohnt bin.
    Aktuell sieht bei mir der Code wie folgt aus:

    ResourceBundle lngBdl = ResourceBundle.getBundle(„app.bundles.LangBundle“, Pref.getAppsLocale());

    FXMLLoader loader = new FXMLLoader(
    Pref.getTheme().equals(STYLESHEET_MODENA) ?
    getClass().getResource(„/app/fmxl/main.fxml“) : getClass()
    .getResource(„/app/fmxl/main_dark.fxml“),
    lngBdl);

    (Hinweis zur Lesbarkeit: über Pref lade ich die Sprache bzw. das jeweilige Theme..)

    Der Code funktioniert (wird also auch angewandt, wenn ich die %-Schreibweise in der fxml-Datei nutze) – allerdings zeigt mir IntelliJ nur die „Nutzung“ der Textressource an, wenn ich die Verlinkung über die Bundle.getString(„key“)-Methode aufrufe…
    Weißt du zufällig an was das liegt? Ist kein großes Problem, nur sollte ich später Ressourcen umbenennen wollen (sprich die Keys ändern) wird das von der IDE nicht automatisch erkannt :-/

    Besten Dank nochmal und viele Grüße
    Martin

Leave a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.