Sprache für Terminalmeldungen / Warnungen / Fehler vorübergehend ändern

22

Die Nachrichten in meinem Terminal werden standardmäßig in russischer Sprache angezeigt. Dies ist meine Muttersprache.

Für einen Moment möchte ich, dass sie auf Englisch sind (z. B. um sie in Foren einzufügen), und dann zurück zur Standardsprache wechseln.

Wie kann ich mit bash umschalten und zurückschalten?

takeshin
quelle

Antworten:

23

Zum Ändern der Spracheinstellungen stehen mehrere Umgebungsvariablen zur Verfügung. Sie können Ihre aktuellen Ländereinstellungen anzeigen, indem Sie den localeBefehl ausführen . Verwenden Sie, um alle Ländereinstellungen in Englisch zu ändern LANG=C. Dieses CGebietsschema ist immer verfügbar, ohne dass zusätzliche Sprachpakete installiert werden müssen. ( Informationen zum vorübergehenden Wechseln in nicht englische Ländereinstellungen finden Sie in @ mklement0s Beitrag.)

Beispiele:

Ausführen eines Befehls mit den Standardspracheinstellungen und Drucken der aktuellen Gebietsschemaeinstellungen:

$ /nonexistent
bash: /nonexistent: Bestand of map bestaat niet
$ locale
LANG=nl_NL.UTF-8
LANGUAGE=
LC_CTYPE="nl_NL.UTF-8"
LC_NUMERIC="nl_NL.UTF-8"
LC_TIME="nl_NL.UTF-8"
LC_COLLATE="nl_NL.UTF-8"
LC_MONETARY="nl_NL.UTF-8"
LC_MESSAGES="nl_NL.UTF-8"
LC_PAPER="nl_NL.UTF-8"
LC_NAME="nl_NL.UTF-8"
LC_ADDRESS="nl_NL.UTF-8"
LC_TELEPHONE="nl_NL.UTF-8"
LC_MEASUREMENT="nl_NL.UTF-8"
LC_IDENTIFICATION="nl_NL.UTF-8"
LC_ALL=

Überschreibe vorübergehend die Sprache für ein Programm und zeige, dass es wirklich vorübergehend ist:

$ LANG=C ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ ls /nonexistent
ls: kan geen toegang krijgen tot /nonexistent: Bestand of map bestaat niet

Ändern Sie das Gebietsschema für alle in der aktuellen Shell ausgeführten Befehle und schließen Sie erneut Beweise ein:

$ LANG=C
$ ls /nonexistent
ls: cannot access /nonexistent: No such file or directory
$ locale
LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
Lekensteyn
quelle
6
Für andere Benutzer, die Probleme haben, dies zum Laufen zu bringen - Einstellung LANGoder LANG_ALLfunktioniert bei mir noch nicht LANGUAGE. Siehe Warum ändert das Überschreiben der Umgebungsvariablen LANG nicht die Sprache für mich?
Gertvdijk
1
@gertvdijk: Danke dafür; Der Grund, warum diese Antwort auch ohne Einstellung funktioniert, LANGUAGEist eine Ausnahme : GNU gettext hat Vorrang vor dem LANGUAGEWert, außer wenn der (effektive) LC_MESSAGESWert (in der Regel indirekt über LANGoder festgelegt LC_ALL) entweder Coder (sein Synonym) ist POSIX. Beachten Sie, dass LANGUAGEin dieser Antwort sein ungesetzt geschieht, während es wird standardmäßig festgelegt, und wenn es gesetzt ist, müssen Sie außer Kraft setzen es auf ein schalten bestimmten Gebietsschema Sprache (im Gegensatz zu „C“ / „POSIX“), die was du gefunden hast.
mklement0
Ihre Antwort funktioniert hervorragend, wenn Sie zum Gebietsschema "C" wechseln (mit Nachrichten in US-Englisch, wie erforderlich), funktioniert jedoch nicht für andere Gebietsschemas, es LANGUAGEsei denn, dies ist ausdrücklich deaktiviert oder wird überschrieben. Angesichts des generischen Titels der Frage wird diese Antwort wahrscheinlich auch in einer anderen Sprache als Englisch angezeigt. Fügen Sie diese Informationen daher Ihrer Antwort hinzu.
mklement0
@ mklement0 Angesichts des Kontextes der Frage (Posting englischer Fehlermeldungen) halte ich den aktuellen Beitrag für ausreichend. Sie können eine weitere Antwort hinzufügen, um die Details zu erläutern, LANGUAGEwenn Sie möchten :)
Lekensteyn
Ich habe meine eigene Antwort hinzugefügt , wie Sie vorgeschlagen haben. Wenn Sie mit meiner Einschätzung einverstanden sind, dass zukünftige Leser hierher kommen, um in eine andere Sprache zu wechseln (wie bereits von mehreren Personen aktiv angegeben), fügen Sie meiner Antwort auf Ihre Frage einen Link hinzu. Abgesehen davon schlage ich vor, den Wert von LANGUAGEin Ihrer Beispielausgabe auf zu ändern. Dies nlist der tatsächliche Standardwert, wenn Ihr Gebietsschema lautet nl_NL.UTF-8.
mklement0
8

Die hilfreiche Antwort von Lekensteyn eignet sich hervorragend, wenn Sie je nach Anforderung des OP auf US-Englisch umstellen möchten. Wenn Sie jedoch bei Bedarf auf eine andere Sprache umstellen möchten , ist mehr Arbeit erforderlich.

Bevor Sie beginnen, müssen Sie Nachrichtentabellen mit installieren sudo apt-get install language-pack-<lang-tag>. Dabei <lang-tag>handelt es sich um einen einfachen RTF 5646-Untertag , z. B. esfür Spanisch.

Hintergrundinformation

GNU gettext -basierte Dienstprogramme Vorrang gibt den Nicht - Standard - LANGUAGEUmgebungsvariable [1] über POSIX definierten locale Umgebungsvariablen LC_ALL, LC_MESSAGESund LANG(in dieser Reihenfolge).

Da dies LANGUAGEauf Ubuntu-Systemen standardmäßig eingestellt ist [2] , und zwar auf eine Teilzeichenfolge des LANGWerts, der entweder ein einfaches Sprachkennzeichen (z. B. esfür Spanisch) oder ein Sprachregionenkennzeichen (z. B. de_DEfür die deutsche Variante von Deutsch) widerspiegelt , Sie müssen die Option deaktivieren oder überschreiben LANGUAGE, damit die Nachrichten einer anderen Sprache wirksam werden. [3]

Option 1: Einstellen LANGUAGE

Beispiel : esAd-hoc zu spanischen ( ) Nachrichten wechseln:

$ LANGUAGE=es ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Hinweis : Ein einfaches Sprachkennzeichen wie z. B. esist ausreichend, Sie können jedoch es_AReine Regionskennung (z es_AR.UTF-8. B. für Argentinien) und sogar ein Zeichensatzsuffix (z . B. ) hinzufügen .
Lokalisierte Nachrichten sind jedoch möglicherweise nur auf Sprachebene vorhanden , und der Fallback besteht darin, Nachrichten zu verwenden, die dem Sprachteil entsprechen ( esin diesem Fall).

Option 2: Deaktivieren LANGUAGEund festlegenLC_ALL

Diese alternative Lösung undefines LANGUAGE zuerst, und dann verwendet POSIX locale Umgebungsvariable LC_ALLimplizit festgelegt LC_MESSAGES[4] :

$ LANGUAGE= LC_ALL=es_ES.UTF-8 ls NoSuchFile
ls: no se puede acceder a NoSuchFile: No existe el archivo o el directorio

Diese Lösung hat den Vorteil, dass alle Lokalisierungsaspekte auf das angegebene Gebietsschema eingestellt werden (z. B. LC_TIMEfür Datums- / Zeitformate) und durch (implizite) Einstellung LC_MESSAGESauch Nicht- GNU-Programme über die gewünschte Sprache informiert werden.

Beachten Sie, LC_ALLdass der genaue vollständige Name des Gebietsschemas, einschließlich des Zeichensatz-Suffix, wirksam sein muss ( es_ES.UTF-8) (im Gegensatz LANGUAGEzu einem einfachen Sprach-Tag (wie es)). Gleiches gilt für Einstellung LC_MESSSAGESund LANG. Die Angabe eines ungültigen / nicht installierten Gebietsschemanamens führt zu einem Fallback auf das POSIX-Gebietsschema und damit auf US-Englisch.


Fußnoten

[1] Die Gründe dafür , dass Lekensteyn Antwort funktioniert auch ohne Entschärfen / Überschreiben LANGUAGEwird eine Ausnahme : Wenn die (effektive) LC_MESSAGESWert ( in der Regel eingestellt indirekt über LANGoder LC_ALL) entweder Coder (dessen Synonym) POSIX, wird dieser Wert eingehalten, unabhängig von dem Wert von LANGUAGE, wenn überhaupt. Umgekehrt hat der (effektive) LC_MESSAGESWert Vorrang , wenn es sich um ein anderes bestimmtes Gebietsschema handelt LANGUAGE.

[2] Dies gilt für Ubuntu selbst , jedoch nicht unbedingt für andere Geschmacksrichtungen . Lekensteyn besagt , dass Kubuntu ist nicht festgelegt LANGUAGE.
Möglicherweise LANGUAGEsollte nicht standardmäßig festgelegt werden, da in Abwesenheit der vom LC_MESSAGESWert implizierte LANGWert (der das aktuelle Gebietsschema bestimmt) eingehalten wird.

[3] Sie können diesen Ansatz auch verwenden, um zu [US] -Englisch zu wechseln, indem Sie entweder LANGUAGE=Coder LANGUAGE=POSIX(als Alternative zu LANG=C/ LANG=POSIX) zuweisen , obwohl mir unklar ist, ob dies aktiv erkannt wird oder einfach ein Fallback- Mechanismus ist, da diese Werte nicht zutreffen Beginnen Sie nicht mit einem Sprach- Tag. Vielleicht wäre die bessere Wahl en_US.

[4] Es gibt eine Kante Fall, dass dieser Ansatz nicht funktioniert: Der Versuch , eine ausführbare Datei mit einem aufzurufen Weg - ob relativer oder absoluten - nicht an die angegebenen Sprache schaltet, während ein bloßer Dateiname tut:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilitytut nicht Arbeit (Ausgänge eine Meldung im aktuellen Gebietsschema), wohingegen
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility(eine spanische Fehlermeldung ausgibt).
Wenn jemand weiß warum und ob es einen guten Grund dafür gibt, lass es uns wissen.

mklement0
quelle
Tipp des Hutes an @ wjandrea für seine Hilfe bei der Strukturierung dieses Beitrags.
mklement0