locale.getlocale () problemas em OSX
-
06-07-2019 - |
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=
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).