Lokalisierung (Internationalisierung) eines GNU/Linux-Systems

Wir wird ein GNU/Linux-System in einer anderen Sprache als Englisch lokalisiert? Warum ist LANG=C in Shell-Scripten hilfreich? Auf diese und weitere Fragen möchte ich in diesem Artikel eingehen.

Andere Länder, andere Formate. Damit wir mit einem System in unterschiedlichen Ländern arbeiten können, sind einige Parameter veränderlich. Dazu gehört die Zeitzone (damit die Hardware-Uhr immer auf UTC eingestellt sein kann), das Zeit/Datums-Format, das Papierformat, die Währung usw.. Diese Parameter können dann jeweils bei Bedarf von den laufenden Programmen abgefragt werden.
Weitere wichtige Punkte sind die Tastaturbelegung und die Zeichensätze. Die Zeichensätze gehören dabei zu einem der problematischen Fachgebiete, da bei der Verwendung falscher Zeichensätze teilweise Zeichen falsch oder gar nicht angezeigt werden. Bei uns in der Schweiz, Österreich und in Deutschland wären speziell die Umlaute zu Erwähnen, die Probleme machen können.

Zeitzoneneinstellung

Normalerweise wird man bereits bei der Installation eines Systems nach der gewünschten Zeitzone gefragt. Wenn man diese später ändern möchte, kommt das Programm „tzselect“ zum Einsatz. Ich merke mir das Programm anhand von „tz“=TimeZone und „select“=Auswahl. Wird das Programm gestartet, durchläuft man ein paar Fragen, die mit der entsprechenden Zahl zur Auswahl ausgewählt werden.

Das Programm tzselect verwendet die Dateien im Verzeichnis „/usr/share/zoneinfo“, wo man ein Verzeichnisbaum vorfindet, der den Auswahlmöglichkeiten in tzselect entspricht. Die meisten Dateien liegen dort in binärer Form vor, können also nicht einfach als Text betrachtet werden. Schlussendlich wird nichts anderes gemacht, als die Datei „/etc/localtime“ mit der korrespondierenden Stadt im erwähnten Verzeichnis verlinkt oder überschrieben. Übrigens sollte man aus Kompatibilitätsgründen zu „hwclock“ das Kopieren/Überschreiben bevorzugen.

Hier ein gekürzter Auszug aus dem Verzeichnis-Listing unterhalb von /usr/share/zoneinfo auf meinem LinuxMint Testsystem:

ls -l /usr/share/zoneinfo/
total 176
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Africa
drwxr-xr-x  6 root root 20480 Mär 28 13:50 America
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Antarctica
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Arctic
drwxr-xr-x  2 root root 12288 Mär 28 13:50 Asia
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Atlantic
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Australia
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Brazil
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Canada
lrwxrwxrwx  1 root root     9 Mär 14 01:07 CET -> posix/CET
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Chile
-rw-r--r--  1 root root  2294 Mär 14 01:07 CST6CDT
lrwxrwxrwx  1 root root    20 Mär 14 01:07 Cuba -> posix/America/Havana
lrwxrwxrwx  1 root root     9 Mär 14 01:07 EET -> posix/EET
lrwxrwxrwx  1 root root    11 Mär 14 01:07 Egypt -> posix/Egypt
lrwxrwxrwx  1 root root    19 Mär 14 01:07 Eire -> posix/Europe/Dublin
lrwxrwxrwx  1 root root     9 Mär 14 01:07 EST -> posix/EST
lrwxrwxrwx  1 root root    13 Mär 14 01:07 EST5EDT -> posix/EST5EDT
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Etc
drwxr-xr-x  2 root root  4096 Mär 28 13:50 Europe
lrwxrwxrwx  1 root root    13 Mär 14 01:07 Factory -> posix/Factory
... GEKÜRZT

In der Konfigurationsdatei „/etc/timezone“ muss die Zeitzone ebenfalls definiert werden. Hier ein Blick in meine Datei:

mgblog@X201 ~ $ cat /etc/timezone 
Europe/Zurich

Dies entspricht eigentlich dem Pfad unterhalb von „/usr/share/zoneinfo“.

Die Anzeige auf der Shell erfolgt mit dem Befehl „date“. Ohne Option gibt dieser die aktuelle Zeit und das Datum aus. Will man die Ausgabe als UTC sehen, wird der Befehl mit der Option „-u“ ausgeführt. Hier ein Beispiel:

mgblog@X201 ~ $ date
Mon Aug  4 14:42:19 CEST 2014
mgblog@X201 ~ $ date -u
Mon Aug  4 12:42:24 UTC 2014

Bei Sommerzeit in der Schweiz ist somit die lokale Zeit zwei Stunden vor der UTC-Zeit.

Umgebungsvariablen (zur Lokalisation)

Viele Anwendungen benötigen regionale Informationen. Dazu gehören Währung, Papierformate, Telefonnummernformate und Datums – und Uhrzeitformate.

Die Ausgabe besteht aus einem Sprachencode (ISO 639) und den dazugehörigen Ländercode (ISO 3166).
Beispiel:
de_CH,de_DE,de_AT,en_US,en_GB
LC_ALL
  • überschreibt alle LC_* Variablen wie LC_MESSAGES, LC_CTYPE, LC_COLLATE, LC_MONETARRY, LC_NUMERIC, LC_TIME
  • falls diese Variable gesetzt ist, werden alle anderen Werte ignoriert.
LC_ADRESS
  • Formatierung von Adressen und Ortsangaben.
LC_COLLATE
Zeichensortierung (**grep sort **) (Character Collation)
  • kommt ä nach a oder nach z
LC_CTYPE
  • Zeichenklassifizierung und Gross und Kleinschreibung
  • legt die Interpretation von Sequenzen von Bytes als Character fest
  • **tolower() toupper() isalpah()**
LC_MONETARY
  • Formatierung von Geldbeträgen
LC_MEASUREMENT
  • Formatierung von Masseinheiten
LC_MESSAGES
  • Nachrichten und Meldungen die ein Programm ausgibt inklusive kulturellen Konventionen
LC_NAME
  • Formatierung von Eigennamen
LC_NUMERIC
  • Formatierung von Zahlen Beispiel (0.1 oder 0,1)
LC_PAPER
  • Papierformat (US-Letter, A4)
LC_TELEPHONE
  • Formatierung von Telefonnummer (03077777, 030/7777, 030.7777 )
LC_TIME
  • → Formatierung von Datums und Zeitangaben entsprechend der kulturellen Konventionen

Mit dem Befehl „locale“ können die momentan aktiven (für den angemeldeten Benutzer) Einstellungen aufgelistet werden:

mgblog@X201 $ locale
LANG=de_CH.UTF-8
LANGUAGE=de_CH:de
LC_CTYPE="de_CH.UTF-8"
LC_NUMERIC="de_CH.UTF-8"
LC_TIME="de_CH.UTF-8"
LC_COLLATE="de_CH.UTF-8"
LC_MONETARY="de_CH.UTF-8"
LC_MESSAGES="de_CH.UTF-8"
LC_PAPER="de_CH.UTF-8"
LC_NAME="de_CH.UTF-8"
LC_ADDRESS="de_CH.UTF-8"
LC_TELEPHONE="de_CH.UTF-8"
LC_MEASUREMENT="de_CH.UTF-8"
LC_IDENTIFICATION="de_CH.UTF-8"
LC_ALL=

Zusätzlich unterstützt der Befehl „locale“ die Option „-a“ (all), mit der alle verfügbaren Lokalisationen angezeigt werden:

mgblog@X201 ~ $ locale -a
C
C.UTF-8
de_CH.utf8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

Um eine Liste der Zeichensätze anzuzeigen, kann die Option „-m“ (charmap) verwendet werden:

mgblog@X201 ~ $ locale -m
ANSI_X3.110-1983
ANSI_X3.4-1968
ARMSCII-8
ASMO_449
BIG5
BIG5-HKSCS
BRF
BS_4730
BS_VIEWDATA
CP10007
CP1125
CP1250
CP1251
CP1252
CP1253
CP1254
CP1255
CP1256
CP1257
CP1258
CP737
CP770
CP771
CP772
... GEÜRZT

Dem Thema „Zeichensätze“ und dem Programm „iconv“, zum konvertieren zwischen verschiedenen Zeichensätzen, werde ich ein eigener Artikel widmen.

Flattr this!

Ein Gedanke zu „Lokalisierung (Internationalisierung) eines GNU/Linux-Systems

  1. Pingback: Die Systemzeit unter GNU/Linux verwalten | MG BLOG

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*