Eclipse RCP
20.09.2010 - 24.09.2010, Hamburg
git
07.10.2010 - 08.10.2010, Essen
Eclipse RCP

Mehrsprachige Anwendungen

Eclipse RCP-Anwendungen können über die Auslagerung der Texte in Property-Dateien (Java Resource Bundles) übersetzt werden. Je Sprache ist dabei eine Property-Datei mit Texten für die jeweilige Sprache bzw. das jeweilige Locale anzulegen. Die Auflösung der Texte erfolgt gemäß der Anwendungssprache mit Fallback auf allgemeinere Locales. Es empfiehlt sich daher, eine Standardsprache zu definieren und die Texte für diese in einer Property-Datei ohne Locale-Angabe abzulegen:

messages.properties         -> Standard-Sprache (z.B. Englisch)
messages_de.properties      -> Alle deutschen Übersetzungen
messages_de_AT.properties   -> Länderspezifische Besonderheiten Österreich
messages_fr.properties      -> Französische Übersetzungen

Fragments

Die Properties-Dateien mit den Übersetzungen können im Plug-in selbst oder in sog. Fragments abgelegt werden. Fragments stellen eine optionale Ergänzung zu einem Host-Plug-in dar. Zur Laufzeit sind die Inhalte der Fragmente so sichtbar, als wären Sie im Host-Plug-in selbst abgelegt. So können Plug-ins nachträglich mit zusätzlichen Ressourcen wie Property-Dateien ergänzt werden.

Die Verwendung von Fragments bietet sich vor allem an, um die Übersetzungen von den Plug-ins der Anwendung separat zu halten oder mehrere, unabhängige Sprachpakete anzubieten.

Plug-in-Dateien übersetzen

Texte in den MANIFEST.MF und plugin.xml-Dateien können über %someKey-Platzhalter übersetzt werden:

<extension point="org.eclipse.ui.perspectives">
    <perspective name="%somePerspectiveName">
        <!-- ... -->
    </perspective>
</extension>

Seit Eclipse 3.5 werden die Übersetzungen für diese Keys standardmäßig in einem Resource Bundle unter OSGI-INF/l10n/bundle.properties abgelegt. Das Resource Bundle kann sich auch an einem anderen Ort befinden, dann muss im Manifest mit Bundle-Localization ein Pfad spezifiziert werden:

Bundle-Localization: OSGI-INF/l10n/bundle

Vor Eclipse 3.5 war der Standardwert für Bundle-Localizationplugin”, die Übersetzungen wurden so aus einer Datei /plugin.properties (zusammen abgelegt mit der plugin.xml) geladen.

Die Resource Bundle-Dateien können sich entweder im Plug-in selbst oder in optionalen Fragmenten befinden:

Eclipse PDE stellt zum Extrahieren der Texte aus plugin.xml-Dateien mit PDE Tools > Externalize Strings einen praktischen Assistenten bereit:

Strings im Code übersetzen

Strings aus Resource Bundles erreichen Sie über den Eclipse-eigenen Übersetzungsmechanismus NLS. Dazu werden Klassen mit statischen Konstanten für den Zugriff auf die Texte generiert:

public class Messages extends NLS {

    private static final String BUNDLE_NAME = "com.example.somebundle.messages";

    public static String SomeString;
    public static String SomeOtherString;

    static {
        // initialize resource bundle
        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
    }

}

Die Resource Bundles werden dabei anhand des BUNDLE_NAME aufgelöst. Diese Angabe bezieht sich nicht auf OSGi Bundles - es handelt sich um die Angabe eines Packages + Dateiname. Obige Message-Klasse würde im Classpath des Plug-ins nach com/example/somebundle/messages*.properties suchen.

Auch diese Strings können mit Source > Externalize Strings automatisch extrahiert werden:

Verwendung von Platzhaltern in Übersetzungen

In den Resource-Bundle-Texten können Platzhalter verwendet werden:

SomeMessage=\"{0}\" is the message!
SomeOtherMessage={0} is {1}!
YetAnotherOtherMessage={0} and {1} are {2}!

Die entsprechenden Texte werden durch Aufruf von NLS.bind eingesetzt:

message = NLS.bind(Messages.SomeMessage, obj)
message = NLS.bind(Messages.SomeOtherMessage, obj1, obj2);
message = NLS.bind(Messages.YetAnotherOtherMessage, new Object[] {obj1, obj2, obj3});

Texte aus der Plattform übersetzen

Für alle Texte der Plattform-Plugins stellt das Eclipse Babel-Projekt Übersetzungen bereit, die der Target Platform hinzugefügt werden können, um die Plattform selbst zu übersetzen.

Sprache festlegen

Die Sprache wird beim Start der Anwendung einmalig festgelegt. In den Standard-Programmargumenten der Startkonfiguration wird die Sprache auf die Sprache der IDE konfiguriert:

-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}

Für target.nl kann ein beliebiges Java-Locale angegeben werden, um die Anwendung in einer bestimmten Sprache zu testen. Erfolgt keine Locale-Angabe mit den Programmargumenten, wird das Standard-Java-Locale verwendet, welches von Java automatisch plattformabhängig aus den Ländereinstellungen des Betriebssystems ermittelt wird.

Über Ihre Kommentare und Hinweise freue ich mich sehr:
Ralf Ebert | Eclipse RCP Buch | Mehrsprachige Anwendungen