
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).
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.
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.
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.
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.
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.
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).