Pourquoi presque tous les programmes se plaignent-ils de mes paramètres régionaux?

29

J'utilise Arch Linux et j'ai suivi les instructions sur le wiki pour définir mes paramètres régionaux.

Presque tous les programmes qui s'exécutent se plaignent des paramètres régionaux - même locale. Cela ressemble à ceci:

% locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=en-US
LC_TIME=en-US
LC_COLLATE="POSIX"
LC_MONETARY=en-US
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT=en-US
LC_IDENTIFICATION="POSIX"
LC_ALL=

ou:

% perl
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "en-US",
    LC_NUMERIC = "en-US",
    LC_MONETARY = "en-US",
    LC_MEASUREMENT = "en-US",
    LC_CTYPE = "en_US.UTF-8",
    LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C")

Quelque chose de légèrement déroutant est que le /etc/locale.gena plusieurs exemples; toutes les lignes UTF-8 ont "quelque chose.UTF-8", et exécutent des locale-genémissions en_US.UTF-8... donependant son exécution, mais locale -a, qui est censé vous montrer les émissions locales disponibles en_US.utf8. J'ai essayé différentes combinaisons des deux formats dans /etc/locale-genet LOCALE=en /etc/rc.conf, mais rien n'a résolu le problème.

Information additionnelle:

% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8

La suggestion de Bruce Ediger de mettre en place LANG=Cet de LC_ALL=en_US.UTF-8travailler (en fait, mettre en place LC_ALLfixe, la mise en place LANGn'a pas d'importance), mais j'aimerais savoir ce qui se passe. Selon SUS , LC_ALL remplacera toutes les autres variables LC_ * si elle est définie et non nulle. Dans mon système, il est défini, mais il est nul, il doit donc être ignoré et d'autres valeurs doivent être utilisées à la place. Ce n'est pas ce qui se passe, il semble que les applications appellent setlocaleavec LC_ALL, obtiennent un NULLretour et génèrent une erreur, même lorsque d'autres appels setlocaleretournent une bonne chaîne.

Voici le haut d'un ltraceof locale(faites défiler vers la droite pour voir les valeurs de retour des fonctions)

% ltrace locale
(0, 0, 0, -1, 0x7f5c1ae44510)                                                                      = 0x7f5c1ae47140
__libc_start_main(0x401d70, 1, 0x7fff7c8cfbf8, 0x404610, 0x4046a0 <unfinished ...>
setlocale(0, "")                                                                                   = "en_US.UTF-8"
setlocale(5, "")                                                                                   = "en_US.UTF-8"
textdomain("libc")                                                                                 = "libc"
argp_parse(0x607280, 1, 0x7fff7c8cfbf8, 0, 0x7fff7c8cfad4)                                         = 0
setlocale(6, "")                                                                                   = NULL
dcgettext(0, 0x405aa8, 5, 0, 0)                                                                    = 0x405aa8
error(0, 2, 0x405aa8, 1, 0locale: Cannot set LC_ALL to default locale: No such file or directory)  
Shawn J. Goff
la source
pouvez-vous partager la sortie de locale -a?
njsg
J'allais souligner que vous devriez utiliser .utf8dans LOCALEet LC_*, mais cela .UTF-8fonctionne apparemment ici aussi ... Quant à en-US: apparaît-il (sans .utf8) dans locale -a?
njsg
1
Faites export LANG=Cet export LC_ALL=en_US.UTF-8voyez ce qui se passe. Mon ordinateur portable Arch linux a LOCALE="en_US.UTF-8"dans /etc/rc.conf, et je ne peux pas comprendre où mon ordinateur portable définit LANG = C.
Bruce Ediger
Pouvez-vous publier le contenu de votre /etc/locale.conf? Il semble que vous ayez accidentellement écrit LANG=en-US(avec trait d'union) au lieu de LANG=en_US(avec trait de soulignement).
Mikel
Et le contenu de /etc/locale.genserait également utile.
Mikel

Réponses:

18

Il vous manque un fichier qui serait utilisé pour définir les paramètres régionaux par défaut en l'absence de $LANGou $LC_ALL(ou tous les plus spécifiques $LC_whatever) en cours de définition.

Sur les anciennes glibc, c'est / usr / lib / locale / locale-archive. Parce que GNU / Linux est chaotique, vous devez utiliser strace pour déterminer quels fichiers sont attendus dans les versions particulières utilisées sur votre machine:

paramètres régionaux du fichier strace -e
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
access ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Aucun fichier ou répertoire de ce type)
open ("/ etc / ld.so.cache", O_RDONLY) = 3
open ("/ lib / libc.so.6", O_RDONLY) = 3
open ("/ usr / lib / locale / locale-archive", O_RDONLY | O_LARGEFILE) = 3

---------------------- Commentaires ajoutés 1 jour plus tard:

"ltrace -S" devrait être correct, car il affiche les appels système.

Sinon, "ltrace" n'est pas très utile (c'est-à-dire qu'il est contre-productif contre strace), car il ne montre que les appels les plus élevés. Celles-ci sont évidentes (setlocale (3)), alors que le vrai problème se produit dans libc.

Il semble que vous avez les premières données locales installées, depuis en_US.UTF-8 œuvres.

Si oui, alors quelque chose comme ça devrait résoudre votre problème, en définissant une valeur par défaut à l'échelle du système:

localedef -f UTF-8 -i en_US en_US.UTF-8
AR
la source
sudo localedef -f UTF-8 -i en_US en_US.UTF-8fonctionne sur Raspbian 2018-11-13 Lite.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
6

J'ai eu le même problème après la configuration d' /etc/locale.confaujourd'hui (concernant les récentes modifications apportées à /etc/rc.conf. Dans mon cas, il s'est avéré que les paramètres régionaux n'étaient pas installés.

Vérifiez /etc/locale.gen. Tous les paramètres régionaux auxquels vos variables d'environnement font référence doivent être activés (c'est-à-dire non commentés). Après avoir apporté vos modifications, exécutez sudo locale-genpour installer les paramètres régionaux sélectionnés.

Stefan Majewsky
la source
2

Suivre ce lien résout mon problème:

sudo localectl set-locale LANG=en_CA.UTF-8
# or change to en_US.UTF-8 depends on your locale-gen

il génère un fichier /etc/locale.confqui résout ce problème

Kokizzu
la source
1

J'ai eu des problèmes similaires récemment, tous les noms de fichiers Unicode n'étaient pas affichés correctement, quand j'ai accidentellement supprimé le 'LOCALE = en_US.utf8' dans /etc/rc.conf. J'ai donc vérifié le script de démarrage:

if [[ $DAEMON_LOCALE != [nN][oO] ]]; then
    export LANG=${LOCALE:-C}
    if [[ -r /etc/locale.conf ]]; then
        parse_envfile /etc/locale.conf "${localevars[@]}"
    fi
else
    export LANG=C
fi

La solution simple consiste à archiver DAEMON_LOCALEet LOCALEà vérifier /etc/rc.conf, assurez-vous que le premier ne l'était pas noet que le second n'était pas vide.

Marguerite
la source
-1

Peut-être que l'un de vos paramètres n'est pas valide? Ce sont mes paramètres régionaux pour référence; ils ne provoquent aucune erreur (KUbuntu 12.04):

LANG=en_AU.UTF-8
LANGUAGE=
LC_CTYPE="en_AU.UTF-8"
LC_NUMERIC="en_AU.UTF-8"
LC_TIME="en_AU.UTF-8"
LC_COLLATE="en_AU.UTF-8"
LC_MONETARY="en_AU.UTF-8"
LC_MESSAGES="en_AU.UTF-8"
LC_PAPER="en_AU.UTF-8"
LC_NAME="en_AU.UTF-8"
LC_ADDRESS="en_AU.UTF-8"
LC_TELEPHONE="en_AU.UTF-8"
LC_MEASUREMENT="en_AU.UTF-8"
LC_IDENTIFICATION="en_AU.UTF-8"
LC_ALL=
dwurf
la source