~~Title: Multilingual Support~~ Multilingual support is integrated in JVx´s core components. Each component allows the translation of text without further effort. All components that display text, such as Button, Menu, MenuItem, or Label, individually handle the translation of the displayed text. The developer only has to translate user-defined outputs, such as messages, questions, error messages, etc. A single method call, or ideally the translation of the text itself, is sufficient. The translation mechanism does not require special text keys. We recommend developing the application in one language and creating the translation separately, either in parallel or after completion. == Usage == All of the text in an application we have created is in German. However, we just found out that English also has to be supported. This requirement was not known at the time of development. The following source code represents a frame with a table, groupbox, and buttons: public class DBEditFrame extends UIInternalFrame { ... ... /** * Initializes the UI. *

* @throws Exception if the initialization throws an error */ private void initializeUI() throws Exception { UIGroupPanel group = new UIGroupPanel(); group.setText("Alle Kontakte"); group.setLayout(new UIBorderLayout()); UIGroupPanel groupBut = new UIGroupPanel(); groupBut.setText("Optionen"); group.setLayout(new UIFlowLayout()); UITable table = new UITable(); table.setDataBook(rdbContacts); UIButton butNew = new UIButton("Neuer Kontakt"); UIButton butDel = new UIButton("Löschen"); group.add(table); groupBut.add(butNew); groupBut.add(butDel); //same behaviour as centered component in BorderLayout setLayout(new UIBorderLayout()); add(group, UIBorderLayout.CENTER); add(groupBut, UIBorderLayout.EAST); setTitle("Kontakte"); setSize(new UIDimension(600, 500)); } ... ... } // DBEditFrame The translation can be defined centrally or by component. "By component" means that each component can use different translations for identical texts. A central translation always uses the same translation for identical texts. If a component does not use its own translation, a translation is automatically requested from the parent component. In this case the translation is defined centrally at the highest (i.e. application) level: private void loadTranslation() { InputStream isTranslation = null; try { //load the locale specific translation isTranslation = ResourceUtil.getResourceAsStream ("/apps/firstapp/translation_en.xml"); //load the default translation if (isTranslation != null) { TranslationMap map = new TranslationMap(); Properties properties = new Properties(); properties.loadFromXML(isTranslation); map.setAsProperties(properties); getLauncher().setTranslation(map); } } catch (Exception e) { debug(e); } finally { if (isTranslation != null) { try { isTranslation.close(); } catch (Exception e) { //nothing to be done } } } } At a minimum, the translation file contains the following: All contacts Options New contact Delete Contacts \\ **Note** The showcase application allows switching between German and English. A full integration of the translation can be viewed in the source code. The following translation file is used: Showcase Applikation* Anmeldung Willkommen Passwort ändern Anmeldeinformationen prüfen Sitzung ist abgelaufen! Passwort wurde geändert! Bitte ein neues Password eingeben und bestätigen. Bitte Ihren Benutzernamen und Passwörter eingeben. Bitte Ihren Benutzernamen und Passwort eingeben. Benutzername: Passwort: Passwort (neu): Passwort (bestätigen): Anmelden Ändern Abbruch Datei Anmeldung Abmelden Passwort ändern Beenden B Bearbeiten Speichern S Rückgängig Wiederherstellen Aktualisieren Fenster Karteireiter Ansicht Fenster Ansicht Alle Fenster schließen Hilfe Inhaltsverzeichnis Hilfe zu... Über... Hilfe generieren Applikationsinformationen* Die Karteireiter beinhalten zusätzliche Informationen. Über System Log Verwendete Logger Log Stufe Verbindung Parameter Wert OK Information Warnung Fehler Frage OK Abbruch Ja Nein Fehlerursache(n) OK Details Speichern unter... Datei öffnen Bitte wählen Sie die gewünschte Datei: Upload Beim Speichern der Daten ist ein Fehler aufgetreten! Möchten Sie dennoch das Fenster verlassen? Ungültiges Passwort für Benutzer '*0' Der Benutzer '*0' ist nicht mehr gültig! Der Benutzer '*0' wurde deaktiviert! Der Benutzer '*0' ist unbekannt! Das Sicherheitssystem kann keine Anmeldung durchführen! Das alte Passwort ist ungültig! Das Sicherheitssystem kann die Passwort Änderung nicht durchführen! Das neue Passwort muss sich vom alten Passwort unterscheiden! Bitte ändern Sie Ihr Passwort! Die neuen Passwörter sind unterschiedlich! Das neue Passwort darf nicht "leer" sein! Konfigurationsfehler: Fehlende Bezeichnung des Datenbanktreibers! Konfigurationsfehler: Fehlender Verbindungsdeskriptor! Konfigurationsfehler: Datenbank Anmeldedaten sind ungültig! Konfigurationsfehler: Datenbank Anmeldedaten sind ungültig! Konfigurationsfehler: Datenbanktreiber wurde nicht gefunden! Die Verbindung zur Datenbank kann nicht hergestellt werden! Der Sicherheitsmanager kann nicht verwendet werden! Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an! Ungültige Sitzungskennung! Die Sitzung ist nicht länger gültig! Die Methode '*' wurde nicht gefunden! Das Objekt '*' wurde nicht gefunden! Das Objekt '*' wurde nicht initialisiert! Undefinierte Objektbezeichnung! Die Sitzung wurde nicht gefunden! Die Sitzung wurde bereits geöffnet! Ein asynchroner Aufruf ist nicht erlaubt! Die Server Anfrage enthält ungültige Parameter! Die Serialisierung für die Server Anfragen wurde nicht gefunden! Ungültige Server-Anfragekennung! Die Maske '*' wurde nicht gefunden! Aufgrund von Sicherheitseinstelllug ist es nicht erlaubt die Maske zu öffnen! Die Kommunikation zum Server wurde unterbrochen! Einfügen Löschen Exportieren Kontakt Kontakte Ausbildung Schulung Schulungen Stammdaten Suchen Anrede Titel Vorname Nachname Strasse Land PLZ Ort Geb. SVNr Versicherung Dateiname Bild Sprache Benutzeroberfläche Tabellen Komponenten Blättern Oben* Links* Rechts* Unten* Schließen* Verschieben* Text Komponenten Gesperrt Standard Nicht änderbar Nicht änderbar * Deaktiviert Textfeld Textfeld (farbig) Passwort Auswahl (Text) Auswahl (Datum) Textbereich Tab Ansicht Kontroll Fenster Schließbares Fenster Modales Fenster MODALES Fenster öffnen Schließen Kopieren Aktiviert Gewählt Gewählt deaktiviert Kein Rahmen Feststell Button Nachrichten Neu Sub deaktiviert Einfach Einfach Checkbox deaktiviert Deaktiviert Neuer Detail Datensatz Bundesland Bezirk Detail zum Master Detail zum Detail Information anzeigen Warnung anzeigen Frage anzeigen Fehlermeldung anzeigen Ausnahmefall anzeigen Eine einfache Information ! Es sollte in Ordnung sein ... ! Alle Änderungen speichern ? Ein Fehler trat auf ! Ein unerwarteter Fehler! The definition: Ungültiges Passwort für Benutzer '*0' demonstrates the wildcard mechanism for translations. Variable text passages are defined using *. If multiple wildcards are used, text can be accessed via index (beginning with 0).