10.5 Einfache Übersetzung durch ResourceBundle-Objekte
Sollen Java-Programme sprachunabhängig gestaltet werden, müssen alle Zeichenketten einer Landessprache durch symbolische Namen, wie Variablen, ersetzt werden. Wenn das Programm später eine Zeichenkette nutzen will, greift es auf die Variable zu, und diese soll dann die entsprechende Übersetzung enthalten.
Die Verbindung zwischen den symbolischen Namen und den landessprachlichen Texten erfolgt in Java mithilfe der Klasse ResourceBundle. Dazu speichert ein ResourceBundle alle programmrelevanten Texte und Informationen für ein spezielles Land. In einer Datei werden die Identifizierer als Schlüssel und die landesabhängigen/sprachabhängigen Zeichenketten als Werte gehalten. Der Aufbau eines ResourceBundle erinnert uns dabei stark an eine Property-Datei. Wir wollen daher mit dem Aufbau dieser Property-Datei beginnen und definieren den Identifizierer Hello. Da wir die Sprachen Englisch und Deutsch unterstützen wollen, legen wir zwei Dateien an. Die Dateinamen für die Ressourcen-Dateien haben dabei einen speziellen Aufbau. Sie setzen sich aus dem Namen des ResourceBundle, einem Unterstrich (_), einer Landeskennung und der Dateiendung properties zusammen. Wollen wir unser ResourceBundle »HelloWorld« nennen, dann ergeben sich für die Ländercodes England »en« und für Deutschland »de« die folgenden Dateien:
Listing 10.3 HelloWorld_en.properties
# HelloWorld_en.properties
Hello=Hello World.
Listing 10.4 HelloWorld_de.properties
# HelloWorld_de.properties
Hello=Hallo Welt.
Kommentare beginnen mit einer Raute.
Als Nächstes kann das Programm folgen, das die ResourceBundle-Dateien verwendet. Wir benötigen dazu ein Objekt der Klasse ResourceBundle, welches wir über eine Fabrik-Methode ResourceBundle.getBundle(name) bekommen. name ist dabei der Name des ResourceBundle, in unserem Fall »HelloWorld«. Die Methode sucht automatisch aufgrund der eingestellten Landessprache die passende Datei. Mit dem Verweis auf das aktuelle ResourceBundle-Objekt können wir über einen Schlüssel mithilfe der Methode getString() auf die landesspezifische Meldung zugreifen.
Beispiel Mit den Ressource-Dateien HelloWorld_en.properties und HelloWorld_de.properties sowie dem Identifizierer Hello setzt sich ein Programm zur Abfrage einer Übersetzung einfach zusammen.
|
Listing 10.5 InternationalHelloWorld.java
import java.util.*;
//java -Duser.language=en InternationalHelloWorld
//Hello World.
public class InternationalHelloWorld
{
public static void main( String args[] )
{
String baseName = "HelloWorld";
try
{
ResourceBundle bundle = ResourceBundle.getBundle( baseName );
System.out.println( bundle.getString("Hello") );
}
catch ( MissingResourceException e ) {
System.err.println( e );
}
}
}
Die Dateinamen für die jeweiligen ResourceBundle-Objekte können sehr variabel zusammengesetzt werden. Die Java-Bibliothek verwendet die nachfolgenden Bildungsgesetze:
bundleName_localeLanguage_localeCountry_localeVariant
bundleName_localeLanguage_localeCountry
bundleName_localeLanguage
bundleName_defaultLanguage_defaultCountry_defaultVariant
bundleName_defaultLanguage_defaultCountry
bundleName_defaultLanguage
bundleName
Hier klicken, um das Bild zu Vergrößern
Die Suchreihenfolge ist dabei wie angegeben. Es können auch mehrere Ressource-Dateien angegeben werden, die dann der Reihe nach durchlaufen werden, sodass dadurch Werte kumulieren und sich überschreiben können.
|