[ 13. Juni 2013 ]

Sprachenwechsel und Neustart für Eclipse 4 Rich Client Applikationen

Autor: Beat Schaller

Ein Sprachenwechsel eines RCP Clients ist mit Eclipse 3.x immer mit einem Neustart verbunden. Mit Eclipse 4.x kann durch geschicktes Design der Restart vermieden oder mit wenig Aufwand und ohne Kompatibilitätsmodus elegant umgesetzt werden.

Der Sprachenwechsel in einem Rich Client hat sich auch mit Eclipse 4 nicht geändert, dynamisch wird er nach wie vor nicht unterstützt. Seit 2004 ist dieses Feature als Bug beschrieben [1]/[2]/[3]. Umgehungslösungen [4], die gewisse Unzulänglichkeiten beheben wurden publiziert und auch verwendet.

Nachfolgend zeige ich auf, wie ein Sprachenwechsel oder eine Sprachenauswahl mit und ohne Neustart elegant implementiert werden kann. In einer reinen Eclipse 4 Anwendung existiert der Neustart nicht mehr. In Blogpost [7] wird aufgezeigt wie ein Neustart auch mit Eclipse 4 einfach realisierbar ist.

Sample Applikation

Mit dem Eclipse Wizard erstellen wir die notwendigen Plugins für eine Sample Applikation.

Die Hauptfunktionalität liegt im application Bundle. Zusätzlich erstellen wir ein Fragment für die log4j Konfigurationsdatei.

ch.ipt.test.language.application
ch.ipt.test.language.log4j.config

Sprachenauswahl während dem Applikationsstart

Mit der in Blogpost [7] gezeigten Variante einer eigenen E4Application erscheint beim Start der Applikation ein Login Dialog für die Anmeldung am System. Dieser Login-Dialog kann mit wenigen Codezeilen um die Sprachauswahl ergänzt werden.

Abbildung 1: Login Dialog

In diesem Dialog wird die Default Locale gesetzt und gilt danach für die ganze Applikation.

cprivate void switchLocale(final Locale locale) {
      Locale.setDefault(locale);
      resetNlSuffixes();
      Messages.reloadMessages();
      setAllText();
      dialogComposite.layout();
}

Die aufgeführte Methode zeigt die einzelnen Schritte die durchgeführt werden müssen um auch den Login Dialog mehrsprachig anzuzeigen. Mit resetNlSuffixes() ermöglichen wir ein erneutes Laden der Messages [5]. In der Methode setAllText() werden alle sprachrelevanten Texte neu gesetzt. Ein layout() zeigt die Texte korrekt an.

Mit dieser Variante wird der Sprachenwechsel mit Hilfe einer Sprachauswahl umgangen und genügt in den meisten Fällen.

Sprachenwechsel mit Restart

Ein Sprachenwechsel ist wünschenswert, falls die Applikation kein Login implementiert und die Sprache im Rahmen des Startup ausgewählt werden soll und/oder falls die Sprachauswahl zu jedem Zeitpunkt während der Verwendung der Applikation angeboten werden soll.

Die Automatisierung des Neustarts mit ihren Tücken wurden mehrfach beschrieben und eine Lösung dafür angeboten [4]. Sie basiert auf dem Ersetzen der ini-Datei [6] verbunden mit einem Neustart der Applikation. Die in Blogpost [7] beschriebene Lösung für den Neustart lässt sich mit wenigen Ergänzungen auch hier verwenden.

@Override
public Object start(final IApplicationContext context) throws Exception
{
       // default normal exit
             context.getArguments().put(APPLICATION_EXIT, EXIT_OK);<

       LOG.debug("login");
       final LoginDialog dialog = new LoginDialog(null);
       dialog.create();
       final int retDialogCode = dialog.open();
       if (retDialogCode == Window.OK) {
              // Login done
      } else if (retDialogCode == IApplication.EXIT_RESTART) {
      ret = IApplication.EXIT_RESTART;
      } else {
              return ret;
      <}

      try {
              e4app = new E4Application();
              e4app.start(context);
              ret = (Integer) context.getArguments().get(APPLICATION_EXIT);
       } catch (final Exception e) {
              e.printStackTrace();
       }

       return ret;
}

Der Sprachenwechsel lässt sich nun ganz einfach bewerkstelligen. Im Application Model Editor können die Menüeinträge vorgenommen werden. 

Die dazu benötigten Handler werden um die notwendigen Codezeilen ergänzt.

@SuppressWarnings("restriction")
public class LangGermanHandler {
       @Execute
       public void execute(final IWorkbench workbench, final IApplicationContext appContext) {
             final LanguageSwitchHelper switcher = new LanguageSwitchHelper();
             if (switcher.changeLocale(Locale.GERMAN)) {
                     doRestart(workbench, appContext);
             }
       }

       @SuppressWarnings("unchecked")
       private void doRestart(final IWorkbench workbench, final IApplicationContext appContext) {

appContext.getArguments().put(LangE4Application.APPLICATION_EXIT, IApplication.EXIT_RESTART);
             workbench.close();
       }
}

Das Bindeglied zwischen MyE4Application und Workbench bildet der ApplicationContext, der in den Handler injected werden kann. Damit ist es auch nicht notwendig über eine statische Methode auf MyE4Application zuzugreifen um einen Restart anzumelden. Mit dem Schliessen der Workbench kehren wir zurück in MyE4Application und starten die Applikation neu analog dem P2 Update in Blogpost [7].

Fazit

Eine Sprachenauswahl im Login Fenster erspart den Neustart und kann bereits vor dem LifeCycleHandler vorgenommen werden. Wird ein Sprachenwechsel nach dem Starten der Workbench verlangt kann auch ohne Kompatibilitätslayer einfach neu gestartet werden. Wie bereits in Blogpost [7] erwähnt – Eclipse 4 ist ohne Kompatibilitätslayer bereits jetzt für den produktiven Einsatz bestens geeignet.

Referenzen

[1] Bug Support switching locale on the fly, bugs.eclipse.org/bugs/show_bug.cgi?id=75320

[2] Support multiple locales, bugs.eclipse.org/bugs/show_bug.cgi?id=275658

[3] Ensure NLS class handles multiple simultaneous locales, bugs.eclipse.org/bugs/show_bug.cgi?id=226340

[4] Kai Tödter, www.toedter.com/blog/?p=19

[5] Changing the locale in OSGi during runtime, techblog.goelite.org/changing-the-locale-in-osgi-during-runtime

[6] LanguageSwitchHelper.java

[7] Eclipse 4 Rich Client Applikationen mit P2 automatisch aktualisieren. [ipt] Blogpost. Beat Schaller. 29.04.2013.


Gastautor

Beat Schaller ist IT-Architekt bei der [ipt]. Er verfügt über langjährige Erfahrung mit Eclipse RCP 3.x/4.x und JEE Server Applikationen in Grossprojekten. Seine Schwerpunkte liegen in der Analyse, dem Design, der Architektur und in der Implementierung von Client und Server sowie deren Integration mit Umsystemen.

Diesen Artikel kommentieren

Wir sind sehr an einer offenen Diskussion interessiert, behalten uns aber vor, beleidigende Kommentare sowie solche, die offensichtlich zwecks Suchmaschinenoptimierung abgegeben werden, zu editieren oder zu löschen.