web-dev-qa-db-fra.com

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

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

Presque tous les programmes qui fonctionnent se plaint de la locale - 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 déroutant légèrement est que le /etc/locale.gen a plusieurs exemples; Toutes les lignes UTF-8 ont "quelque chose.utf-8" et fonctionnent locale-gen spectacles en_US.UTF-8... done tandis que ça marche, mais locale -a, qui est censé vous montrer que les localités disponibles indique en_US.utf8. J'ai essayé diverses combinaisons de formats dans /etc/locale-gen et LOCALE= dans /etc/rc.conf, mais rien n'a corrigé le problème.

Information additionnelle:

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

Bruce Ediger's Suggestion de l'établissement LANG=C et LC_ALL=en_US.UTF-8 a travaillé (en fait, réglage LC_ALL réparé, régler LANG n'a pas d'importance), mais j'aimerais savoir ce qui se passe. Selon [~ # ~] SUS [~ # ~ ~] , lc_all remplacera toutes les autres variables LC_ * s'il est défini et non null. Dans mon système, il est défini, mais il est null, il convient donc d'ignorer et d'autres valeurs doivent être utilisées à la place. Ce n'est pas ce qui se passe, il semble que les applications appellent setlocale avec LC_ALL, obtenir un NULL arrière et générer une erreur, même lorsque d'autres appels à setlocale renvoient une bonne chaîne.

Voici le sommet d'un ltrace de locale (faire défiler la droite pour voir les valeurs de retour de la fonction)

% 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)  
29
Shawn J. Goff

J'ai eu le même problème après la mise en place /etc/locale.conf Juste aujourd'hui (relatif aux récents changements à /etc/rc.conf. Dans mon cas, il s'est avéré que les locaux n'étaient pas installés.

Vérifier /etc/locale.gen. Tous les locaux que la référence de vos variables d'environnement doit être activée (c'est-à-dire non commentée) là-bas. Après avoir effectué vos modifications, courez Sudo locale-gen Pour installer les paramètres locaux sélectionnés.

6
Stefan Majewsky

Après cela link 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.conf cela fixe ce problème

2
Kokizzu

J'ai eu des problèmes similaires récemment, tous les noms de fichiers Unicode ont été affichés de manière incorrecte lorsque je supprimai accidentellement le "locale = EN_US.UTF8" dans /etc/rc.conf. Alors j'ai 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

Une solution simple est chèque à la fois DAEMON_LOCALE et LOCALE dans /etc/rc.conf, assurez-vous que le premier n'était pas no et le second n'était pas vide.

1
daisy