Pergunta

eu preciso para obter a localidade do sistema para fazer uma série de coisas, em última análise, eu quero traduzir meu aplicativo usando gettext. Eu vou distribuí-lo no Linux e OSX, mas eu tive problemas no OSX Snow Leopard:

$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'sv_SE.UTF-8'
>>> locale.getlocale()
('sv_SE', 'UTF8')

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'C'
>>> locale.getlocale()
(None, None)

Ambos os sistemas estão usando sueca. No Linux, a variável de ambiente LANG já estiver definida como "sv_SE.UTF-8". Se passar essa variável para o pitão no OSX (LANG="sv_SE.UTF-8" python vez), localidade é detectado muito bem. Mas não deve locale.getlocale()be capaz de buscar qualquer idioma do sistema operacional tem? Eu não quero forçar os usuários a LANG set, LC_ALL ou qualquer variável de ambiente em tudo.

Saída do comando locale:

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
Foi útil?

Solução

Odd no OSX (smow Leopard 10.6.1) I get

$ python
Python 2.6.1 (r261:67515, Jul  7 2009, 23:51:51) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.  
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, '')
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

Editar:

Eu só descobri isso na href="http://article.gmane.org/gmane.comp.python.apple/16205" rel="nofollow noreferrer"> lista python maçã

Basicamente, ele depende do que está definido no seu ambiente em tempo de execução (um dos LANG, IDIOMA, LC_ALL) eu tinha LANG = en_GB.UTF-8 no meu ambiente shell

Outras dicas

Addmittedly um hack horrível, mas eu inserido o seguinte:

import platform

# ...

# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
    import locale
    if locale.getlocale()[0] is None:
        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

em um ponto no início de um programa de mina . Depois que eu poderia executar o meu programa usando ambiente shell sem modificações em todos os OS'es relevantes para mim (os meus números de programa fora o idioma a ser usado mais tarde em seu processamento de qualquer maneira).

Parece que você pode mudar de localidade, alterando LC_ALL variável de ambiente.

$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)    

$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

A partir aqui : Tente adicionar ou editar o arquivo ~/.profile ou ~/.bash_profile para ele para exportar corretamente suas configurações de localização sobre o início de um nova sessão.

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8

velha questão, mas esta ajuda pode outros: este é um erro Python que a partir de março 2016 ainda não está resolvido em qualquer Python 2 ou 3: rel https://bugs.python.org/issue18378 .

O resumo é que Python assume GNU-como locais e balks no (corretas POSIXly) divergências como aqueles em ambientes BSD (como é OS X). E o local UTF8 existe no BSD, não em Linux, daí o problema.

Quanto a soluções ou depuração: as variáveis ??de ambiente locais pode ser definido por Terminal.app (consulte Preferências - Perfis - Avançados - internacionais, similarmente assim para iTerm ou qualquer outro). Assim, pode-se encontrar as variáveis ??de ambiente local definido quando em uma janela de terminal, mas encontrar as variáveis ??não definidas ao executar um aplicativo empacotado.

Para alguns casos (como o Sphinx em python 2,7 e 3,5 morrendo em OS X por causa de "ValueError: desconhecido localidade: UTF-8")., A desactivação das preferências caixa de seleção para definir variáveis ??de ambiente local é a solução

Mas isso pode causar problemas em outros programas: se os vars localidade não estão definidos, o bash 4.3 (a partir MacPorts) vai reclamar em cada tempo com "aviso: setlocale: LC_CTYPE: não pode mudar de localidade (): Nenhum tal lima ou diretório "...

Assim, dado que o bug está em Python, a solução deve ser feito provavelmente no programa python (como em resposta de @Jacob Oscarson) ou invocação python (definindo o local vars para algum valor adequado).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top