setze LC_ * aber nicht LC_ALL

13

Ich hätte gerne ein deutsches Gebietsschema (A4-Format, 24 Stunden, JJJJ-MM-TT), aber eine englischsprachige Benutzeroberfläche (schlechte Übersetzungen gefallen mir nicht). Ich dachte mir, dass der richtige Weg dies zu erreichen ist, die LC_Variablen wie folgt in meinem .bashrc(bitte korrigieren Sie mich, wenn ich falsch liege) einzustellen :

LC_MESSAGES=en_US.UTF-8
LC_$everythingelse=de_AT.UTF-8

Gibt es eine elegantere Möglichkeit, LC_ $ everythingelse festzulegen, anstatt jeden einzelnen Wert festzulegen? Das Setzen von LC_ALL ist keine Option, da es Vorrang vor LC_MESSAGES hat:

$ export LC_ALL=de_AT.UTF_8
$ export LC_MESSAGES=en_US.UTF_8
$ echo $LC_MESSAGES
en_US.UTF_8
$ locale | grep LC_MESSAGES
LC_MESSAGES="de_AT.UTF_8"

PS: Es ist ein gemeinsam genutzter Computer, und ich bin kein Sudoer. Das Ändern systemweiter Einstellungen ist daher keine Option.

Heinzi
quelle

Antworten:

16

Es gibt drei Einstellungen für das Gebietsschema¹:

  • LANG, die Fallback-Einstellung, wenn Sie keinen Wert für eine Kategorie angegeben haben. Es ist für Benutzer gedacht, ihr Gebietsschema auf einfache Weise anzugeben.
  • LC_xxxfür jede Kategorie ( xxxkann sein MESSAGES, TIMEusw.).
  • LC_ALLüberschreibt alle Einstellungen. Auf diese Weise können Anwendungen alle Einstellungen überschreiben, um in einem bekannten Gebietsschema (normalerweise Cdem Standardgebietsschema) zu arbeiten, sodass verschiedene Befehle eine Ausgabe in einem bekannten Format erzeugen.

Sie können also LANG=de_AT.UTF-8und festlegen LC_MESSAGES=C( Cist das Standardgebietsschema und bedeutet nicht übersetzt; en_USist normalerweise identisch mit Cfür Nachrichten).

Es gibt jedoch zwei Kategorien, in denen ich das Ändern der Standardeinstellung nicht empfehle, da viele Programme nicht funktionieren:

  • LC_COLLATEist das Zeichen Kollation Reihenfolge. Dies ist nicht sehr nützlich, da hier nur das Sortieren von Zeichen und nicht das Sortieren von Zeichenfolgen angegeben wird. Tools, die Strings sortieren können, werden nicht verwendet LC_COLLATE. Darüber hinaus erwarten viele Tools Dinge wie " [a-z]Übereinstimmungen mit allen 26 ASCII-Kleinbuchstaben und keinen anderen ASCII-Zeichen"echo B | LC_COLLATE=en_US grep '[a-z]' ) .
  • LC_NUMERICzeigt an, wie Zahlen angezeigt werden. Insbesondere in vielen Sprachen werden Gleitkommazahlen ,nicht .als Dezimaltrennzeichen verwendet. Die meisten Programme, die Zahlen analysieren, erwarten a .und behandeln a ,als Feldtrennzeichen.

Also empfehle ich zu

  • entweder explizit LC_COLLATE=C LC_NUMERIC=_C ,
  • oder lassen LANGFrisch- und setzen nur einen Wert für die nützlichen Kategorien ( LC_MESSAGES, LC_TIME, LC_PAPER, undLC_CTYPE (deren Wert je nach Terminal)).

¹ Plus LANGUAGEmit GNU libc. Wenn Sie nicht davon gehört haben, werden Sie nicht viel vermissen.

Gilles 'SO - hör auf böse zu sein'
quelle
Danke für die ausführliche Antwort und die Erläuterungen! Ich werde allerdings eine lokalisierte LC_NUMERIC ausprobieren, da das Nummernfeld auf deutschen Tastaturen (leider) eine ,anstelle von hat ., so dass die Eingabe von Zahlen mit einem Punkt unpraktisch ist (und die meisten Apps mit einer nicht standardmäßigen LC_NUMERIC gut zu funktionieren scheinen). Ich verstehe Ihr LC_COLLATE-Beispiel nicht vollständig: Auf meinem System stimmt das von Ihnen angegebene Beispiel nicht überein B.
Heinzi
@Heinzi Betrifft (sollte) LC_COLLATE Zeichenbereiche?
Gilles 'SO- hör auf böse zu sein'
10

Die Manpage locale (7) sagt:

Das Standardgebietsschema [...] wird anhand der folgenden Schritte ermittelt:

  1. Wenn eine Nicht-Null-Umgebungsvariable LC_ALL vorhanden ist, wird der Wert von LC_ALL verwendet.

  2. Wenn eine Umgebungsvariable mit demselben Namen wie eine der obigen Kategorien [LC_ *] existiert und nicht null ist, wird ihr Wert für diese Kategorie verwendet.

  3. Wenn es eine Umgebungsvariable LANG gibt, die nicht null ist, wird der Wert von LANG verwendet.

Sie können LANG also als eine Art Analogon mit niedriger Priorität von LC_ALL verwenden: Setzen Sie den Wert von LANG auf de_ATund LC_MESSAGES auf en_US:

$ env LC_MESSAGES=en_US.UTF-8 LANG=de_AT.UTF-8 locale | egrep '(MESSAGES|PAPER)'
LC_MESSAGES=en_US.UTF-8
LC_PAPER="de_AT.UTF-8"
Riccardo Murri
quelle