Nächste: , Vorige: , Nach oben: Systemkonfiguration   [Inhalt][Index]


8.7 Locales

Eine Locale legt die kulturellen Konventionen einer bestimmten Sprache und Region auf der Welt fest (siehe Locales in The GNU C Library Reference Manual). Jede Locale hat einen Namen, der typischerweise von der Form Sprache_Gebiet.Kodierung — z.B. benennt fr_LU.utf8 die Locale für französische Sprache mit den kulturellen Konventionen aus Luxemburg unter Verwendung der UTF-8-Kodierung.

Normalerweise werden Sie eine standardmäßig zu verwendende Locale für die Maschine vorgeben wollen, indem Sie das locale-Feld der operating-system-Deklaration verwenden (siehe locale).

Die ausgewählte Locale wird automatisch zu den dem System bekannten Locale-Definitionen hinzugefügt, falls nötig, und ihre Kodierung wird aus dem Namen hergeleitet — z.B. wird angenommen, dass bo_CN.utf8 als Kodierung UTF-8 verwendet. Zusätzliche Locale-Definitionen können im Feld locale-definitions vom operating-system festgelegt werden — das ist zum Beispiel dann nützlich, wenn die Kodierung nicht aus dem Locale-Namen hergeleitet werden konnte. Die vorgegebene Menge an Locale-Definitionen enthält manche weit verbreiteten Locales, aber um Platz zu sparen, nicht alle verfügbaren Locales.

Um zum Beispiel die nordfriesische Locale für Deutschland hinzuzufügen, könnte der Wert des Feldes wie folgt aussehen:

(cons (locale-definition
        (name "fy_DE.utf8") (source "fy_DE"))
      %default-locale-definitions)

Um Platz zu sparen, könnte man auch wollen, dass locale-definitions nur die tatsächlich benutzen Locales aufführt, wie etwa:

(list (locale-definition
        (name "ja_JP.eucjp") (source "ja_JP")
        (charset "EUC-JP")))

Die kompilierten Locale-Definitionen sind unter /run/current-system/locale/X.Y verfügbar, wobei X.Y die Version von libc bezeichnet. Dies entspricht dem Pfad, an dem eine von Guix ausgelieferte GNU libc standardmäßig nach Locale-Daten sucht. Er kann überschrieben werden durch die Umgebungsvariable LOCPATH (siehe LOCPATH und Locale-Pakete).

Die locale-definition-Form wird vom Modul (gnu system locale) zur Verfügung gestellt. Details folgen unten.

Datentyp: locale-definition

Dies ist der Datentyp einer Locale-Definition.

name

Der Name der Locale. Siehe Locale Names in The GNU C Library Reference Manual für mehr Informationen zu Locale-Namen.

source

Der Name der Quelle der Locale. Typischerweise ist das der Teil Sprache_Gebiet des Locale-Namens.

charset (Vorgabe: "UTF-8")

Der „Zeichensatz“ oder das „Code set“, d.h. die Kodierung dieser Locale, wie die IANA sie definiert.

Scheme-Variable: %default-locale-definitions

Eine Liste häufig benutzter UTF-8-Locales, die als Vorgabewert des locale-definitions-Feldes in operating-system-Deklarationen benutzt wird.

Diese Locale-Definitionen benutzen das normalisierte Codeset für den Teil des Namens, der nach dem Punkt steht (siehe normalized codeset in The GNU C Library Reference Manual). Zum Beispiel ist uk_UA.utf8 enthalten, dagegen ist etwa uk_UA.UTF-8 darin nicht enthalten.

8.7.1 Kompatibilität der Locale-Daten

operating-system-Deklarationen verfügen über ein locale-libcs-Feld, um die GNU libc-Pakete anzugeben, die zum Kompilieren von Locale-Deklarationen verwendet werden sollen (siehe „operating-system“-Referenz). „Was interessiert mich das?“, könnten Sie fragen. Naja, leider ist das binäre Format der Locale-Daten von einer libc-Version auf die nächste manchmal nicht miteinander kompatibel.

Zum Beispiel kann ein an die libc-Version 2.21 gebundenes Programm keine mit libc 2.22 erzeugten Locale-Daten lesen; schlimmer noch, das Programm terminiert statt einfach die inkompatiblen Locale-Daten zu ignorieren26. Ähnlich kann ein an libc 2.22 gebundenes Programm die meisten, aber nicht alle, Locale-Daten von libc 2.21 lesen (Daten zu LC_COLLATE sind aber zum Beispiel inkompatibel); somit schlagen Aufrufe von setlocale vielleicht fehl, aber das Programm läuft weiter.

Das „Problem“ mit Guix ist, dass Nutzer viel Freiheit genießen: Sie können wählen, ob und wann sie die Software in ihren Profilen aktualisieren und benutzen vielleicht eine andere libc-Version als sie der Systemadministrator benutzt hat, um die systemweiten Locale-Daten zu erstellen.

Glücklicherweise können „unprivilegierte“ Nutzer ohne zusätzliche Berechtigungen dann zumindest ihre eigenen Locale-Daten installieren und GUIX_LOCPATH entsprechend definieren (siehe GUIX_LOCPATH und Locale-Pakete).

Trotzdem ist es am besten, wenn die systemweiten Locale-Daten unter /run/current-system/locale für alle libc-Versionen erstellt werden, die auf dem System noch benutzt werden, damit alle Programme auf sie zugreifen können — was auf einem Mehrbenutzersystem ganz besonders wichtig ist. Dazu kann der Administrator des Systems mehrere libc-Pakete im locale-libcs-Feld vom operating-system angeben:

(use-package-modules base)

(operating-system
  ;; …
  (locale-libcs (list glibc-2.21 (canonical-package glibc))))

Mit diesem Beispiel ergäbe sich ein System, was Locale-Definitionen sowohl für libc 2.21 als auch die aktuelle Version von libc in /run/current-system/locale hat.


Fußnoten

(26)

Versionen 2.23 von GNU libc und neuere werden inkompatible Locale-Daten nur mehr überspringen, was schon einmal eine Verbesserung ist.


Nächste: , Vorige: , Nach oben: Systemkonfiguration   [Inhalt][Index]