TextPane Internationalisierung

Wer ein Programm entwickelt macht so etwas meist in seiner Heimatsprache. Erst später kommt dann der Wunsch hinzu, die fertige Lösung auch in anderen Sprachen anzubieten, was sich dann aber schwierig gestalten kann. Java im Zusammenspiel mit intelliJ IDEA macht es uns Programmierern aber recht leicht, die grafische Benutzeroberfläche („GUI“) mit verschiedenen Sprachen anzubieten. In der zumeist englischsprachigen Literatur wird Internationalisierung vielfach mit „I18n“ abgekürzt.

Was Euch bei der Betrachtung der Quellcodes nicht erschrecken sollte, ist die Tatsache, dass wir neben der bekannten Klasse „TextPane.java“ nebst „TextPane.form“ nun auch eine „Main.java“ als Startumgebung nutzen, diese ist notwendig da wir nur über diesen Umweg das Menü in das Programm hineinbekommen (Einzelheiten dazu im Artikel „TextPane Menue„, welcher noch erstellt wird.

Schauen wir uns als Erstes die Oberfläche des Programms an:

Nach dem Programmstart ist das Programm in englischer Sprache, nach dem Klick auf German wechselt die Oberfläche auf die deutsche Sprache:

Zusätzlich werden 5 Zeilen oben hinzugefügt, welche Beispiele für eine Lokalisierung darstellen (später mehr dazu).

Nun kommt die spannende Frage nach der programmtechnischen Umsetzung und die Antwort darauf lautet mittels „Ressource Bundle“. Die verschiedenen Sprachen sind in eigenen Dateien abgelegt, welche mit einem speziellen Editor sehr einfach erstellt und abgeändert werden können. Beim Programmstart und späterem Wechsel der Sprache über das Menü wird die gewünschte Sprachdatei geladen und jedes Menüelement erhält eine neue Beschriftung.

Fangen wir also mit der ersten Sprache (englisch) an: Wir erzeugen im Projektexplorer ein neues Unterverzeichnis und nennen es „resources“. Dann klicken wir mit der rechten Maustaste auf das Verzeichnis, wählen „New“ und im nächsten Menü ganz unten „Resource Bundle“:

Wir vergeben den Namen „Bundle“, gefolgt von „_en_US“ für die gewünschte englische Sprache und machen mit einem Klick auf „OK“ weiter:

Jetzt erzeugen wir die Datei für die deutsche Sprache: „Bundle_de_DE“ und finden beide Dateien mit der Dateiendung „.properties“ im Projektexplorer:

Die Kombinationen „en_US“ oder „de_DE“ sind nicht zufällig, sondern Ihr solltet Euch an die Tabelle zur Java-Dokumentation halten: https://www.oracle.com/technetwork/java/javase/java8locales-2095355.html. Nun nutzen wir den Resource Bundle-Editor, den wir mit der F4-Taste starten, nachdem wir den Eintrag „Resource Bundle ‚Bundle'“ markiert haben:

Da wir noch keine Ressourcen angelegt haben, ist der Editor aber nun noch komplett leer. Mit einem Klick auf das Plus-Zeichen in der Mitte (rot markiert) können wir unsere Einträge anlegen. Wir starten mit dem Namen unseres Programms, welcher später in der Titelzeile erscheinen soll – unser Eintrag soll „application.title“ lauten:

Nach dem Klick auf „OK“ könnt Ihr nun die gewünschten Titel in deutsch und englisch in die Felder eingeben:

So vergebt Ihr nun für jedes Element Eurer GUI ein „Sprachenpaar“. Ich habe mich dafür entschieden, schon bei der Benennung darauf zu achten, für welches Element später dieser Eintrag bestimmt ist (Beispiele sind „menuItem“ oder „mainButtonLoad“):

Nun noch ein ganz wichtiger Klick – sonst erhaltet Ihr später böse Fehlermeldungen. Ihr klickt im Projektexplorer mit der rechten Maustaste auf den Eintrag „resources“ und wählt aus dem Kontextmenü „Mark Directory as“ und dann „Resources Root“ aus. Damit wird intelliJ bei der Übersetzung des Programms und späteren Erzeugung einer JAR-Datei diese beiden Dateien direkt mit dem Programm verbinden:

Nun fehlt noch die Einbindung des „Resource Bundle“ in das Programm (hier in der Klasse „Main.java“). Da ich alle GUI-Elemente bei der Programmierung in englischer Sprache beschriftet habe, werden alle Elemente auch so angezeigt. Erst ein Klick auf den Menüeintrag „Language“ / „German“ ruft das deutschsprachige Bundle auf den Plan: er lädt alle Benennungen und gibt den GUI-Elementen den neuen Text. Bei den Elementen, welche sich in der Klasse „TextPane.java“ befinden benutze ich in der Klasse jeweils einen „Setter“, welchen ich von der „Main.java“ aufrufe:

Sollte ich dabei ein GUI-Element vergessen passiert exakt nichts – es verbleibt in der englischen Sprache. Selbstverständlich gibt es für jeden „Sprachen-Eintrag“ im Menü einen eigenen Action Listener.

Die Ressourcen-Dateien sind im übrigen einfache Textdateien; bei Bedarf könnt Ihr aber auch das XML-Format als Basis der Sprachdateien nutzen („Use XML-based properties files“ bei der Erzeugung des Resource Bundles).

Neben der Internationalisierung ist Lokalisierung ein wichtiger Programmpunkt, denn die Schreibweise von Datumsangaben, Währungen oder Zahlen differiert je nach Land. In der Methode „createLocaleLine“ (Klasse Main.java) findet Ihr dazu ein paar Beispiele und deren programmtechnische Umsetzung. Die Lokalisierung wird in der Literatur meistens mit „L18n“ bezeichnet.

Ein letzter Punkt betrifft die Sprachanzeige innerhalb von fertigen Dialogen, hier gezeigt am „Color Chooser“. Beim Start des Programms gebe ich mit der Programmzeile

bewusst die spanische Sprache vor und diese wird im Color Chooser dann auch benutzt:

Leider gibt es derzeit keine Möglichkeit, die Sprache während eines laufenden Programms abzuändern. Die einzige Option hierfür ist die Speicherung der neu gewählten Sprache (z.B. in einer Ini-Datei) und ein Neustart des Programms mit Änderung der Locale-Vorgabe z.B. auf deutsch:

Hier zeige ich Euch alle Sourcecodes und die beiden Sprachdateien, wie immer benötigt Ihr intelliJ zum Nachbau:

Alle Quellcodes zur JTextPane findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/JTextPane. Alle Programme sind unter Java 11 lauffähig (vermutlich auch unter Java 8) und wurden mit intelliJ IDEA entwickelt, welches für das eigene „Spielen“ notwendig ist.

Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.

Letzte Bearbeitung: 12.02.2020