Changer temporairement la langue des messages / avertissements / erreurs du terminal

22

Les messages dans mon terminal sont affichés en utilisant la langue russe par défaut, qui est ma langue maternelle.

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

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

takhin
la source

Réponses:

23

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 localecommande. Pour modifier tous les paramètres régionaux en anglais, utilisez LANG=C. Ces Cparamètres régionaux sont toujours disponibles sans installer de modules linguistiques supplémentaires. (Pour passer temporairement à des paramètres régionaux non anglais, consultez le message de @ mklement0 .)

Exemples:

Exécuter une commande avec les paramètres de langue par défaut et imprimer les paramètres régionaux actuels:

$ /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 d'un programme et montrez qu'elle 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=
Lekensteyn
la source
6
Pour les autres utilisateurs ayant des problèmes pour que cela fonctionne - la configuration LANGou LANG_ALLne fonctionne pas pour moi, l' LANGUAGEest encore . Voir Pourquoi le remplacement de la variable d'environnement LANG ne change-t-il pas la langue pour moi?
gertvdijk
1
@gertvdijk: Merci pour cela; la raison pour laquelle cette réponse fonctionne même sans paramètre LANGUAGEest une exception : GNU gettext donne la priorité à la LANGUAGEvaleur sauf si la LC_MESSAGESvaleur ( effective) (généralement définie indirectement via LANGou LC_ALL) est soit Cou (son synonyme) POSIX. Notez également que LANGUAGEse trouve être unset dans cette réponse, alors qu'elle est définie par défaut, et si elle est définie, vous devez remplacer ce pour passer à un des paramètres régionaux spécifiques de langue (par opposition à « C » / « POSIX »), qui est ce que vous avez trouvé.
mklement0
Votre réponse fonctionne très bien lors du passage aux paramètres régionaux "C" (avec les messages en anglais américain, comme requis), mais ne fonctionnera pas pour les autres paramètres régionaux, sauf si elle LANGUAGEest explicitement non définie ou remplacée. Étant donné le titre générique de la question, il est probable que les gens trouveront cette réponse en cherchant à passer à une langue non anglaise également, veuillez donc envisager d'ajouter ces informations à votre réponse.
mklement0
@ mklement0 Étant donné le contexte de la question (affichage de messages d'erreur en anglais), je pense que le message actuel est suffisant. Vous pouvez ajouter une autre réponse pour expliquer les détails LANGUAGEsi vous voulez :)
Lekensteyn
J'ai ajouté ma propre réponse , comme vous l'avez suggéré. Si vous êtes d'accord avec mon évaluation selon laquelle de futurs lecteurs pourraient venir ici pour passer à n'importe quelle langue (comme plusieurs personnes l'ont déjà activement indiqué), veuillez ajouter un lien vers ma réponse à votre question. En dehors de cela, je suggère de changer la valeur de LANGUAGEdans votre exemple de sortie en nl, qui est la valeur par défaut réelle lorsque votre environnement local est nl_NL.UTF-8.
mklement0
9

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

Avant de commencer, vous devez installer des tableaux de messages avec sudo apt-get install language-pack-<lang-tag>, où se <lang-tag>trouve une simple sous - étiquette de langue RTF 5646 , comme espour l'espagnol.

Informations de fond

GNU gettext utilitaires à base donnent la priorité à la nonstandard LANGUAGEvariable d'environnement [1] sur les variables d'environnement définies locale POSIX LC_ALL, LC_MESSAGESet LANG(dans cet ordre).

Étant donné qu'elle LANGUAGEest définie par défaut sur les systèmes Ubuntu [2] , à savoir une sous - chaîne de la LANGvaleur qui reflète soit une simple balise de langue (par exemple, espour l'espagnol) ou une balise de région linguistique (par exemple, de_DEpour la variante allemande de l'allemand), vous devez annuler ou remplacer LANGUAGEpour que les messages d'une autre langue prennent effet. [3]

Option 1: définir LANGUAGE

Exemple : passer aux esmessages espagnols ( ) ad-hoc:

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

Remarque : Une simple balise de langue telle que essuffisante suffit, mais vous pouvez ajouter un identifiant de région (par exemple, es_ARpour l'Argentine), et même un suffixe de jeu de caractères (par exemple, es_AR.UTF-8).
Cependant, les messages localisés peuvent exister uniquement au niveau de la langue , et la solution de repli consiste à utiliser des messages qui correspondent à la partie de la langue ( es, dans ce cas).

Option 2: Désactiver LANGUAGEet définirLC_ALL

Cette solution alternative indéfinit d' LANGUAGE abord, puis utilise la variable d'environnement locale POSIX LC_ALLpour 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 a l'avantage de définir tous les aspects de la localisation sur les paramètres régionaux spécifiés (comme LC_TIMEpour les formats de date / heure) et, par implicitement, le paramètre LC_MESSAGESinforme également les programmes non- GNU de la langue souhaitée.

Notez comment LC_ALLnécessite que le nom exact et complet des paramètres régionaux, y compris le suffixe du jeu de caractères, soit efficace ( es_ES.UTF-8) (contrairement à LANGUAGE, pour lequel une simple balise de langue suffit (comme es)). Il en va de même pour le réglage LC_MESSSAGESet LANG. La spécification d'un nom de paramètres régionaux non valide / non installé entraîne le remplacement des paramètres régionaux POSIX et donc de l'anglais américain.


Notes de bas de page

[1] Les raisons pour lesquelles la réponse de Lekensteyn fonctionne même sans annulation / remplacement LANGUAGEsont une exception : si la LC_MESSAGESvaleur (effective) (généralement définie indirectement via LANGou LC_ALL) est soit Cou (son synonyme) POSIX, cette valeur est respectée, quelle que soit la valeur de LANGUAGE, si seulement. Inversement, si la LC_MESSAGESvaleur (effective) est un autre paramètre régional spécifique , LANGUAGEest prioritaire.

[2] Cela s'applique à Ubuntu proprement dit , mais pas nécessairement aux autres versions ; Lekensteyn déclare que Kubuntu ne se couche pasLANGUAGE .
Sans doute, neLANGUAGE devrait pas être défini par défaut, étant donné qu'en son absence, la LC_MESSAGESvaleur impliquée par la LANGvaleur (qui détermine les paramètres régionaux actuels) est respectée.

[3] Vous pouvez également utiliser cette approche pour passer à [US] English en attribuant soit LANGUAGE=Cou LANGUAGE=POSIX(comme alternative à, LANG=C/ LANG=POSIX), bien que je ne sache pas si cela est activement reconnu ou simplement un mécanisme de secours , étant donné que ces valeurs ne ne commencez pas avec une balise de langue ; peut-être que le meilleur choix serait en_US.

[4] Il y a un cas limite où cette approche ne fonctionne pas: essayer d'invoquer un exécutable avec un chemin - qu'il soit relatif ou absolu - ne passe PAS dans la langue spécifiée, tandis qu'un simple nom de fichier ne
LANGUAGE= LC_ALL=es_ES.UTF-8 /path/to/no_such_utilityfonctionne pas : ne fonctionne pas (génère un message dans les paramètres régionaux actuels), alors que le
LANGUAGE= LC_ALL=es_ES.UTF-8 no_such_utilityfait (génère un message d'erreur espagnol).
Si quelqu'un sait pourquoi et s'il y a une bonne raison à cela, faites-le nous savoir.

mklement0
la source
Pointe du chapeau à @ wjandrea pour son aide à la structuration de ce post.
mklement0