Programmierung

I18n & L10n – Internationalisierung und Lokalisierung (Teil 2)

Im zweiten Artikel zum Themenkomplex Internationalisierung und Lokalisierung widme ich mich der Lokalisierung von Zahlenwerten, das heißt der Darstellungsanpassung von ganzen Zahlen, Dezimalzahlen, Datums- und Zeitwerten und Währungsformaten. Im ersten Teil habe ich bereits die Übersetzung von Zeichenketten beleuchtet.

Locale-Objekt

Zur Anpassung der Darstellung von Zahlen stellt uns CONZEPT 16 ein Objekt mit sprach- und landesspezifischen Einstellungen zur Verfügung: Das Locale-Objekt. Es verfügt über eine Reihe von Eigenschaften mit denen die Darstellung von Zahlen-, Datums- und Zeitwerten und Währungsformaten beeinflusst werden kann.

Ein Locale-Objekt kann über die Funktionen LocaleLoad() geladen werden:

LocaleLoad(
  LangID    : int; // Sprache
  SubLangID : int; // Land
) : handle         // Locale-Objekt

Über die Parameter “LangID” und “SubLangID” wird die Sprache und das Land der zu ladenden Einstellungen definiert.

Beispiel
// Sprach- und landesspezifische Einstellungen
// für English (U.S.) laden
tLocale # LocaleLoad(_LclLangEnglish, _LclSubLangEnglishUS);

Mit der Funktion LocaleUnload() kann ein geladenes Locale-Objekt wieder freigegeben werden.

LocaleUnload(
  Locale : handle; // Locale-Objekt
)
Beispiel
// Sprach- und landesspezifische Einstellungen freigeben
tLocale->LocaleUnload();

Nach dem Laden eines Locale-Objektes können dessen Eigenschaften abgefragt oder bei Bedarf auch angepasst werden. Letzteres ist beispielsweise dann sinnvoll, wenn vom Standard abweichende Datums- oder Zeitwerte benötigt werden.

Beispiel
// Datumsformat anpassen
tLocale->spLclDateSFormat # 'd. MMMM yyyy';
// Währungssymbol ermitteln
tCurrSymbol # tLocale->spLclCurrSymbol;

Ein geladenes Locale-Objekt kann mit der Funktion LocaleSelect() instanziert werden. Danach ist es global verfügbar und wird für sämtliche Zahlendarstellungen berücksichtigt.

LocaleSelect(
  Locale : handle; // Locale-Objekt
)
Beispiel
// Sprach- und landesspezifische Einstellungen instanzieren
tLocale->LocaleSelect();

Ist kein Locale-Objekt instanziert, werden die Einstellungen des Betriebssystems bei der Darstellungsanpassung berücksichtigt.
Alternativ oder zusätzlich zur globalen Instanz des Locale-Objektes kann für jede Zahlendarstellung ein individuelles Locale-Objekte geladen und zugeordnet werden.

Oberfläche

Alle Eingabeobjekte für zahlenbasierte Inhalte, wie das IntEdit-, das DecimalEdit- und das TimeEdit-Objekt, verfügen über die Eigenschaft wpLocale, der ein Locale-Objekt zugewiesen werden kann, um die Darstellung anzupassen. Das Column-Objekt für Spalten in RecList- DataList- und RecView-Objekten besitzt ebenfalls diese Eigenschaft um die dargestellten Zahlenwerte anzupassen. Außerdem kann damit bei GanttGraphAxis- und StatusBarButton-Objekten die Anzeige von Zahlenwerten über Makros gesteuert werden.

Beispiel
// DecimalEdit lokalisieren
$:mePrice->wpLocale # tLocale;
// IntEdit lokalisieren
$:ieStock->wpLocale # tLocale;

Auf den nachfolgenden Bildern sehen Sie einige Beispiele lokalisierter Zeichenketten und Zahlenwerte in der Oberfläche.

Beschriftungen und Zahlen in Deutsch
Beschriftungen und Zahlen in Englisch
Beschriftungen und Zahlen in Französisch

Konvertierung

Zur Ausgabe von Zahlenwerten in Zeichenketten steht ein Satz von Konvertierungsfunktionen zur Verfügung mit denen ein Zahlenwert, unter Berücksichtigung eines Locale-Objektes, in eine repräsentierende Zeichenkette gewandelt werden kann.

Beispiele
// ganze Zahl wandeln
// de: 1.234
// en: 1,234
CnvAI(1234, _FmtNone, tLocale)

// Dezimalzahl wandeln
// de: 1.234,56
// en: 1,234.95
CnvAM(1234.56\m, _FmtNone, tLocale)

// Datum wandeln
// de: Freitag 9. September 2011
// en: Friday, September 09, 2011
CnvAD(09.09.2011, _FmtDateLong, tLocale)

Für den umgekehrten Weg, der Konvertierung einer Zeichenkette in einen Zahlenwert, stehen ebenfalls Funktionen zur Verfügung die durch Übergabe eines Locale-Objektes eine lokalisierte Wandlung vornehmen.

Beispiel
// Datum wandeln
// de (Tag-Monat-Jar): 4. Mai 2011
// en (Monat-Tag-Jahr): 5. April 2011
CnvTA('04.05.2011', _FmtNone, tLocale)

Implementierung

Das im ersten Teil vorgestellte Modul zur Lokalisierung SysLcl stellt das zur Sprach- und Landeskennung gehörige Locale-Objekt über die Funktion Lcl.Locale() zur Verfügung.

Beispiel
// Sprach- und Landeskennung setzen
Lcl.Target('enUS');
// Sprach- und landesspezifische Einstellungen ermitteln
tLocale # Lcl.Locale()

Fazit

Mit dem Locale-Objekt steht Ihnen ein universelles Objekt zur Lokalisierung Ihrer Anwendungen zur Verfügung. Sie können es global instanzieren, um es bei jeder Zahlendarstellung zu berücksichtigen, oder für individuelle Anpassungen weitere Objekte laden und zuordnen. Es lässt sich einfach und unter geringem Aufwand integrieren.

4 Kommentare

4 Kommentare “I18n & L10n – Internationalisierung und Lokalisierung (Teil 2)”

  1. ich kann mich Billy nur anschliessen.

    Vielleicht kann man diese informativen Artikel, die meist aus mehreren Teilen bestehen, auch in der nächsten Hilfedatei zu C16 als zusätzliche Hilfen aufnehmen. Dann hätte man die Information zusammenhängend an einem Platz. Interessant wäre hier z.B. diese Artikelserie oder die Serie über die Testerstellung oder die Druckjobs oder …
    Ihr macht wirklich gute Arbeit. Danke.

Kommentar abgeben