Erro de localidade do Python: configuração de localidade não suportada


317

Por que obtenho o seguinte erro ao fazer isso em python:

>>> import locale
>>> print str( locale.getlocale() )
(None, None)
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 531, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

Isso funciona com outros locais como fr ou nl também. Estou usando o Ubuntu 11.04.

Atualização: O procedimento a seguir não produziu nada:

dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

8
Você tem uma de_DElista locale -a? Caso contrário, você deve instalá- lo.
Bakuriu 27/01

1
Relacionado: um script bash para instalar todos os locais no Ubuntu.
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')está errado. Você precisa locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
9138 Martin Thoma

2
Às vezes você pode descobrir uma codificação disponível para o idioma / país que você deseja usando o built-in aliases: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
Jrgray #

Respostas:


647

Execute os seguintes comandos

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

Isso resolverá isso.

Certifique-se de combinar a .UTF-8peça com a sintaxe real encontrada na saída, por locale -aexemplo, .utf8em alguns sistemas.


8
Não precisei usar o comando dpkg. Afinal, se o problema estiver ocorrendo localmente, a solução real seria adicionar os dois primeiros comandos aos aplicativos de inicialização.
RolandiXor

2
Isso não funcionou para mim. export LC_ALL="en_US.UTF-8"falhou com -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) O que funcionou estava fazendo isso: #export LC_ALL=C
314 Jonathan Jonathan


197

Você provavelmente não tem nenhum de_DEcódigo de idioma disponível.

Você pode visualizar uma lista de códigos de idioma disponíveis com o locale -acomando Por exemplo, na minha máquina:

$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
it_CH.utf8
it_IT.utf8
POSIX

Observe que, se você deseja definir o código do idioma, it_ITtambém deve especificar .utf8:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'it_IT')   # error!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 539, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>> locale.setlocale(locale.LC_ALL, 'it_IT.utf8')
'it_IT.utf8'

Para instalar um novo código de idioma, use:

sudo apt-get install language-pack-id

onde idestá o código do idioma (extraído daqui )

Depois de instalar o código de idioma, siga as orientações de Julien Palard e reconfigure os códigos de idioma com:

sudo dpkg-reconfigure locales

Isso não funcionou no meu docker-container Debian. Mas isso funcionou. stackoverflow.com/questions/28405902/…
Chris

45

Uma das respostas acima fornece a solução:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

O problema com a solução acima é que isso deve ser feito no shell do linux. No entanto, se você estiver fornecendo seu código para trabalhar na máquina cliente, essa é uma abordagem ruim. Eu também tentei executar os comandos acima usando os.system (), mas ainda assim não funciona.

A solução que funcionou para mim é

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')

32

Uma solução mais permanente seria preencher os valores ausentes, na saída mostrada pelo comando: locale

A saída de localeé:

 $ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Para preencher os valores ausentes, edite ~ / .bashrc:

 $ vim ~/.bashrc

Adicione as seguintes linhas após o comando acima (suponha que você queira que o en_US.UTF-8 seja o seu idioma):

export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

Se este arquivo for ReadOnly, você precisará seguir as etapas mencionadas pelo The GeekyBoy . A resposta dada pelo Dr. Beco no Superusuário tem detalhes relacionados ao salvamento de arquivos somente leitura.

Depois de salvar o arquivo, faça:

$ source ~/.bashrc

Agora você não estará mais enfrentando o mesmo problema.



6

No Arch Linux, eu era capaz de corrigir isso executando sudo locale-gen


4

Para constar, eu tive o mesmo problema, mas nenhuma das soluções funcionou. Eu havia atualizado meu computador e migrado meu PC. Eu tinha um código de idioma misto inglês e espanhol:

$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Mas, na minha nova instalação Debian, acabei de selecionar inglês como local. O que finalmente funcionou foi reconfigurar o pacote de localidades para adicionar e gerar espanhol também.

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8

4

Basta abrir o arquivo .bashrc e adicionar este

exportar LC_ALL = C

e digite source .bashrc no terminal


4

Você erro diz claramente, você está tentando usar localidade algo não estava lá.

>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 581, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

locale.Error: configuração de local não suportada

Para verificar as configurações disponíveis, use locale -a

deb@deb-Latitude-E7470:/ambot$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

então você pode usar um dentre

>>> locale.setlocale(locale.LC_ALL, 'en_AG.utf8')
'en_AG.utf8'
>>> 

para de_DE

Esse arquivo pode ser ajustado manualmente ou atualizado usando a ferramenta update-locale.

update-locale LANG=de_DE.UTF-8

2
  • execute este comando localepara obter qual localidade é usada. Tal como:

LANG = pt_BR.UTF-8
LANGUAGE = pt_BR: pt
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = "pt_BR.UTF-8"
LC_TIME = "pt_BR.UTF-8"
LC_COLLATE = "pt_BR.UTF-8"
LC_MONETARY = " pt_US.UTF-8" .UTF-8 "
LC_MESSAGES =" en_US.UTF-8 "
LC_PAPER =" en_US.UTF-8 "
LC_NAME =" en_US.UTF-8 "
LC_ADDRESS =" en_US.UTF-8 "
LC_TELEPHONE =" en_US.UTF-8 "
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL =

  • procure a lista de localidades listadas na primeira etapa do /etc/locale-genarquivo. Descomente os usados
  • executar locale-genpara gerar localidades recém-adicionadas

2

Na minha opinião, a maneira mais fácil de configurar o código do idioma local em python {, 3} é:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'

Então, as coisas com reconhecimento de localidade simplesmente funcionam, se você estiver em uma distribuição Linux decente, e também deve funcionar com distribuições binárias de outros sistemas operacionais (ou isso é um bug IMHO).

>>> import datetime as dt
>>> print(dt.date.today().strftime("%A %d. %B %Y"))
Sonntag 11. Dezember 2016

2

Coloque-o Dockerfileacima do ENV.

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

ENV LANG en_US.UTF-8

Obrigado, tentei as outras soluções (dpkg-reconfigure locales, locale-gen) e nada mais funcionou no meu contêiner debian: 9. Essa é realmente a maneira padrão de criar o código do idioma en_US.UTF-8?
Jamshid

Sim, acho que é o local padrão en_US.UTF-8. Quando você executa localeno terminal, obtém `LANG = pt_BR.UTF-8 e outro código do idioma? stackoverflow.com/questions/36394101/…
Seenu S

1

Este erro pode ocorrer, se você acabou de adicionar um novo código de idioma. Você precisa reiniciar o shell interativo python ( quit() e python) para obter acesso a ele.



0

Ao tentar fazer o python cuspir nomes em localidades específicas, cheguei aqui com o mesmo problema.

Ao buscar a resposta, as coisas ficaram um pouco místicas.

Eu encontrei esse código python.

import locale
print locale.getdefaultlocale()
>> ('en_DK', 'UTF-8')

E de fato locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')funciona

Usando dicas aqui, testei mais para ver o que está disponível usando o código python

import locale
loc_list = [(a,b) for a,b in locale.locale_alias.items() ]
loc_size = len(loc_list)
print loc_size,'entries'

for loc in loc_list:
    try:
        locale.setlocale(locale.LC_TIME, loc[1])
        print 'SUCCES set {:12} ({})'.format(loc[1],loc[0])
    except:
        pass

que produz

858 entries
SUCCES set en_US.UTF-8  (univ)
SUCCES set C            (c.ascii)
SUCCES set C            (c.en)
SUCCES set C            (posix-utf2)
SUCCES set C            (c)
SUCCES set C            (c_c)
SUCCES set C            (c_c.c)
SUCCES set en_IE.UTF-8  (en_ie.utf8@euro)
SUCCES set en_US.UTF-8  (universal.utf8@ucs4)
SUCCES set C            (posix)
SUCCES set C            (english_united-states.437)
SUCCES set en_US.UTF-8  (universal)

Dos quais apenas acima está funcionando! Mas oen_DK.UTF-8 não está nesta lista, embora funcione!?!? O que?? E a lista de localizações geradas em python contém muitos combos de da e DK, o que estou procurando, mas novamente não há UTF-8 para da / DK ...

Estou em uma distro do Point Linux (baseada no Debian), e aqui localediz, entre outras coisas LC_TIME="en_DK.UTF-8", que eu sei que funciona, mas não o local que eu preciso.

locale -a diz

C
C.UTF-8
en_DK.utf8
en_US.utf8
POSIX

Então, definitivamente, preciso instalar outro código do idioma , o que eu fiz editando /etc/locale.gen, descomente a linha necessária da_DK.UTF-8 UTF-8e execute o comandolocale-gen

Agora locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')também funciona, e posso obter meus nomes localizados de dia e mês.

Minha conclusão:

Python: locale.locale_alias não ajuda em nada a encontrar localidades disponíveis !!!

Linux: É muito fácil obter a lista de localidades e instalar uma nova localidade. Muita ajuda disponível.

Windows: Eu tenho investigado um pouco, mas nada conclusivo. No entanto, existem posts que levam a respostas, mas não senti vontade de prosseguir.


0

se bem entendi, a principal fonte de erro aqui é a sintaxe exata do nome do código do idioma. Especialmente porque parece diferir entre distribuições. Eu já vi mencionado aqui em diferentes respostas / comentários:

de_DE.utf8
de_DE.UTF-8

Mesmo que isso seja obviamente o mesmo para um ser humano, o mesmo não se aplica ao seu algoritmo determinístico padrão.

Então você provavelmente fará algo como:

DESIRED_LOCALE=de
DESIRED_LOCALE_COUNTRY=DE
DESIRED_CODEPAGE_RE=\.[Uu][Tt][Ff].?8
if [ $(locale -a | grep -cE "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}") -eq 1 ]
then
    export LC_ALL=$(locale -a | grep -m1 -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")
    export LANG=$LC_ALL
else
    echo "Not exactly one desired locale definition found: $(locale -a | grep -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")" >&2
fi

0

python procura por .UFT-8, mas você provavelmente tem .utf8 tente instalar os pacotes .UFT-8 com os códigos de idioma sudo dpkg-reconfigure


-2

primeiro, verifique se você tem o pacote de idiomas instalado fazendo:

sudo apt-get install language-pack-en-base


sudo dpkg-reconfigure locales

o pacote de idioma inglês é instalado por padrão - além disso, a resposta já é dada aqui e este não possui formatação.
Skandix 14/03/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.