Warum Ihre Java-Anwendung endlich menschlich sprechen sollte?
\n\nHaben Sie sich jemals gefragt, warum Apps, die wir täglich nutzen – von Spotify bis Notion – sofort „verstehen“, in welcher Sprache sie mit Ihnen sprechen sollen? Sie lesen keine Gedanken und raten nicht anhand der IP-Adresse. Sie nutzen Internationalisierung (i18n).
\n\nFür Java-Entwickler ist die Fähigkeit, Anwendungen mehrsprachig zu machen, nicht nur ein „Nice-to-have“, sondern eine grundlegende Fähigkeit, wenn Sie den globalen Markt anvisieren. Stellen Sie sich vor: Sie haben einen großartigen Task-Manager-Dienst geschrieben. In Deutschland läuft er super. Aber sobald Sie ihn in Frankreich oder Japan verkaufen wollen, sehen die Nutzer den Button „Aufgabe erstellen“ auf Deutsch. Und schließen den Tab. Traurig, oder?
\n\nIn diesem Artikel sprechen wir nicht nur über Theorie. Wir nehmen eine Java-Anwendung (ganz gewöhnlich, Konsolen- oder Web-App) und fügen Schritt für Schritt Unterstützung für Deutsch, Englisch und Französisch hinzu. Sie werden sehen: Java-Internationalisierung ist nicht kompliziert, sondern elegant. Los geht's!
\n\nWas ist Internationalisierung und Lokalisierung? Nicht verwechseln!
\n\nDiese Begriffe werden oft vermischt. Klären wir das.
\n\n- \n
- Internationalisierung (i18n) – der Prozess, eine Anwendung so zu entwerfen, dass sie an verschiedene Sprachen und Regionen angepasst werden kann, ohne den Code zu ändern. Sie legen die „Haken“ für die Übersetzung. \n
- Lokalisierung (l10n) – das Befüllen dieser „Haken“ mit konkreten Übersetzungen, Datumsformaten, Währungen und Sortierregeln für ein bestimmtes Land. \n
In Java sind die Klassen aus dem Paket java.util für die Internationalisierung zuständig: Locale und ResourceBundle. Merken Sie sich diese – sie sind Ihre besten Freunde.
Schritt 1: Locale kennenlernen – das Herz der Internationalisierung
\n\nDie Klasse Locale repräsentiert eine bestimmte Region (Sprache + Land). Zum Beispiel:
- \n
Locale.US– Englisch (USA) \n Locale.GERMANY– Deutsch (Deutschland) \n new Locale("fr", "FR")– Französisch (Frankreich) \n
Locale wird verwendet, um die richtige Übersetzung von Texten sowie die Formatierung von Zahlen, Daten und Währungen auszuwählen. Ohne sie ist Internationalisierung unmöglich.
\n\nWie erhalte ich die aktuelle Locale?
\n\nimport java.util.Locale;\n\npublic class Main {\n public static void main(String[] args) {\n // Standard-Locale (normalerweise die System-Locale)\n Locale defaultLocale = Locale.getDefault();\n System.out.println("Aktuelle Locale: " + defaultLocale);\n\n // Verfügbare Locales in der JVM\n Locale[] available = Locale.getAvailableLocales();\n System.out.println("Insgesamt verfügbar: " + available.length);\n }\n}\n\nDie Ausgabe könnte z. B. sein: Aktuelle Locale: de_DE. Aber wir verlassen uns nicht auf die System-Locale – in einer Web-App wird sie normalerweise vom Browser des Benutzers übermittelt.
Schritt 2: ResourceBundle – Ihr Übersetzer
\n\nJetzt kommt der spannende Teil: Wie speichert man Übersetzungen? In Java werden dafür Properties-Dateien (.properties) verwendet. Jede Datei enthält Schlüssel-Wert-Paare.
Übersetzungsdateien erstellen
\n\nErstellen Sie im Verzeichnis src/main/resources (oder einfach im Quellcode-Ordner) drei Dateien:
1. Messages.properties (Standardsprache – Englisch)
\ngreeting=Hello, {0}!\nfarewell=Goodbye!\napp.title=Task Manager\n\n2. Messages_de_DE.properties (Deutsch)
\ngreeting=Hallo, {0}!\nfarewell=Auf Wiedersehen!\napp.title=Aufgabenverwaltung\n\n3. Messages_fr_FR.properties (Französisch)
\ngreiting=Bonjour, {0}!\nfarewell=Au revoir!\napp.title=Gestionnaire de tâches\n\nAchten Sie auf die Suffixe: _de_DE, _fr_FR. Java sucht die Datei nach dem Muster: Basisname