Spracheinstellung in Ubuntu-Distributionen: locale
Beim letzten Server-Update ist es mir wieder passiert. perl: warning: Falling back to the standard locale (“C”) stand da zu lesen. Die Fehlermeldung kannte ich schon. Und ich erinnerte mich auch gut, wie lange ich das letzte Mal für die Lösung des Problems benötigte hatte. Das war ausreichend Motivation, mich der Angelegenheit einmal genauer zu widmen und einen Artikel darüber zu schreiben. Die Problematik könnte übrigens auch für jemanden von Interesse sein, der z.B. über PHP ein Datum in einer definierten Sprache ausgeben möchte.
Hinter dem Begriff “locale” verbergen sich in Linux-Distributionen die systemweiten Spracheinstellungen. Die Dokumentation der Linux-Distribution Ubuntu [1] erwähnt, dass in Büchern sowie selbst im Internet nur bits and pieces of information zu erhalten sind, in Foren findet man mehr Fragen als Antworten. Das ist erstaunlich, denn die Spracheinstellung eines Betriebssystems ist nicht gerade nebensächlich. Dabei geht es nicht nur darum, in welcher Sprache mein Server mit mir kommuniziert, sondern auch, in welcher Sprache er auf Skriptanfragen reagiert. Hierzu ein Beispiel mit einer Datumsanfrage in PHP: Die Ausgabe eines für eine deutsche Webseite abgesetzten Befehls…
echo strftime("%A", mktime(0, 0, 0, 4, 2, 2012));
… die ein…
Monday
… liefert lässt vermuten, dass der Server in der für uns falschen Sprache konfiguriert ist. Wenn dann aber ein…
setlocale(LC_ALL, 'de_DE');
echo strftime("%A", mktime(0, 0, 0, 4, 2, 2012));
… keine Änderung bewirkt, ist die Sorge, dass das gerade in Entwicklung stehende Projekt wieder einmal länger als geplant dauern wird, berechtigt. Das Problem entsteht, wenn Skripte Übersetzungen vom Betriebssystem anfordern, die dort nicht installiert sind. Und damit haben wir es auch schon halb gelöst. Für den Rest benötigen wir direkten Zugriff auf den Server.
Zuerst sollten wir uns davon überzeugen, welche Sprachen überhaupt installiert sind. In einer Linux-Standard-Installation wird das Englisch sein:
$ locale -a
Die Shell listet daraufhin alle installierten Sprachen auf:
C 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 POSIX
“C” und “POSIX” sind eine ASCII Alternative, falls mit den anderen Kodierungen etwas schiefgeht. Das erklärt jetzt auch die Ausgabe
perl: warning: Falling back to the standard locale ("C")...
…, ein Fehler, den man etwa beim Aktualisieren des Systems oft zu sehen bekommt. Die anderen Einträge beschreiben über einen Code [2] die installierten Sprachen. Wenn wir uns also an die Problematik erinnern, dass sich die Datumsausgabe nicht von Monday auf Montag umstellen hat lassen, dann ist jetzt klar, dass einfach nur die geforderte Sprache installiert werden muss.
Eine höchst interessante Ausgabe bietet übrigens locale mit dem zusätzlichen Argument -v
$ locale -av
locale: de_AT.utf8
archive: /usr/lib/locale/locale-archive
--------------------------------------
title | German locale for Austria
source | O:sterreiches Normungsinstitut
address | Postfach 130, A-1021 Wien
contact | Gerhard Budin
email | bug-glibc-locales@gnu.org
language | German
territory | Austria
revision | 1.0
date | 2000-06-28
codeset | UTF-8
...
Auf der Konsole bedeutet installiert aber nicht, dass das System diese Sprachen auch verwendet. Auf welcher Sprache (können auch mehrere unterschiedliche sein) das System gerade läuft verrät der Befehl
$ locale
Die Ausgabe sieht im Gegensatz zu locale -a ein wenig anders aus:
LANG=de_AT.UTF-8 LANGUAGE=de_AT LC_CTYPE="de_AT.UTF-8" LC_NUMERIC="de_AT.UTF-8" LC_TIME="de_AT.UTF-8" ...
Ich gönne mir also auf meinem Server ein Österreichisches Deutsch. Dadurch wird zum Beispiel ein Januar zu einem Jänner. Oder ein gucken zu einem schauen (just kidding). Neugierig wie wir sind wollen wir natürlich wissen, welche Einstellung dafür verantwortlich ist und vor allem wie wir sie verändern können. Das hängt (leider) von der verwendeten Version ab. In Ubuntu-Versionen vor Lucid Lynx [3] findet man die Einstellung in der Datei environment
$ vim /etc/environment
In späteren, jüngeren Versionen befinden sich die Parameter im File /etc/default/locale
$ vim /etc/default/locale
Die aktuell verwendete Sprache ist dort wie folgt eingetragen:
LANG="de_AT.UTF-8" LANGUAGE="de_AT"
Diese Einträge dürfen (als root) gleich vor Ort verändert werden (allerdings werden sie erst nach einem erneuten Login oder eventuell erst nach einem Neustart aktiv), oder man bedient sich des Befehls
$ update-locale LANG=de_AT.UTF-8 LANGUAGE=de_AT
Hinweis: Verursacht der Parameter UTF-8 Schwierigkeiten, sollte man eine Version ohne Bindestrich, also utf8 ausprobieren [4].
Bleibt noch zu klären, wie man nun neue Sprachunterstützungen installiert, passend zu unserem PHP-Beispiel, bei dem ja der Server auf die angeforderte Übersetzung eines Wochentages nicht wie gewünscht reagiert hat. Hierzu führt man folgenden Befehl aus, wobei natürlich die Sprach-Codes den Bedürfnissen anzupassen sind:
$ sudo locale-gen de_AT.UTF-8
Die verfügbaren Kürzel kann man übrigens aus dem System selber auslesen. Sie sind in folgendem File abgelegt:
$ vim /usr/share/i18n/SUPPORTED
Wenn Fehler auftreten
Manchmal kann es passieren, dass es zu Inkompatibilitäten zwischen den einzelnen Sprachen kommt. Informationen darüber, warum so etwas passiert, oder wie man es löst, sind noch schwerer zu finden. Eine solche Fehlermeldung könnte wie folgt aussehen:
sudo locale-gen en_HK.UTF-8... hash collision (1688509771) en_HK.utf8, de_CH.utf8 failed
Dazu wechselt man in das unten angegebene Verzeichnis und öffnet jene Datei, deren zugehörige Sprache gelöscht werden soll:
cd /var/lib/locales/supported.d sudo vim en
Dort löscht man nun einfach jenen Eintrag, der den Konflikt ausgelöst hat (in diesem Fall wäre es en_HK. Um de_CH zu löschen, müsste man also in die Datei de). Anschließend sollte ein
sudo locale-gen
anstandslos durchlaufen.
Zusammenfassung
Installierte Sprachen abfragen
$ locale -a
Aktuell gültige Sprache abfragen
$ locale
Aktuell gültige Sprache ändern (Beispiel)
$ update-locale LANG=de_AT.UTF-8 LANGUAGE=de_AT
Neue Sprache installieren (Beispiel)
$ sudo locale-gen de_AT.UTF-8
Fußnoten
[1] Ubuntu Documentation, “Locale”
[2] ISO 639-1 Code
[3] Linux Releases
[4] PHP setlocale()







Danke, hat mir sehr geholfen - auch wenn ich immer AT gegen DE austauschen musste ;)
Super Beschreibung- Danke!
Ich würde gerne ausschließlich die Shell/Terminal auf Englisch umstellen… soweit ich das oben verstehe, stellt diese Vorgehensweise die ganze Systemsprache um… Wie kann ich denn nur die Sprache des Terminals permanent ändern?
@adi5 Danke für Dein Feedback!
Man kann tatsächlich die Sprache der Konsole umstellen. Alles was Du dazu brauchst, steht in folgendem Forum: http://askubuntu.com/questions/264283/switch-command-output-language-from-native-language-to-english