Estou usando o Arch Linux e segui as instruções no wiki sobre como configurar minha localidade .
Quase todos os programas que são executados reclamam da localidade - até locale
. Parece assim:
% 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")
Algo ligeiramente confuso é que o /etc/locale.gen
tem vários exemplos; todas as linhas UTF-8 têm "alguma coisa.UTF-8" e a execução locale-gen
mostra en_US.UTF-8... done
enquanto está sendo executado, mas locale -a
, que deve mostrar as localidades disponíveis, mostra en_US.utf8
. Eu tentei várias combinações de ambos os formatos em /etc/locale-gen
e LOCALE=
em /etc/rc.conf
, mas nada corrigiu o problema.
Informações adicionais:
% locale -a
C
POSIX
en_US
en_US.iso88591
en_US.utf8
A sugestão de Bruce Ediger de configurar LANG=C
e LC_ALL=en_US.UTF-8
funcionou (na verdade, definir LC_ALL
corrigiu, definindo LANG
não importava), mas eu gostaria de saber o que está acontecendo. De acordo com o SUS , o LC_ALL substituirá todas as outras variáveis LC_ * se estiver definido e não nulo . No meu sistema, ele é definido, mas é nulo, portanto deve ser ignorado e outros valores devem ser usados. Não é isso que está acontecendo, parece que os aplicativos estão chamando setlocale
com LC_ALL
, recuperando NULL
e gerando um erro, mesmo quando outras chamadas para setlocale
retornam uma boa cadeia.
Aqui está o topo de um ltrace
de locale
(role para a direita para ver os valores de retorno da função)
% 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)