web-dev-qa-db-fra.com

Changer temporairement la langue pour les messages / avertissements / erreurs du terminal

Les messages de mon terminal sont affichés en russe par défaut, ce qui est mon natif.

Pendant un instant, je veux qu’ils soient en anglais (par exemple, pour coller dans les forums), puis reviennent dans la langue par défaut.

Comment puis-je faire le changement et revenir en utilisant bash?

22
takeshin

Plusieurs variables d’environnement sont disponibles pour modifier les paramètres de langue. Vous pouvez afficher vos paramètres régionaux actuels en exécutant la commande locale. Pour modifier tous les paramètres régionaux en anglais, utilisez LANG=C. Cette locale C est toujours disponible sans installer de packs de langue supplémentaires. (Pour changer temporairement les paramètres régionaux non anglais, voir le message de @ mklement .)

Exemples:

Exécutez une commande avec les paramètres de langue par défaut et imprimez les paramètres régionaux en cours:

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

Remplacez temporairement la langue pour un programme et montrez que c'est vraiment temporaire:

$ 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

Modifiez les paramètres régionaux pour toutes les commandes exécutées dans le shell actuel et incluez à nouveau les preuves:

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

La réponse utile de Lekensteyn fonctionne très bien si vous souhaitez passer à anglais américain à la demande, comme l'OP l'a demandé, mais si vous souhaitez passer Pour une différente langue à la demande , davantage de travail est nécessaire.

Avant de commencer, vous devez installer les tables de messages avec Sudo apt-get install language-pack-<lang-tag>, où <lang-tag> est un simple RTF 5646 sous-étiquette de langue , tel que espour l'espagnol.

Informations de fond

GNU gettext - Les utilitaires donnent la priorité à la variable d’environnement non standard LANGUAGEname__[1] sur les variables d'environnement de paramètres régionaux définies par POSIX LC_ALL, LC_MESSAGES et LANG(dans cet ordre).

Étant donné que LANGUAGEest défini par défaut sur les systèmes Ubuntu[2], à savoir une chaîne de la valeur LANGqui reflète une balise de langue simple (par exemple, espour l'espagnol) ou une balise de région linguistique (par exemple, de_DE pour la variante allemande de l'allemand), vous devez unset ou remplacer LANGUAGEafin que les messages d'une langue différente prennent effet.[3]

Option 1: Définissez LANGUAGEname__

Exemple : passer en espagnol (esname__) messages ad-hoc:

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

Remarque : une simple étiquette de langue telle que esest suffisante, mais vous pouvez ajouter un identificateur de région (par exemple, es_AR pour l'Argentine) et même un suffixe de jeu de caractères. (par exemple, es_AR.UTF-8).
Toutefois, les messages localisés ne peuvent exister qu'au niveau langue, et la solution de remplacement consiste à utiliser des messages qui correspondent à la partie langue (esname__, dans ce cas) .

Option 2: Annulez LANGUAGEet définissez LC_ALL

Cette solution alternative ndefinesLANGUAGEcommence par utiliser la variable d'environnement d'environnement local POSIX LC_ALL pour définir implicitement 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

Cette solution présente l’avantage de définir all les aspects de localisation sur les paramètres régionaux spécifiés (tels que LC_TIME pour les formats de date/heure) et de (implicitement) définir LC_MESSAGES en informe également non - GNU programmes de la langue désirée.

Notez que LC_ALL exige que le nom de locale exact, full, y compris le suffixe du jeu de caractères, soit effectif (es_ES.UTF-8) (contrairement à LANGUAGEname__, pour lequel une simple balise de langage suffit (comme esname__). Il en va de même pour la définition de LC_MESSSAGES et de LANGname__. La spécification d'un nom de paramètres régionaux non installé/non installé entraîne le repli sur les paramètres régionaux POSIX et donc sur l'anglais américain.


Notes de bas de page

[1] Les raisons pour lesquelles la réponse de Lekensteyn fonctionne même sans annuler/annuler LANGUAGEest un exception: si la valeur (effective) LC_MESSAGES (généralement définie indirectement via LANGou LC_ALL) est Cou (son synonyme) POSIXname__, cette valeur est respectée, quelle que soit la valeur de LANGUAGEname__, le cas échéant. Inversement, si la valeur (effective) LC_MESSAGES est différente, spécifique locale, LANGUAGEest prioritaire.

[2] Ceci s'applique à buntu proprement dit , mais pas nécessairement à autres versions ; Lekensteyn déclare que Kubunt fait pas définit LANGUAGEname__.
On peut soutenir que LANGUAGEdevrait not ​​être défini par défaut, étant donné qu'en son absence, la valeur LC_MESSAGES impliquée par la valeur LANG(qui détermine les paramètres régionaux actuels) est respectée.

[3] Vous pouvez également utiliser cette approche pour basculer vers [US] English en attribuant LANGUAGE=C ou LANGUAGE=POSIX (au lieu de LANG=C/LANG=POSIX), bien que je ne sache pas exactement si c'est reconnu ou s'il s'agit simplement d'un fallback mécanisme, étant donné que ces valeurs ne commencent pas par une balise language; Peut-être que le meilleur choix serait en_US.

[4] Il y a un cas Edge où cette approche ne fonctionne pas: essayer d'appeler un exécutable avec un chemin - qu'il soit relatif ou absolu - ne bascule PAS vers le langage spécifié , alors qu’un simple nom de fichier fait:
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utility ne fonctionne pas not ​​(génère un message dans les paramètres régionaux actuels), alors que
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utility fait (affiche un message d'erreur en espagnol).
Si quelqu'un sait pourquoi et s'il y a une bonne raison à cela, faites-le nous savoir.

8
mklement0