Home Unternehmen             Portfolio             Trainingsshop    Kunden & Partner Aktuelles    Kontakt
Home  Pfeil  ORDIX News  Pfeil  3/2009  Pfeil  Java/JEE
suche: 
Dieser Artikel richtet sich an Java-Entwickler, die das Google Web Toolkit in multilingualen Projekten einsetzen möchten.
Titelbild


Do you understand me?
Google Web Toolkit Internationalisierung


Das Framework Google Web Toolkit (GWT) unterstützt bei der Entwicklung von Rich Internet Applications für Standard-Browser. Seit dem letzten GWT-Artikel [1] hat sich GWT am Markt etabliert. Mittlerweile ist GWT eine Open Source-Lösung und seit Juli 2009 in der Version 1.7 veröffentlicht. Dieser Artikel vergleicht und bewertet verschiedene Internationalisierungsstrategien für GWT-Projekte. Des Weiteren wird die Internationalisierung eines Beispielprojektes anhand der Static String Strategie erläutert.

gwt-windows-1.6.4>webAppCreator.cmd -out ONewsProjekt 
Abb. 1: Aufruf des WebAppCreators.
Abb. 2: GWT-Projekt in Eclipse
Abb. 2: GWT-Projekt in Eclipse.
Abb. 3: Hierarchie der verwendeten GWT-Klassen und Interfaces.
Abb. 3: Hierarchie der verwendeten GWT-Klassen und Interfaces.
Vorteile Nachteile
Einsatz vorhanderner Implementierungsansätze (properties-Dateien) möglich Neukompilierung des Codes bei Änderung der Konstanten/Nachrichten-Inhalte nötig
Die Existenz von Konstanten oder Nachrichten wird vom Kompiler überprüft. Fehlende Einträge erzeugen einen Kompilerfehler. Bei der Änderung des Gebietsschemas muss die Webseite neu geladen werden.
Der Kompiler entfernt ungenutzte Konstanten/Nachrichten und minimiert so die Größe der ausgelieferten Dateien  
Abb. 4: Vor- und Nachteile der Internationalisierung mit Static String.
 
VorteileNachteile
Einsatz vorhanderner Implementierungsansätze (Java-Script Arrays)Die Existenz von Konstanten oder Nachrichten wird vom Kompiler nicht erkannt. Fehlende Einträge führen ggf. zu Fehlern in der Bernutzerschnittstelle
Neukompilierung des Codes bei Änderung der Konstanten/Nachrichten-Inhalte nicht nötigDer Kompiler kann ungenutzte Konstanten/Nachrichten nicht entfernen und deshalb die Größe der ausgelieferten Dateien nicht optimieren
Änderung des Gebietsschemas erfordert i.d.R. keine Neukompilierung  
Abb. 5: Vor- und Nachteile der Internationalisierung mit Dynamic String.
 
package de.ordix.client;
import com.google.gwt.i18n.client.Constants;
public interface GreetingConstants extends Constants {
	  @DefaultStringValue("Greeting Service")
	  String greetingService();
... }
Abb. 6: Implementierung des Interfaces GreetingConstants.
 
greetingService = Grüß-Service
enterName       = Bitte geben Sie Ihren Namen ein:
send            = senden                 
Abb. 7: Auszug der GreetingConstants_de.properties.
<!-- <h1>Greeting Service</h1>-->
<h1 id="greetingService"></h1>                 
Abb. 8: Marker für die Überschrift in der HTML-Host-Seite Onews.html.
 
1 private GreetingConstants constants =
	GWT.create(GreetingConstants.class);
2 public void onModuleLoad() {
3 RootPanel.get("greetingService")
		.add(new Label(constants.greetingService()));
...}                
Abb. 9: Lokalisierte Version der Klasse Onews.java.
Abb. 10: Aufruf der lokalisierten Version des GreetingService.

Vorbereiten des Beispielprojektes

Das Google Web Toolkit ist auf den Google-Internetseiten [2] als Download für Windows, Linux und MacOS verfügbar. Nach dem Entpacken des GWT-Archivs ist das Toolkit ohne weitere Konfiguration einsetzbar. GWT setzt lediglich eine Installation von Java 32 bit SDK Version 5 oder 6 voraus. Ein versionsspezifisches GWT-Eclipse-Plugin stellt Google zusätzlich zum Download bereit. Das Plugin erleichtert die Entwicklung unter anderem durch Wizards, Run und Debug-Funktionalitäten sowie GWT-JUnit-Support.

GWT liefert seit der Version 1.6 den WebAppCreator zur Generierung der Verzeichnis- und Projektstruktur aus, der den Funktionsumfang von applicationCreator und projectCreator älterer GWT-Versionen in einem Werkzeug abdeckt.

Für die Internationalisierung verwenden wir das GWT Web Application Starter Projekt "GreetingService", das durch den Aufruf des WebAppCreators (siehe Abbildung 1) in den Ordner ONewsProjekt generiert wird. Der letzte Übergabeparameter bestimmt den Modulnamen und die Paketstruktur. In diesem Fall ist das angegebene Paket de.ordix und der Modulname ONews. Das generierte Projekt kann direkt in Eclipse importiert werden. Bei installiertem Google-Eclipse-Plugin sollte der Entwickler die GWT-Funktionen in den Projekt-Eigenschaften aktivieren (siehe Abbildung 2).

Auswahl der Internationalisierungsstrategie

GWT unterstützt die Internationalisierung einer Applikation von Hause aus. Die verfügbaren Strategien sind statische und dynamische String-Internationalisierung, sowie eine eigene Implementierung des Localizable Interfaces. Abbildung 3 zeigt die Hierarchie wichtiger Klassen für die Internationalisierung von GWT-Projekten.

Internationalisierung mit Static String

Die Internationalisierung mit Static String stellt lokalisierte Konstanten und Nachrichten auf Basis von Java Interfaces, properties-Dateien und GWT-Code-Generierung bereit. Der Compiler generiert einzelne Versionen der Benutzerschnittstelle für jede Lokalisierung. Diese Strategie verursacht zur Laufzeit wenig Overhead und ist einfach zu implementieren, bietet aber unter Umständen nicht genügend Flexibilität. Die Vor- und Nachteile dieser Strategie finden Sie in Abbildung 4.

Internationalisierung mit Dynamic String

Die Internationalisierung mit Dynamic String basiert auf der Dictionary-Klasse und liest Paare von Schlüsselwerten aus der HTML-Host-Seite des GWT-Moduls. Der Entwickler fügt alle dynamischen Strings als assoziative Java Script Arrays in den body der Host-Seite ein. Zur Laufzeit liest GWT die Schlüsselwerte-Paare aus und verwendet diese dann beim Rendering der Benutzerschnittstelle. Bei der Änderung der Übersetzung und der Ergänzung von Sprachen muss die Anwendung nicht neu kompiliert werden, sondern lediglich eine Anpassung in der Host-HTML-Seite vorgenommen werden. Dieser Vorteil kann an anderen Stellen allerdings zu Problemen führen. Beispielsweise kann der Compiler fehlende Schlüsselwerte-Paare nicht erkennen und somit Laufzeitfehler nicht verhindern. Nutzt eine bestehende Webseite bereits assoziative Java-Script-Arrays zur Lokalisierung, bietet sich Dynamic String-Internationalisierung für das GWT-Modul an. Die Vor- und Nachteile dieser Strategie sind in Abbildung 5 dargestellt.

Eigene Implementierung des Localizable Interfaces

Die mächtigste Möglichkeit stellt die eigene Implementierung des Localizable Interfaces dar. Der Entwickler erzeugt zunächst Standardklassen, die das Localizable Interface implementieren. Die lokalisierten Klassen erweitern dann die Standardklassen. Die Namen dieser Klassen müssen der internationalisierungsspezifischen Namensstruktur entsprechen. So können lokalisierte Versionen eigener Typen erstellt werden. Die Implementierung dieser Strategie ist sehr aufwändig und wird nur selten benötigt.

Für das Beispielprojekt "GreetingService" verwenden wir die Strategie Static String.

Zunächst müssen die Schnittstelle für Konstanten und Nachrichten auf Client-Seite implementiert werden. Im nächsten Schritt legt der Entwickler für jede Sprache die entsprechenden Übersetzungen an. Zum Abschluss werden alle festcodierten Texte durch die dynamischen Konstanten und Nachrichten ersetzt. Die Vorgehensweise für Nachrichten und Konstanten ist analog. Deshalb werden in diesem Beispielprojekt lediglich die Konstanten übersetzt.

Implementierung Constants Interface

Zuerst implementiert der Entwickler im Client-Paket das Interface GreetingConstants, welches das Interface GWT-Constants erweitert (siehe Abbildung 6). Dieses Interface verbindet sich anhand des Klassennamens automatisch mit allen GreetingConstants*.properties-Dateien im Klassenpfad. Jede Konstante in der Datei properties muss über eine Methode im Interface bekannt gemacht werden. Die Standardwerte können mit der Annotation @DefaultStringValue angegeben werden. Zur Laufzeit nutzt GWT den Methodenaufruf in Verbindung mit der entsprechend lokalisierten Datei properties. Ohne explizit gesetzte Lokalisierung wählt GWT den annotierten Standardwert aus.

Erstellung der Übersetzungen

Internationalisierte Anwendungen können Sprachen verwenden, deren Zeichen nicht vollständig vom ASCII-Zeichensatz unterstützt werden. Deshalb sollte der Entwickler sicherstellen, dass die HTML-Host-Seite und die properties-Dateien UTF-8-codiert sind.

Die Anwendung soll durch eine deutsche Übersetzung erweitert werden. Dazu legt der Entwickler im Client-Paket die UTF-8-codierte Datei GreetingConstants_de.properties (siehe Abbildung 7) an. GWT identifiziert die Sprachdateien anhand von Ländersuffixen. Wenn keine Lokalisierung gefordert ist, wählt GWT die Standardsprache. Diese kann entweder durch die @DefaultStringValue Annotation im Interface oder mit einer properties-Datei ohne Sprachsuffix gesetzt werden.

Lokalisierte Texte nutzen

In dem GreetingService-Projekt müssen Strings im HTML-Quellcode der Host-Seite und im Programmcode dynamisch gesetzt werden. Der Titel des GreetingService steht im HTML-Quellcode. Dieser festcodierte Titel kann durch einen Marker ersetzt werden (siehe Abbildung 8), den GWT dann dynamisch befüllt. In Abbildung 9 sind die benötigen Anpassungen der Klasse Onews.java dargestellt, damit GWT die Konstanten nutzen kann. Als erstes intitialisiert der Entwickler mit GWT.create() (siehe Zeile 1) ein Objekt der Klasse GreetingConstants.

Die Methode onModuleLoad() wird aufgerufen, sobald die HTML-Seite samt Java-Script vom Browser geladen ist. Die Methode instanziert die GWT-Widgets und bindet die GWT-Inhalte in die HTML-Host-Seite ein. Zeile 3 ruft die Methode constants.greetingService() auf und setzt den zurückgelieferten String in den Marker greetingService ein. Sämtlicher, festcodierter Text wird im Folgenden durch die Konstanten ersetzt.Der GWT-Compiler liest die unterstützten Lokalisierungen aus der GWT Moduldefinition (Onews.gwt.xml) aus. Durch das Einfügen von <extend-property name="locale" values="de"/> wird GWT die deutsche Übersetzung bekannt gemacht. GWT verwendet zudem die länderspezifischen Datumsformatierungen und Zahlenkonventionen.

Alle nötigen Schritte zur Nutzung der internationalisierten Version sind abgeschlossen. Beim Aufruf der Seite wird zunächst die englische Standardversion angezeigt. Durch den Aufruf der Anwendung mit dem Parameter locale=de (siehe Abbildung 10) wird eine lokalisierte Version geladen.

Alternativ kann die Lokalisierung in den Meta-Informationen der HTML-Host-Seite durch den Eintrag <meta name="gwt:property" content="locale=de"> definiert werden. Wenn beide Einträge gesetzt sind, priorisiert GWT den URL-Parameter. Die entsprechende Lokalisierungseinstellung kann vom Benutzer manuell ausgewählt oder anhand der Browser-Einstellungen automatisch zugewiesen werden.

Fazit

Mit der Static String-Internationalisierung liefert GWT ein Mittel, mit dem sich GWT-Applikationen schnell und unkompliziert internationalisieren lassen. Die alternative Strategie Dynamic String kann bestehende Java Script Arrays aus einem internationalisierten Projekt mitnutzen. Durch eine eigene Implementierung des Localizable Interfaces, kann der Entwickler sein Projekt extrem flexibel an Internationalisierungsanforderungen anpassen. Die drei Strategien decken alle Anforderungen an multilinguale Applikationen ab. Für neue Projekte, die auf der grünen Wiese starten, sollten Entwickler in der Regel die Strategie Static String einsetzen.

Julian Gärtner (info@ordix.de).