Setzen der Locale

Ein internationalisiertes Programm zeigt Information in Abhängigkeit von Land und Sprache an. Die Identifikation der geeigneten Sprache und der Region erfolgt hierbei durch die Referenzierung eines Locale-Objekts.

Ein Locale-Objekt identifiziert eine bestimmte Kombination aus Sprache, Region und Kultur. Wenn eine Klasse ihre Verhalten in Abhängigkeit von einer Localen verändert, wird sie auch als Locale-sensitiv bezeichnet. Das Format von Zahlen ist bspw. Locale-sensitiv, da das genaue Format einer Zahl von der Localen abhängt. Locale-Objekte haben allerdings lediglich identifizierende Wirkung. Die Umsetzung wird von Methoden innerhalb der Locale-sensitiven Klassen vorgenommen.

Erzeugung einer Localen

Um ein Locale-Objekt anzulegen, wird üblicherweise ein Sprach- und ein Landes-Code spezifiziert. Soll bspw. ein Locale-Objekt für die Sprache Englisch und das Land U.S.A. angelegt werden, so ist die folgende Anweisung zu verwenden:

code 

bLocale = new Locale("en","US");

Das erste Argument ist hierbei der Sprach-Code, ein kleingeschriebenes Buchstabenpaar, das der Norm ISO-639 entspricht. Eine vollständige Liste der Sprach-Codes findet sich bspw. unter der URL http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt. Tab. 6-1 listet einige der gebräuchlichsten Sprach-Codes auf.

Sprach-Code

Sprache

de

Deutsch

en

Englisch

fr

Französisch

ja

Japanisch

zh

Chinesisch

it

Italienisch

Tab. 6.1: Sprach-Codes

Das zweite Argument ist der Landes-Code, ein großgeschriebenes Buchstabenpaar, das der Norm ISO-3166 entspricht. Eine vollständige Liste der Landes-Codes findet sich bspw. unter der URL http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html. Tab. 6-2 listet einige der gebräuchlichsten Landes-Codes auf.

Landes-Code

Land

DE

Deutschland

US

USA

FR

Frankreich

JP

Japan

CN

China

IT

Italien

Tab. 6.2: Landes-Codes

Soll eine Locale weiter unterschieden werden, so kann ein dritter Parameter angegeben werden, der auch als Varianten-Code bezeichnet wird. Varianten-Codes werden immer dann eingesetzt, wenn innerhalb eines Landes mehrere Sprachen existieren, aber auch, wenn von einer Sprache mehrere Unterarten existieren (bspw. britisches Englisch und amerikanisches Englisch). Soll bspw. in den USA eine lokale Unterscheidung getroffen werden, so wären die folgenden Zeilen zu verwenden:

code 

nLocale = new Locale("en", "US" ,"NORDEN");
sLocale = new Locale("en", "US", "SUEDEN");

Die Varianten-Codes sind allerdings nicht standardisiert und daher beliebig und anwendungsspezifisch. NORDEN und SUEDEN sind diesbezügliche Beispiele.

Landes- und Varianten-Code sind optionale Parameter. Man kann bspw. den Landes-Code weglassen, indem man einen leeren String in der folgenden Art übergibt:

code 

enLocale = new Locale("en", "");

In diesem Fall kann sich eine Anwendung allerdings nicht an regionale Unterschiede in der Sprache anpassen.

Identifikation verfügbarer Localen

Eine Locale kann in jeder Kombination aus gültigem Sprach- und Landes-Code erzeugt werden, was allerdings nicht bedeutet, dass diese Kombination dann auch verwendbar ist. Da eine Locale nur identifizierende Wirkung hat, wird das Locale-Objekt an andere Objekte übergeben, die dann damit arbeiten. Diese Locale-Objekte, die auch als Locale-sensitiv bezeichnet werden, können nicht wissen, wie mit allen theoretisch möglichen Locale-Definitionen umzugehen ist. Um herauszufinden, welche Typen von Locale-Definitionen eine Locale-sensitive Klasse erkennt, kann die getAvailableLocales-Methode aufgerufen werden. Um bspw. herauszufinden, welche Locale-Definitionen von der Klasse DateFormat unterstützt werden, könnte die folgende Routine verwendet werden:

code 

import java.util.*;
import java.text.*;
public class Verfuegbar {

    static public void main(String[] args) {

      Locale liste[] = DateFormat.getAvailableLocales();
      for (int i = 0; i < liste.length; i++) {

        System.out.println(liste[i].getLanguage() + " " + liste[i].getCountry());

      }

    }

}

Zuweisung der Standard-Localen

Wenn einem Locale-sensitiven Objekt keine Locale zugewiesen wurde, verwendet dieses das Locale-Objekt, das von der Methode Locale.getDefault zurückgegeben wird. Die Standard-Locale kann auf zwei Arten gesetzt werden:

  • Setzen der Eigenschaften user.language und user.region System. Die Locale-Klasse setzt dann den Standardwert, indem die Werte dieser Eigenschaften abgefragt werden.
  • Aufruf der setDefault-Methode.

Diese zwei Techniken werden im folgenden Beispiel erklärt:

code 

import java.util.*;
public class StandardLocale {

    static public void main(String[] args) {

      Properties eigenschaften = System.getProperties();
      eigenschaften.put("user.language", "ja");
      eigenschaften.put("user.region", "JP");
      System.setProperties(eigenschaften);
      Locale eineLocale = Locale.getDefault();
      System.out.println(eineLocale.toString());
      eineLocale = new Locale("de", "DE");
      Locale.setDefault(eineLocale);
      System.out.println(eineLocale.toString());

    }

}

Die Ausgabe dieses Programms ist ja_JP fr_FR.

Gültigkeitsbereich einer Localen

In Java wird eine global gültige Locale nicht unterstützt. Es kann zwar eine Standard-Locale angegeben werden, diese muss allerdings nicht überall im Programm verwendet werden. Theoretisch kann jedem Locale-sensitiven Objekt des Programms eine andere Locale zugewiesen werden. Dies ist bspw. dann wünschenswert, wenn mehrsprachige Anwendungen implementiert werden, die Informationen in verschiedenen Sprachen präsentieren. In den meisten Anwendungen ist es allerdings sinnvoll, alle Locale-sensitiven Objekte auf dieselbe Locale zu setzen.

 


SPNavRight SPNavRight SPNavRight
BuiltByNOF