Comment changer la variable d'environnement locale?

18

J'ai généré des fichiers de localisation en_US.utf8 , et_EE.iso88591 et ru_RU.utf8 . Maintenant, si j'essaie de changer l'une des variables locales en ru_RU.utf8 ou en_US.utf8 , cela n'a aucun effet:

# locale -a
C
en_US.utf8
et_EE
et_EE.iso88591
POSIX
ru_RU.utf8
# LC_TIME=ru_RU.utf8
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# LC_TIME="ru_RU.utf8"
# locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
# 

Cependant, si je change la variable LANG = , toutes les autres variables sauf LANGUAGE = et LC_ALL = prennent la valeur de la variable LANG = . Existe-t-il un moyen de modifier chaque variable locale séparément? De plus, ai-je raison de dire que les variables locales ne sont pas des variables shell normales, mais plutôt des paramètres de l' utilitaire local ?

Martin
la source

Réponses:

15

Vous pouvez définir n'importe quelle catégorie de paramètres régionaux indépendamment. LANGs'applique uniquement aux catégories qui ne sont pas définies explicitement.

LANGet LC_xxxsont des variables d'environnement ordinaires. Ce ne sont pas des paramètres pour l' localeutilitaire: le localeprogramme n'est impliqué dans aucun traitement de paramètres régionaux, c'est juste un petit utilitaire pour signaler les paramètres régionaux actuels et disponibles.

Lorsque vous écrivez LC_TIME=ru_RU.utf8, cela ne définit pas une variable d'environnement, seulement une variable shell. Les variables du shell sont internes au shell, elles ne sont pas vues par les autres programmes. Les variables d'environnement, en revanche, sont héritées par les programmes que le shell démarre. Vous devez également exporter la variable dans l'environnement:

$ LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="et_EE.iso88591"
$ export LC_TIME
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"

ou directement

$ export LC_TIME=ru_RU.utf8
$ locale | grep LC_TIME
LC_TIME="ru_RU.utf8"
Gilles 'SO- arrête d'être méchant'
la source
"LANG et LC_xxx sont des variables d'environnement ordinaires" Comment savez-vous cela LANGet LC_xxxsont des variables d'environnement? mes tests montrent que seulement LANGet LANGUAGEet LC_MESSAGESet LC_ALLsont des variables d'environnement, tandis que d'autres variables aiment LC_CTYPEet LC_MONETARYne sont pas des variables d'environnement (aussi, ce ne sont pas des variables shell)?
rony_t
@rony_t Vous pouvez consulter le code source des applications et des bibliothèques, consulter leur documentation ou les expérimenter. Par exemple, calculez env LC_TIME=en_GB dateavec env LC_TIME=fr_FR dateet env PATH="$PATH" date(évidemment, choisissez les paramètres régionaux qui existent sur votre système). De toute évidence, chaque variable peut ou non être définie dans l'environnement d'un processus donné. Quels tests avez-vous effectués? Êtes-vous sûr que l'application que vous avez utilisée se comporte différemment selon LC_CTYPE(assez courante) et LC_MONETARY(assez rare)?
Gilles 'SO- arrête d'être méchant'
Dans le terminal, j'ai exécuté la printenvcommande pour répertorier les variables d'environnement de bash, et uniquement LANGet LANGUAGEet LC_MESSAGESet LC_ALLont été répertoriés comme variables d'environnement. J'ai également exécuté la commande set -o posixsuivie de la commande setpour obtenir les variables d'environnement et les variables shell de bash, et seulement LANGet LANGUAGEet LC_MESSAGESet LC_ALLont été répertoriés. Cela signifie donc que LANGet LANGUAGEet LC_MESSAGESet LC_ALLsont des variables d'environnement et que les autres variables locales ne le sont pas, et ce ne sont pas non plus des variables shell.
rony_t
@rony_t Non , cela signifie que vous avez défini les variables d'environnement LANG, LANGUAGE, LC_MESSAGESet LC_ALL. (Vous l'avez fait explicitement ou votre distribution ou votre administrateur système l'a fait pour vous.) Vous pouvez définir une variable d'environnement par n'importe quel nom (syntaxiquement valide)! Mais certains noms sont significatifs pour certaines applications, et certains noms ne le sont pas. LC_MESSAGES, LC_CTYPE, LC_TIMEEt ainsi de suite sont utilisés par des applications qui se soucient de la langue des messages d'erreur, le codage de caractères, le format de l' heure, et ainsi de suite.
Gilles 'SO- arrête d'être méchant'
@rony_t Au fait, votre configuration est très étrange. Le paramètre de LC_ALLremplace tous les autres paramètres, donc la valeur des autres variables locales n'a pas d'importance. Il n'est normalement utilisé que temporairement pour forcer un programme à utiliser un environnement local donné, cela n'a aucun sens de l'avoir dans votre environnement normal.
Gilles 'SO- arrête d'être méchant'
6

Sous les distributions basées sur Fedora / CentOS / RHEL, je pense que vous pouvez changer les paramètres régionaux en l'un des paramètres régionaux affichés lorsque vous exécutez la locale -acommande dans ce fichier système:

/etc/sysconfig/i18n

Par exemple sur mon système Fedora 14:

$ more /etc/sysconfig/i18n 
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

Sous GNOME, vous pouvez exécuter l'application d'aide:

system-config-language

Ce qui fait apparaître cette interface graphique:

             ss de lang.  gui

Je pense que c'est légèrement différent pour les distributions Debian / Ubuntu. Je crois que c'est ce fichier:

/etc/default/locale

Je pense que ce sont des variables d'environnement, mais je ne sais pas trop comment les applications les utilisent, le cas échéant.

Les références

slm
la source
4

Sur RedHat 6 au moins, notez que si LC_ALL est défini, la définition d'autres variables d'environnement LC_ * n'aura aucun effet, car LC_ALL a priorité sur toutes les autres variables d'environnement LC_ *.

[root@nbu76 bin]# LC_TIME=en_US.UTF-8
[root@nbu76 bin]# export LC_TIME
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_IE"
LC_NUMERIC="en_IE"
LC_TIME="en_IE"
...
LC_ALL=en_IE
[root@nbu76 bin]# unset LC_ALL
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_US.UTF-8
...
LC_ALL=
[root@nbu76 bin]# export LC_TIME=en_IE
[root@nbu76 bin]# locale
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_IE
....
LC_ALL=
Kiwicmc
la source
1

Dans les systèmes Debian, on peut exécuter dpkg-reconfigure localespour définir la langue principale et en rendre d'autres disponibles; alors on peut exécuter update-localepour définir la LANGUAGEvariable d'environnement /etc/default/localepour avoir des langues de secours.

lfd
la source
2
dpkg-reconfigure locales, paslocale
lauriys