Programmierung

I18n & L10n – Internationalisierung und Lokalisierung (Teil 1)

Immer häufiger wird an Software die Anforderung gestellt, in mehreren Sprachen verfügbar zu sein, um sie am internationalen Markt besser platzieren zu können. Die wesentlichen Arbeitsschritte zur Implementierung von Mehrsprachigkeit sind die Internationalisierung und die Lokalisierung.

In diesem und folgenden Artikeln stelle ich Ihnen einige Möglichkeiten vor, wie Mehrsprachigkeit in CONZEPT 16-Applikationen realisiert werden kann.

Begriffserklärung

Internationalisierung

Unter dem Begriff Internationalisierung (engl. internationalization, abgekürzt als i18n; 18 Buchstaben zwischen i und n) versteht man das sprachunabhängige Design einer Software, um sie später einfacher für eine gewünschte Sprache verfügbar zu machen. Die Internationalisierung ist also ein einmaliger Entwicklungsschritt zur Vorbereitung auf die Lokalisierung. Dazu gehört unter anderem die Vermeidung von fest zugewiesenen Beschriftungen bei Oberflächenobjekten. Stattdessen müssen diese sprachabhängigen Texte über Variablen oder Funktionen zur Laufzeit der Software zur Verfügung gestellt werden.

Lokalisierung

Nach der Internationalisierung der Software kann die Lokalisierung (engl. localization, abgekürzt L10n; 10 Buchstaben zwischen L und n) erfolgen. Die Lokalisierung beschreibt die Übersetzung der mit der Internationalisierung eingefügten, sprachunabhängigen Variablen bzw. Funktionen in eine gewünschte Zielsprache. Die Lokalisierung muss einmal pro Sprache durchgeführt werden und muss idealerweise nicht vom Programmierer vorgenommen werden, sondern kann auch durch einen Übersetzer erledigt werden. Neben der Übersetzung von Texten gehört auch die Anpassung der Darstellungen von Zahlenwerten, wie ganzen Zahlen, Dezimalzahlen, Datums- und Zeitwerten und Währungsformaten zur Lokalisierung, und zwar sowohl für die Eingabe als auch für die Ausgabe solcher Werte.

Übersetzung

In diesem ersten Artikel zu diesem Themenkomplex beleuchte ich die Übersetzung von Zeichenketten. Zeichenketten kommen beispielsweise in Dialogen für Beschriftungen (Eigenschaft wpCaption), Hilfetexte (Eigenschaft wpHelpTip) und für Meldungsfenster (Funktion WinDialogBox()) zum Einsatz. Am Ende des Artikels finden Sie als Download das Modul SysLcl, ein Implementierung zur Lokalisierung von CONZEPT 16-Anwendungen, sowie ein Beispiel zur praktischen Anwendung.
Zur Übersetzung von Zeichenketten stellt das Modul SysLcl die Funktion Lcl.T() zur Verfügung:

Lcl.T(
  aStrText     : alpha(4096); // zu übersetzender Text
  opt aStrOpt1 : alpha(4096); // Argument 1
  opt aStrOpt2 : alpha(4096); // Argument 2
  ...
)
: alpha; // übersetzter Text

Als Parameter wird der zu übersetzende Text übergeben. Optional nimmt die Funktion auch weitere Parameter als Argumente für die Zeichenkette entgegen. Die Argumente ersetzen in dem übersetzten Text vorhandene Platzhalter.

Beispiele
// Sprach- und Landeskennung setzen
Lcl.Target('enUS');

// de: Anrede
// en: Title
$:lbTitle->wpCaption # Lcl.T('Anrede');

// de: Hr.
// en: Mr.
$:dlTitle->WinLstDatLineAdd(Lcl.T('Hr.'));

// de: Fr.
// en: Mrs.
$:dlTitle->WinLstDatLineAdd(Lcl.T('Fr.'));

// de: Kontakt löschen
//     Soll der Kontakt "..." gelöscht werden?
// en: Delete contact
//     Do you want to delete the contact "..."?
// Der Plathalter \1 wird durch den Inhalt von tInfo ersetzt
WinDialogBox(0,
  Lcl.T('Kontakt löschen'),
  Lcl.T('Soll der Kontakt "\1" gelöscht werden?', tInfo),
  _WinIcoQuestion,
  _WinDialogYesNo,
  1
);

Die Funktion Lcl.Target() setzt die Sprach- und Landeskennung der Übersetzung, in diesem Fall Englisch (U.S.).
Die Übersetzungen werden über eine Callback-Funktion ermitteln und in einer assoziativen Liste (CteNode-Objekt) gespeichert. Innerhalb der Callback-Funktion können die Übersetzungen beispielsweise über eine Datenbanktabelle abgefragt und zurückgeliefert werden. Dadurch, dass die übersetzten Texte in einer Liste gecached werden, muss die Callback-Funktion für jeden zu übersetzenden Text nur einmal aufgerufen werden. Dies verringert die Anfragen an die Datenbank.
Zur weiteren Optimierung der Laufzeit sollte die Funktion Lcl.T() nur bei Bedarf aufgerufen werden, also nur für Zeichenketten, die auch tatsächlich angezeigt werden. Bei großen Dialogen mit vielen Unterobjekten wie NoteBook- und GroupSplit-Objekten ist es beispielsweise sinnvoll, die Übersetzungen erst durchzuführen, wenn die Objekte sichtbar werden.
Für Sprachen, die Zeichen außerhalb des CONZEPT 16-Zeichensatzes beinhalten, können auch Unicode-Zeichenketten im UTF8-Format verarbeitet werden. Bei der Übersetzung von Dialogen müssen diese dabei mit Unicode-Unterstützung gespeichert sein und bei der Verwendung eines Meldungsfensters mit WinDialogBox() muss die Option _WinDialogUTF8 angegeben werden. Außerdem ist darauf zu achten, dass für sämtliche Übersetzungen einer Zeichenkette genug Anzeigefläche zur Verfügung steht. Das heißt, dass zum Beispiel Label-Objekte eine ausreichende Breite einnehmen müssen, sonst werden lange Übersetzungen unter Umständen abgeschnitten dargestellt. Das Modul SysLcl kann nicht nur in Dialogen verwendet werden, sondern ermöglicht etwa auch die Lokalisierung einer auf dem SOA-Service basierenden Web-Applikation.
Auf den nachfolgenden Bildern können Sie anhand eines Beispiels sehen, wie sich die Beschriftungen des Dialoges, abhängig von der gewählten Sprache ändern.

Beschriftungen in Deutsch
Beschriftungen in Englisch
Beschriftungen in Französisch

Modifizierungen

Anstelle des zu übersetzenden Textes könnte an eine modifizierte Implementierung der Funktion Lcl.T() auch eine eindeutige ID oder ein eindeutiger Name für die zu übersetzende Zeichenkette übergeben werden. Die drei Varianten haben die folgenden Vor- und Nachteile:

  • Übergabe der zu übersetzenden ZeichenketteLcl.T(aStrText : alpha) : alpha
    • Vorteil: Bei einer bereits bestehenden Applikation können alle Zeichenketten durch die Funktion Lcl.T() gekapselt werden und müssen für die Sprache im Quelltext nicht mehr übersetzt werden.
    • Nachteil: Gleiche Zeichenketten werden in unterschiedlichen Kontexten gleich übersetzt (“von” wird z.B. ins Englische in jedem Kontext mit “from” übersetzt, statt in manchen Fällen mit “by”).
  • Übergabe einer eindeutigen IDLcl.T(aID : int) : alpha
    • Vorteil: Der Index der assoziativen Liste bleibt klein und kann somit schneller verarbeitet werden als bei langen Zeichenketten.
    • Nachteil: Für jede Zeichenkette muss eine sie repräsentierende ID vergeben werden, z.B. per define.
  • Übergabe eines eindeutigen NamensLcl.T(aName : alpha) : alpha
    • Vorteil: Im Gegensatz zur Übergabe einer ID, muss im Fall eines Namens keine ID vergeben werden, der Name dient zur eindeutigen Identifizierung.
    • Nachteil: Der Index der assoziativen Liste kann, je nach gewählter Länge der Namen, größer werden als bei der Verwendung von IDs.
Beispiele
// Übergabe der zu übersetzenden Zeichenkette
Lcl.T('Anrede')

// Übergabe einer eindeutigen ID
Lcl.T(_Lcl.ContactTitle) // _Lcl.ContactTitle : 1

// Übergabe eines eindeutigen Namens
Lcl.T('contact.title')

Eine weitere Möglichkeit Dialoge zu lokalisieren besteht in der Verwendung der Funktion WinSave(). Dabei werden die Beschriftungen der Objekte zur Laufzeit einmalig für eine Sprache gesetzt und der Dialog anschließend wieder in der Datenbank gespeichert. Beim Aufruf des Dialoges in der Applikation sind dessen Objekte bereits übersetzt. Eine Lokalisierung zur Laufzeit ist damit nicht mehr notwendig.
Welche Variante zu bevorzugen ist, hängt von der Entwicklungsphase, der Größe der zu lokalisierenden Applikation und der Anzahl der benötigten Übersetzungen ab.

Fazit

Internationalisierung und Lokalisierung kosten Zeit. Mit dem richtigen Ansatz und einer passenden Technik dahinter ist der damit verbundene Aufwand aber gut kalkulierbar. Nach der Internationalisierung Ihrer Applikation können Sie sie mit wenig Mühe für jede gewünschte Sprache lokalisieren. Mit dem Modul SysLcl haben Sie eine performante und flexible Technik zur Übersetzung von Zeichenketten zur Hand.

Im nächsten Artikel werde ich auf die Lokalisierung von Zahlenwerten unter Verwendung des Locale-Objektes eingehen.

Download

Zum downloaden hier klicken SysLcl-1.1.zip (5.14 KB)
Sie müssen angemeldet sein, um die Datei herunterladen zu können.
Keine Kommentare

Kommentar abgeben