Internationalisierung in Java

Veröffentlicht in: Java | 0

Anders als vielleicht vermutet, geht es in diesem Beitrag nicht um die obligatorischen länderspezifischen Property-Dateien, sondern um die Verwendung von Ländern, Landesvorwahlen, Währungen und  landestypischen Formattern in Java-Anwendungen.

Benötigt man innerhalb eines Java  Programmes eine vollständige Liste von Ländern, stößt man schnell auf die Klasse java.util.Locale. Die hier definierten Länder-Konstanten sind zwar recht begrenzt, es gibt hier aber die statische Methode:

Locale.getAvailableLocales()

mit der man sich – denkt man – eine vollständige Liste von allen Locales liefern lassen kann. Tatsächlich werden hier aber nur 152 Locales zurückgegeben. Verwendet man stattdessen folgenden Aufruf:

for (String country : Locale.getISOCountries()) {
Locale lc = new Locale(„“, country);
}

kommt man auf insgesamt 247 Locales. Interessant hierbei ist, dass man sich sowohl den kompletten Namen des Landes, als auch den ISO 3166-2 bzw. ISO 3166-3 Code über die Locale liefern lassen kann.

locale.getDisplayCountry() //Ländername
locale.getCountry() // ISO 3166-2 Code
locale.getISO3Country() // ISO 3166-3 Code

Außer der Klasse Locale ist auch noch die Google Library libphonenumber.jar interessant, die zur Zeit in der Version 3.8 vorliegt. Hier gibt es die PhoneNumerUtil, die über den ISO 3166-2 Ländercode die Landesvorwahl liefert:

int countryCode = PhoneNumberUtil.getInstance().getCountryCodeForRegion(locale.getCountry());

Diese Library kann über maven verwendet werden:

<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>3.8</version>
</dependency>

Möchte man Zahlen landestypisch darstellen, kann die Klasse java.text.DecimalFormat verwenden werden, in dem man die entsprechende Locale übergibt. Als Beispiel wird hier die deutschsprachige Schweiz verwendet, da hier der Separator der 1000er Stelle abweichend zur deutschen Schreibweise ist:

DecimalFormat.getInstance(new Locale(„de“, „CH“).format(1234.123); //liefert: 1’234.123

Genauso einfach ist es, sich die passend formatierte Währung inklusive Währungssymbol an der korrekten Stelle ausgeben zu lassen:

NumberFormat.getCurrencyInstance(new Locale(„de“, „CH“).format(1234.123); // SFr. 1’234.12

In der deutschen Variante befindet sich das Euro-Symbol am Ende und die 1000er Stelle wird wie erwartet mit einem Punkt separiert:

NumberFormat.getCurrencyInstance(new Locale(„de“, „DE“).format(1234.123); // 1.234,12 €

Möchte man statt der lokalen die internationale Schreibweise verwenden, läßt man bei der Erstellung der Locale den Parameter für die Sprache weg. So ergibt sich für obige Beispiele folgende Ausgabe:

DecimalFormat.getInstance(new Locale(„“, „CH“).format(1234.123); //liefert: 1,234.123
NumberFormat.getCurrencyInstance(new Locale(„“, „CH“).format(1234.123); // CHF 1,234.12

Die in diesem Beitrag erwähnten Klassen bieten noch weitere Möglichkeiten für landesspezifische Darstellungen. Bevor man sich die Arbeit macht und hier eigene Komponenten entwickelt, lohnt sich ein Blick auf gegebenen Java Funktionalitäten.

Leider gibt es aber auch hier Grenzen. So treten grade für die Schweiz Probleme auf, da auf Schweizer Portalen eine Mischung aus Internationaler und Lokaler Darstellung gewählt wird. Aufgrund der Unterscheidung zwischen französischer, italienischer und deutscher Schweiz wird hier das internationale Währungssymbol CHF mit dem Hochkomma als Separator der 1000er Stellen kombiniert. Hierfür konnte ich leider keine fertige Java-Lösung finden.