Frage Ändern Sie vorübergehend die Sprache für Terminal-Meldungen / Warnungen / Fehler


Nachrichten in meinem Terminal werden standardmäßig in der russischen Sprache angezeigt, die meine Muttersprache ist.

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

Wie kann ich den Schalter schalten und mit Bash zurückschalten?


18
2018-05-27 07:37


Ursprung




Antworten:


Zum Ändern der Spracheinstellungen stehen mehrere Umgebungsvariablen zur Verfügung. Sie können Ihre aktuellen Gebietsschemaeinstellungen anzeigen, indem Sie die locale Befehl. Um alle Gebietsschemaeinstellungen auf Englisch zu ändern, verwenden Sie LANG=C. Dies C Gebietsschema ist immer verfügbar, ohne dass zusätzliche Sprachpakete installiert werden müssen. (Um vorübergehend in nicht englische Ländereinstellungen zu wechseln, siehe @ mklement0's Beitrag.)

Beispiele:

Ausführen eines Befehls mit den Standardeinstellungen für die Sprache 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=

Vorübergehend die Sprache für ein Programm überschreiben und zeigen, dass es wirklich temporär 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 Befehle, die in der aktuellen Shell ausgeführt werden, und fügen Sie erneut Beweise hinzu:

$ 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=

18
2018-05-27 07:44



Für andere Benutzer, die Probleme haben, dies zur Arbeit zu bringen - Einstellung LANG oder LANG_ALL funktioniert noch nicht für mich LANGUAGE ist. Sehen Warum überschreibt die LANG-Umgebungsvariable nicht die Sprache für mich? - gertvdijk
@gertvdijk: Danke dafür; Der Grund, warum diese Antwort auch ohne Einstellung funktioniert LANGUAGE ist ein Ausnahme: GNU gettext gibt Vorrang dem LANGUAGE Wert außer wenn die (wirksame) LC_MESSAGES Wert (normalerweise indirekt über LANG oder LC_ALL) entweder C oder (sein Synonym) POSIX. Beachten Sie auch das LANGUAGE passiert in dieser Antwort nicht, während es ist standardmäßig gesetzt, und wenn es gesetzt ist, müssen Sie überschreiben es um zu a zu wechseln bestimmte Ländereinstellungen Sprache (im Gegensatz zu "C" / "POSIX"), was Sie gefunden haben. - mklement0
Ihre Antwort funktioniert hervorragend, wenn Sie zum Gebietsschema "C" wechseln (mit US-Englisch-Nachrichten wie angefordert), aber nicht für andere Ländereinstellungen LANGUAGEist explizit nicht gesetzt oder außer Kraft gesetzt. Angesichts des generischen Titels der Frage ist es wahrscheinlich, dass Leute diese Antwort finden, die auch auf eine nicht-englische Sprache umschaltet, also denken Sie bitte darüber nach, diese Information zu Ihrer Antwort hinzuzufügen. - mklement0
@ mklement0 Angesichts des Kontexts der Frage (englische Fehlermeldungen) denke ich, dass der aktuelle Beitrag ausreichend ist. Sie können eine weitere Antwort hinzufügen, um die Details zu erklären LANGUAGE wenn du willst :) - Lekensteyn
Ich habe hinzugefügt meine eigene Antwort, wie du es vorgeschlagen hast. Wenn Sie meiner Einschätzung zustimmen, dass zukünftige Leser hierher kommen, um zu wechseln irgendein Sprache (wie mehrere Personen bereits aktiv angegeben haben), fügen Sie bitte einen Link zu meiner Antwort auf Ihre Frage hinzu. Abgesehen davon schlage ich vor, den Wert von LANGUAGE in Ihrer Beispielausgabe an nlDies ist der tatsächliche Standardwert für Ihr Gebietsschema nl_NL.UTF-8. - mklement0


Lekensteyns hilfreiche Antwort funktioniert gut, wenn Sie zu wechseln möchten amerikanisches Englisch auf Anfrage, wie das OP gefordert hat, aber wenn du zu a wechseln willst anders Sprache auf Anfrage, mehr Arbeit wird benötigt.

Bevor Sie beginnen, müssen Sie Nachrichtentabellen mit installieren sudo apt-get install language-pack-<lang-tag>, woher <lang-tag> ist ein Einfaches RTF 5646 Sprach-Untertag, sowie es für Spanisch.

Hintergrundinformation

GNU gettext-basierte Dienstprogramme geben dem Nichtstandard Vorrang LANGUAGE Umgebungsvariable[1]  über POSIX-definierte Gebietsschema-Umgebungsvariablen LC_ALL, LC_MESSAGES, und LANG (in dieser Reihenfolge).

Angesichts dessen LANGUAGE ist standardmäßig auf Ubuntu-Systemen eingestellt[2], nämlich zu a Teilzeichenfolge des LANG Wert, der entweder ein einfaches Sprach-Tag (z. B. es für Spanisch) oder ein Sprachregion-Tag (z.B. de_DE für die deutsche Variante von Deutsch), müssen Sie deaktivieren oder überschreiben LANGUAGE damit die Nachrichten einer anderen Sprache wirksam werden.[3]

Option 1: Festlegen LANGUAGE

Beispiel: Wechseln zu Spanisch (es) Nachrichten ad-hoc:

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

Hinweis: Ein einfaches Sprach-Tag wie z es ist ausreichend, aber Sie können eine Regionskennung hinzufügen (z. B. es_AR für Argentinien) und sogar ein Zeichensatz-Suffix (z.B. es_AR.UTF-8).
Lokalisierte Nachrichten können jedoch nur bei der Sprache level, und der Fallback besteht darin, Nachrichten zu verwenden, die dem entsprechen Sprache Teil (es, in diesem Fall).

Option 2: Nicht festgelegt LANGUAGE und einstellen LC_ALL

Diese alternative Lösung undefines  LANGUAGE zuerst und verwendet dann die Umgebungsvariable POSIX locale LC_ALL implizit setzen 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 der Einstellung alle Lokalisierungsaspekte zum angegebenen Gebietsschema (wie z. B. LC_TIMEfür Datum / Uhrzeit-Formate) und durch (implizit) Einstellung LC_MESSAGES informiert auch nicht-GNU-Programme der gewünschten Sprache.

Beachten Sie wie LC_ALL benötigt die genau, voll Gebietsschema-Name, einschließlich Zeichensatz-Suffix, um wirksam zu sein (es_ES.UTF-8) (nicht wie LANGUAGE, für die ein einfaches Sprach-Tag ausreicht (z. B. es)). Gleiches gilt für die Einstellung LC_MESSSAGES und LANG. Die Angabe eines ungültigen / nicht installierten Gebietsschema-Namens führt zu einem Fallback auf das POSIX-Gebietsschema und somit zu US-Englisch.


Fußnoten

[1] Die Gründe, warum Lekensteyns Antwort funktioniert ohne unscharf / überschreibend LANGUAGE ist ein Ausnahme: wenn das (wirksam) LC_MESSAGES Wert (normalerweise indirekt über LANG oder LC_ALL) entweder C oder (sein Synonym) POSIX, dieser Wert wird respektiert, unabhängig vom Wert von LANGUAGE, wenn überhaupt. Umgekehrt, wenn die (wirksame) LC_MESSAGES Wert ist jeder andere, Spezifisch Gebietsschema, LANGUAGE hat Vorrang.

[2] Dies gilt für Ubuntu richtig, aber nicht unbedingt zu andere Aromen; Lekensteyn sagt das Kubuntu tut nicht einstellen LANGUAGE.
Wohl, LANGUAGE sollte nicht standardmäßig eingestellt werden, da in seiner Abwesenheit LC_MESSAGES Wert impliziert durch die LANG Wert (der das aktuelle Gebietsschema bestimmt) wird respektiert.

[3] Sie können diesen Ansatz auch verwenden, um zu [US] Englisch zu wechseln, indem Sie eines zuweisen LANGUAGE=C oder LANGUAGE=POSIX (als Alternative zu, LANG=C / LANG=POSIX), obwohl mir unklar ist, ob das aktiv erkannt wird oder einfach ein Zurückfallen Mechanismus, da diese Werte nicht mit a beginnen Sprache Etikett; vielleicht wäre die bessere Wahl en_US.

[4] Da ist ein Kante Fall, in dem dieser Ansatz nicht funktioniert: Der Versuch, eine ausführbare Datei mit a aufzurufen Pfad - ob relativ oder absolut - wechselt NICHT zur angegebenen Sprache, während a bloßer Dateiname tut:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utility tut nicht arbeiten (gibt eine Nachricht im aktuellen Gebietsschema aus), während
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility tut (gibt eine spanische Fehlermeldung aus).
Wenn jemand weiß warum und ob es einen guten Grund dafür gibt, lass es uns wissen.


6
2017-11-02 02:10



Tipp des Hutes zu @Wjandrea für seine Hilfe bei der Strukturierung dieses Beitrags. - mklement0