Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional
107.3 Lokalisierung und Internationalisierung
http://creativecommons.org/licenses/by-nc-sa/3.0/de/Copyright (©) 2009 by M.Peichl. Dieses Werk oder, Michael Inhalt ist Peichl, unter [email protected] Creative Commons-Lizenz lizenziert. Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional
107.3 Lokalisierung und Internationalisierung
Beschreibung: Kandidaten sollten in der Lage sein, ein System in einer anderen Sprache als Englisch zu lokalisieren. Dazu gehört auch ein Verständnis dafür, warum LANG=C in Shellskripten nützlich ist
Die wichtigsten Wissensgebiete: ● LocaleEinstellungen ● ZeitzonenEinstellungen
Die wichtigsten Dateien, Bezeichnungen und Anwendungen: ● /etc/timezone ● /etc/localtime ● /usr/share/zoneinfo ● /usr/bin/locale ● tzselect, tzconfig ● iconv ● UTF8, ISO8859, ASCII, Unicode Umgebungsvariablen: ● LC_* ● LC_ALL ● LANG
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Überblick Durch die weltweite Vernetzung, hat die Internationalisierung und Lokalisierung von Linux stark an Bedeutung gewonnen, insbesondere da Linux nun im Begriff ist, zunehmend als DesktopSystem benutzt zu werden.
Internationalisierung und Lokalisierung werden wegen der Länge der beiden Wörter oft mit i18n und l10n abgekürzt. (Die Zahlen 18 und 10 entsprechen hier der Anzahl der weggelassenen Buchstaben in den englischen Wörtern ‘internationalization’ und ‘localization’).
Internationalisierung ist die Ausgestaltung eines Softwaresystems, so dass eine spätere Lokalisie rung möglich ist.
Lokalisierung« (engl. localization oder l10n) ist die Anpassung eines internationalisierten Systems an die Gepflogenheiten eines bestimmten Kulturkreises. Dazu gehörendie Sprache für die Benut zungsoberfläche und Meldungen des Systems, sowie die zu verarbeitenden Daten (die gegebenen falls besondere Schriften und Eingabemethoden benötigt), aber auch Aspekte wie standardisierte Schreibweisen für Datums und Zeitangaben, Geldbeträge, die Reihenfolge der Zeichen im Alphabet u.v.a.m.
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional
Zeichencodierungen Vorbedingung für die Internationalisierung und Lokalisierung von Programmen in fremden Spra chen (also „alles außer Englisch“) ist, dass das System den Zeichenvorrat der betreffenden Spra che anzeigen können muss.
● Der traditionelle Zeichencode für Computer war der ASCII (7BitCode) oder „American Standard Code for Information Interchange“, für amerikanisches Englisch gedacht. (128 verschiedene Zeichen, Ziffern und Sonderzeichen sowie Steuerzeichen wie „Zeilenvorschub“, „Tabulator“ oder „Glocke“).
● In Deutschland war die Zeichencodierung DIN 66003 gebräuchlich, die im wesentlichen dem ASCII ent sprach, bis darauf, dass die eckigen und geschweiften Klammern, der vertikale Balken und der Rückstrich durch Umlaute, die Tilde durch das scharfe S („ß“) und der Klammeraffe („@“) durch das Paragraphenzei chen ersetzt wurde. Das war für Texte annehmbar, aber nicht notwendigerweise für CProgramme.
● Die Masse internationaler Computeranwender brachte den Umstieg auf erweiterte Zeichensätze, die alle 256 möglichen Werte eines Bytes zur Zeichencodierung nutzten.
● Bedeutend ist hier der Standard ISO/IEC 8859, der Zeichencodierungen für viele verschiede ne Sprachen vorsieht. ISO/IEC 8859 besteht aus einer Anzahl von numerierten, separat ver öffentlichten Teilen, die auch als Standards angesehen werden können. Ziel: Informations austausch nicht elegante Typografie. Details zu den ISOStandards kann man in der Manpage nachschlagen: $ man iso_88591
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional
Quelle: LinupFront, 2009
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Unicode und ISO 10646 (Universal Charcter Set)
● Bemühungen, alle Alphabete der Welt in einer gemeinsamen Zeichencodierung zusammenzufassen. (1,1 Millionen Codepunkte möglich!) ● Beide Standards wurden zuerst getrennt entwickelt, aber dann – nachdem die Softwarefirmen der Welt heftigst gegen die Komplexität von ISO 10646 gemeutert hatten – zusammengelegt. ● Heute standardisieren Unicode und ISO 10646 dieselben Zeichen mit denselben Zeichencodes. ● Unterschiede: a) ISO 10646 ist eine reine Zeichentabelle ist (im Prinzip ein erweitertes ISO 8859) b) Unicode enthält Regeln für Sortierung, Normalisierung und bidirektionales Schreiben (für Arabisch / Hebräisch).
ISO 10646 ist quasi eine „Untermenge“ von Unicode; bei Unicode haben Zeichen noch diverse Zusatzeigenschaften, die zum Beispiel beschreiben, wie sich Zeichen sich mit anderen kombi nieren lassen (im Arabischen hängt das Aussehen eines Zeichens davon ab, ob es am Anfang, in der Mitte oder am Ende eines Worts steht).
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional ISO 10646 (2)
ISO 10646
● Buchstaben und Ziffern ● Zeichenvorrat (Ideogramme: etwa chinesische und japanische Zeichen) ● mathematische Zeichen u.v.a.m. ● Jedes Zeichen wird durch einen eindeutigen Namen und eine Ganzzahl, seinen Codepunkt, identifiziert. ● Codepunkte: Insgesamt stehen über 1,1 Millionen Codepunkte zur Verfügung, von denen praktisch nur die ersten 65.536 verwendet werden. Diese nennt man auch die basic multilingual plane oder BMP. ● Unicode bzw. ISO BMP 10646Codepunkte notiert man in der Form U+0040, wobei die vier Ziffern eine hexadezimale Zahl darstellen.
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Unicode und UTF8 Unicode stellt mit der Kodierung UTF8 (Unicode Transformation Format) heute den Sta tus Quo dar. Dabei wird jedem UnicodeZeichen eine speziell kodierte Bytekette von va riabler Länge zugeordnet. UTF8 unterstützt bis zu vier Byte, auf die sich wie bei allen UTFFormaten alle UnicodeZeichen abbilden lassen. Unicode ist in 17 Ebenen (Planes) zu je 16 Bit definiert: (siehe auch: man 7 utf8)
● Ebene 0: Basic Multilingual Plane (BMP), ist die wichtigste; sie enthält die Schriftzei chen aller lebenden Sprachen und der gebräuchlichen Sonderzeichen. ● Ebene 1: Supplementary Multilingual Plane (SMP) umfasst historische Schriftsysteme, sowie seltener verwendete Symbole, wie z.B. Dominosteine. ● Ebene 2: Supplementary Ideographic Plane (SIP) umfasst CJKVSchriftzeichen (CJKV=Chinesisch, Japanisch, Koreanisch, Vietnamesisch), die seltener benutzt werden ● Ebenen 313 sind noch nicht belegt ● Ebene 14: Special Purpose Plane (SSP )
Exkurs: UTF16 Verwendung z.B. auf IBMMainframes. Es verwendet ein oder zwei 16BitWörter für die Dar stellung eines Codepoints. UTF32 ist das einfachste UTFFormat: Es bildet jeden Codepoint der Ebene 0 (U+0000 bis U+FFFF) direkt (ohne variable Länge) ab. Es braucht aber für Texte, die auf dem lateini schen Alphabet basieren, etwa den vierfachen Speicherplatz.
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional iconv
Das Kommando iconv erlaubt die Konvertierung zwischen verschiedenen Zeichencodierungen. Im einfachsten Fall wandelt es den Inhalt einer auf der Kommandozeile benannten Datei von einer angegebenen Zeichencodierung in die aktuell gültige. Das Resultat landet auf der Stan dardausgabe:
$ iconv l (listet alle unterstützten Kodierungen auf) $ iconv f Quellkode t Zielkode Quelldatei o Zieldatei (konvertiert Quelldatei in Zieldatei) $ iconv f Quellkode t Zielkode Quelldatei(en) (mehrere Eingabedateien, Ergebnisse werden nacheinander auf der Standardausgabe ausgegeben)
● $ iconv f LATIN9 test.txt >testutf8.txt ● Sie können auch die gewünschte Zielcodierung angeben: $ iconv f UTF8 t LATIN9 testutf8.txt >testl9.txt ● Mit output (oder o) können Sie eine Datei für die Ausgabe auswählen: $ iconv f LATIN9 o testutf8.txt test.txt ● Ohne Eingabedateien liest iconv die Standardeingabe: $ grep bla test.txt | iconv f LATIN9 o grep.out
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Iconv (2)
Wenn iconv in seiner Eingabe auf ein Zeichen stößt, das es nicht in gültige Zeichen der gewünschten Ausgabecodierung übertragen kann, dann meldet es einen Fehler und bricht ab. Als Abhilfe können Sie an die Zielcodierung eines der Suffixe //TRANSLIT oder //IGNORE anhängen. Mit //IGNORE werden alle in der Zielcodie rung nicht vorhandenen Zeichen unter den Teppich gekehrt, während sie mit //TRANSLIT, wo möglich, durch ein oder mehrere ähnliche Zeichen approximiert werden:
$ echo xäöüy | iconv f UTF8 t ASCII//IGNORE xy iconv: ungültige Eingabe Sequenz an der Stelle 9 $ echo xäöüy | iconv f UTF8 t ASCII//TRANSLIT xaeoeuey
Option c unterdrückt ungültige Zeichen kommentarlos: $ echo xäöüy | iconv c f UTF8 t ASCII xy
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Spracheneinstellung unter Linux Die Sprache des LinuxSystems wird bei der Installation ausgewählt und i.d.R. später nicht mehr geändert.
● Die „Systemsprache“ ist keine Eigenschaft des kompletten Systems, sondern sie bezieht sich jeweils nur auf eine „Sitzung“. Normalerweise wird Ihre LoginShell oder Ihre Arbeit sumgebung mit einer bestimmten Spracheinstellung initialisiert, und alle Prozesse, die von dieser abstammen, „erben“ diese Einstellung. Es spricht also nichts dagegen, dass Sie das System mit einer deutschen Spracheinstellung verwenden, während gleichzeitig je mand über das Netz oder an einem anderen Bildschirm angemeldet ist, der eine englische oder französische Spracheinstellung benutzt. ● Maßgeblich für die Sprache einer Sitzung ist der Wert der Umgebungsvariablen LANG. Im einfachsten Fall besteht sie aus einem Sprachencode, gefolgt von einem Unterstrich, gefolgt von einem Ländercode ● de_DE (=Deutsch in Deutschland) ● de_AT (=Deutsch in Österreich) ● de_DE.ISO885915 (=Deutsch in Deutschland ISOLatin9) ● de_AT.UTF8 (=Deutsch in Österreich, basierend auf Unicode) ● de_DE@euro (=Deutsch in Deutschland, mit Euro (ISO Latin9)
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Auswirkung der Spracheinstellung pem@pem-lx:$ for i in de_DE de_AT en_US; do LANG=$i.UTF-8 date +"%x %X"; done 08.11.2009 12:38:28 2009-11-08 12:38:28 11/08/2009 12:38:28 PM
(%x und %X stehen bei „date“ für die Datums und Uhrzeitformate der jeweiligen Spracheinstellungen. Bei diesem Beispiel also DE, AT, US) Voraussetzung ist aber, dass die Sprachen überhaupt vorhanden sind!
Die Umgebungsvariable LANGUAGE ( = Unterschied zu LANG!) wird nur von Pro grammen beachtet, die die GNUgettextInfrastruktur verwenden, um ihre Meldungen in verschiedene Sprachen zu übersetzen (unter Linux die meisten). Der offensichtlichste Unterschied zwischen LANGUAGE und LANG ist, dass LANGUAGE es erlaubt, mehrere Sprachen aufzuzählen (durch Doppelpunkte ge trennt). Damit können Sie eine Präferenzliste angeben: LANGUAGE=de_DE.UTF8:en_US.UTF8:fr_FR.UTF8 bedeutet „Deutsch, oder sonst Englisch, oder sonst Französisch“. Die erste Sprache, für die ein Programm Systemmeldungen mitbringt, gewinnt. LANGUAGE hat (für Programme, die GNU gettext benutzen) Vorrang gegenüber LANG.
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Lokalisierungseinstellungen (LANG)
● Tatsächlich beeinflusst der Wert von LANG nicht nur die Sprache, sondern die komplette „kulturelle Einstellung“ eines LinuxSystems. Dazu gehören außerdem die Formatierung von Datums und Zeitangaben. ● Manche Länder (USA oder UK) nutzen eine 12StundenZeit, während in Konti nentaleuropa eine 24StundenZeit üblich ist. ● Formatierung von Zahlen und Geldbeträgen: In Kontinentaleuropa verwenden wir ein Komma als Dezimaltrenner und Punkte, um die Lesbarkeit einer großen Zahl zu erhöhen: 299.792.458,0 In den USA dagegen ist es gerade umgekehrt: 299,792,458.0 ● Sortierreihenfolge von Zeichen. Schon in Deutschland gibt es zwei konkurrie rende Methoden gemäß DIN 5007: In Lexika werden Umlaute als äquivalent zu ihren „Basiszeichen“ angesehen (ein „ä“ wird also für Zwecke der Sortierung als „a“ interpretiert), während in Namenslisten, zum Beispiel Telefonbüchern, Um laute gemäß ihrer „Ersatzschreibweise“ sortiert werden („ä“ also wie „ae“). In beiden Fällen ist „ß“ äquivalent zu „ss“«. In Schweden dagegen stehen die Buchstaben „å“, „ä“ und „ö“ in dieser Reihenfolge am Ende des Alphabets (hinter „z“). In Großbritannien kommt „ä“ nach „a“ (also zwischen „az“ und „b“) usw. ●
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional locale $ locale LANG=de_DE.UTF8 Voreinstellung, wird durch LC_* übergangen LC_CTYPE="de_DE.UTF8" Zeichenklassifizierung und Groß/Kleinschreibung LC_NUMERIC="de_DE.UTF8" Zahlendarstellung (nichtmonetär) LC_TIME="de_DE.UTF8" Zeit und Datenformate LC_COLLATE="de_DE.UTF8" Sortierreihenfolge LC_MONETARY="de_DE.UTF8" Zahlendarstellung (monetär) LC_MESSAGES="de_DE.UTF8" Sprache der Textausgaben eines Programms LC_PAPER="de_DE.UTF8" Papierformat LC_NAME="de_DE.UTF8" Namensformat LC_ADDRESS="de_DE.UTF8" Adress und Ortsangaben LC_TELEPHONE="de_DE.UTF8" Telefonnummern LC_MEASUREMENT="de_DE.UTF8" Maßeinheiten LC_IDENTIFICATION="de_DE.UTF8" Beschreibung der verwendeten Locale LC_ALL= Erzwingt die angegebene Locale für LC_*
Die Variable LANG wird man hier wohl am häufigsten benuzten: Sie bestimmt die Voreinstellung, falls die Variablen LC_* nicht gesetzt sind. Falls schon, so hat die Einstellungen der jeweiligen LC_Variable Vorrang gegenüber LANG. Ist dage gen LC_ALL nicht leer, so hat diese Vorrang gegenüber allen anderen Einstellungen, mit anderen Worten: Es werden dann sowohl die Einstellungen von LANG als auch LC_* nicht mehr berücksichtigt. Der Wert der Variablen muss mit dem Verzeichnisnamen eines Unterverzeichnisses von /usr/lib/locale/ übereinstimmen.
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Locale (2) Das Kommando „locale a“ liefert eine Liste von Werten, die das aktuelle System für LANG und die LC_*Variablen unterstützt: $ locale -a C de_AT.utf8 de_DE de_DE@euro de_DE.utf8 deutsch POSIX
Die magischen Werte C und POSIX (= äquivalent) beschreiben den fest eingebauten Standard, den Programme verwenden, wenn sie keine gültige andere Einstellung finden. Dies ist wichtig, wenn Sie mit Programmen wie „awk“ oder „cut d“ Felder in BashScripts auswerten wollen. Vergleichen Sie zum Bei spiel die 4 unterschiedlichen Rsultate: $ LANG=de_DE.UTF-8 ls -l /bin/ls -rwxr-xr-x 1 root root 92312 4. Apr 2008 /bin/ls $ LANG=ja_JP.UTF-8 ls -l /bin/ls -rwxr-xr-x 1 root root 92312 2008-04-04 16:22 /bin/ls $ LANG=fi_FI.UTF-8 ls -l /bin/ls -rwxr-xr-x 1 root root 92312 4.4.2008 /bin/ls $ LANG=C ls -l /bin/ls -rwxr-xr-x 1 root root 92312 Apr 4 2008 /bin/ls
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Zeitzonen
● Die Zeitzone auf einem LinuxSystem gehört zu den vererbbaren Eigenschaften eines Prozesses.
● Der LinuxKernel misst die Zeit in Sekunden seit dem 1.1.1970, 0 Uhr UTC, somit ist der Komplex „Zeitzone“ lediglich eine Frage der Formatierung dieser (inzwischen recht großen) Sekundenzahl.
● Ihr ProjektPartner aus Sydney, der sich über das Internet auf Ihrem Rechner anmeldet siehr die australische Zeit, während Sie selbst natürlich ME(S)Z verwenden.
● Die Voreinstellung für die Zeitzone, die Sie bei der Installation des Systems machen, hin terlegt Linux in der Datei /etc/timezone:
● $ cat /etc/timezone Europe/Berlin
● Die gültigen Zeitzonen können Sie den Namen der Dateien unter /usr/share/zoneinfo entnehmen (Darin sind viele Verzeichnisse enthalten)
● Namen der Zeitzonen (Städte) sind die bevölkerungsreichsten Städte der jeweiligen Zone. (z.B. Schweiz = Zürich, nicht die Hauptstadt Bern).
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Lokalisierung der Systemzeit
● /etc/localtime ist eine Kopie der BinärDatei unter /usr/share/zoneinfo, die die Um rechnungsroutinen für die Zeitzone enthält, die durch den Inhalt von /etc/timezone ge geben ist – zum Beispiel /usr/share/zoneinfo/Europe/Berlin.
● /usr/share/zoneinfo/ Dieses Verzeichnis enthält die Zeitumrechnungsroutinen (Winter/Sommerzeit, Unterschied zur UTC) zu allen Zeitzonen der Welt existiert eine zu gehörige Datei, wie z.B. /usr/share/zoneinfo/Europe/Berlin für Deutschland.
● /etc/timezone: Diese Datei enthält den Namen der lokalen Zeitzone und hat wenig Aus wirkung auf das System; sie sollte trotzdem nicht von Hand editiert werden. Sie wird vor allem in Debian Linux genutzt.
● #dpkgreconfigure tzdata Debian: Zeitzone setzen
● #tzconfig veraltet, jedoch für die LPIPrüfung noch relevant
● $tzselect Menügeführte Auswahl der Timezone
● $ export TZ=America/New_York Für eine Shell und alle Programme, die darin ausgeführt werden andere Zeitzone setzen
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Zusammenfassung ● Internationalisierung ist die Ausgestaltung eines Softwaresystems, so dass eine spätere Lokalisierung möglich ist.
● Lokalisierung ist die Anpassung eines internationalisierten Systems an die Gepflogenheiten eines be stimmten Kulturkreises.
● Gängige Zeichencodierungen unter Linux sind ASCII, ISO 8859 und ISO 10646 bzw. Unicode.
● UCS2, UTF8 und UTF16 sind Codierungsformen von ISO 10646/ Unicode
● Das Kommando iconv erlaubt die Umwandlung zwischen verschiedenen Zeichencodierungen.
● Die Sprache für einen LinuxProzess können Sie über die Umgebungsvariable LANG einstellen.
● Die Umgebungsvariablen LC_* steuern zusammen mit LANG die Lokalisierung eines LinuxProzes ses.
● Das Kommando locale gibt Ihnen Zugriff auf die Lokalisierungsinformationen.
● In Skripten sollten Sie LANG=C verwenden, um lokalisierungsspezifische Einflüsse auf das Verhalten von Standardkommandos auszuschließen.
● Die systemweite Zeitzone entnimmt Linux der Datei /etc/timezone.
● Pro Prozess könnte über die Umgebungsvariable TZ eine Zeitzone gesetzt werden
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Literatur
● Linupfront, 2009, grd2demanuallfnp
● Wikipedia
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Übungen
(1)Was erscheint als Ausgabe des Kommandos $ LANG=ja_JP.UTF8 date +"%B %Y"
(2)Stellen Sie sich vor, Sie sind Börsenmakler und brauchen einen schnellen Überblick über die Zeit in Tokyo, Frankfurt und New York. Wie können Sie das mit Linux verwirklichen?
(3)locales erzeugen, unter Debian: Fügen Sie eine Sprche zum System hinzu und entfernen Sie sie später wieder (4)Lassen Sie sich die locales anzeigen
(5)Temoprär persönliche Zeitzone einstellen: (mit tzselect) Europe/London
http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected]