Por que quase todos os programas reclamam da minha localidade?

29

Estou usando o Arch Linux e segui as instruções no wiki sobre como definir meu local.

Quase todos os programas executados reclamam da localidade - mesmo locale. Se parece com isso:

% 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 um pouco confuso é que o /etc/locale.genarquivo possui vários exemplos; todas as linhas UTF-8 têm "something.UTF-8" e a execução é locale-genexibida en_US.UTF-8... doneenquanto está sendo executada, mas locale -a, o que deve mostrar os locais disponíveis en_US.utf8. Eu tentei várias combinações de ambos os formatos em /etc/locale-gene LOCALE=em /etc/rc.conf, mas nada resolveu o problema.

Informação adicional:

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

A sugestão de Bruce Ediger de definir LANG=Ce LC_ALL=en_US.UTF-8trabalhar (de fato, definir LC_ALLcorrigiu, definir LANGnão importava), mas eu gostaria de saber o que está acontecendo. De acordo com o SUS , LC_ALL substituirá todas as outras variáveis ​​LC_ * se estiver definida e não nula. No meu sistema, ele está definido, mas é nulo, portanto deve ser ignorado e outros valores devem ser usados. Isso não é o que está acontecendo, parece que as aplicações estão chamando setlocalecom LC_ALL, recebendo uma NULLvolta, e gerando um erro, mesmo quando outras chamadas para setlocaleretornar uma seqüência boa.

Aqui está o topo de um ltracede 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)  
Shawn J. Goff
fonte
você pode compartilhar a saída de locale -a?
N
Eu estava indo para o ponto que você deve usar .utf8em LOCALEe LC_*, mas aparentemente .UTF-8funciona aqui também ... Quanto pt-BR: ele aparece (sem .utf8) em locale -a?
N
1
Faça export LANG=Ce export LC_ALL=en_US.UTF-8veja o que acontece. Meu laptop Arch Linux está LOCALE="en_US.UTF-8"no /etc/rc.conf e não consigo descobrir onde meu laptop define LANG = C.
12Preço:
Você pode postar o conteúdo do seu /etc/locale.conf? Parece que você escreveu acidentalmente LANG=en-US(com hífen) em vez de LANG=en_US(com sublinhado).
Mikel
E o conteúdo de /etc/locale.genseria útil também.
Mikel

Respostas:

18

Você está faltando um arquivo que seria usado para o padrão da localidade, na ausência de $LANGou $LC_ALL(ou tudo do mais específico $LC_whatever) sendo definido.

No glibc antigo, é / usr / lib / locale / locale-archive. Como o GNU / Linux é caótico, você deve usar o strace para determinar quais arquivos são esperados nas versões específicas em uso na sua máquina:

localidade do arquivo strace -e
execve ("/ usr / bin / locale", ["locale"], [/ * 36 vars * /]) = 0
acesso ("/ etc / ld.so.preload", R_OK) = -1 ENOENT (Nenhum arquivo ou diretório)
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

---------------------- Comentários adicionados 1 dia depois:

"ltrace -S" deve estar bem, pois mostra syscalls.

Caso contrário, "ltrace" não é muito útil (isto é, contraproducente versus strace), porque mostra apenas as chamadas mais altas. Isso é óbvio (setlocale (3)), enquanto o verdadeiro problema acontece dentro da libc.

Parece que você tem os dados de localidade brutos instalados, pois o en_US.UTF-8 funciona.

Nesse caso, algo como isto deve resolver seu problema, definindo um padrão para todo o sistema:

localedef -f UTF-8 -i en_US en_US.UTF-8
AR
fonte
sudo localedef -f UTF-8 -i en_US en_US.UTF-8funciona no Raspbian 2018-11-13 Lite.
Ciro Santilli # 25/18
6

Eu tive o mesmo problema depois de configurar /etc/locale.confapenas hoje (relacionado às alterações recentes em /etc/rc.conf. No meu caso, verificou-se que os locais não estavam instalados.

Verifique /etc/locale.gen. Todas as localidades às quais as variáveis ​​de ambiente referenciam devem ser ativadas (ou seja, não comentadas) lá. Depois de fazer as alterações, execute sudo locale-genpara instalar os locais selecionados.

Stefan Majewsky
fonte
2

Seguir este link resolve meu problema:

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

ele gera um arquivo /etc/locale.confque corrige esse problema

Kokizzu
fonte
1

Eu tive problemas semelhantes recentemente, todos os nomes de arquivos unicode foram exibidos incorretamente quando removi acidentalmente o 'LOCALE = en_US.utf8' em /etc/rc.conf. Então eu verifiquei o script de inicialização:

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

A solução simples é fazer check DAEMON_LOCALE- LOCALEin e check - in /etc/rc.conf, verifique se o primeiro não estava noe o segundo não estava vazio.

margarida
fonte
-1

Talvez uma das suas configurações seja inválida? Essas são minhas configurações de localidade para referência; eles não causam erros (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
fonte