Pregunta

Necesito obtener la configuración regional del sistema para hacer varias cosas, en última instancia, quiero traducir mi aplicación usando gettext. Lo voy a distribuir tanto en Linux como en OSX, pero me encontré con problemas en 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 sistemas utilizan idiomas suecos. En Linux, la variable de entorno LANG ya está configurada en "sv_SE.UTF-8". Si paso esa variable a Python en OSX ( LANG = " sv_SE.UTF-8 " python en su lugar), la localización se detecta muy bien. Pero, ¿no debería locale.getlocale () poder buscar cualquier idioma que tenga el sistema operativo? No quiero obligar a los usuarios a configurar LANG , LC_ALL o cualquier variable de entorno en absoluto.

Salida del comando locale :

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

Solución

Extraño en OSX (Smow Leopard 10.6.1) me sale

$ 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:

Acabo de encontrar esto en la lista de correo de Apple Python

Básicamente depende de lo que esté configurado en su entorno en tiempo de ejecución (uno de LANG, LANGUAGE, LC_ALL) Tenía LANG = en_GB.UTF-8 en mi entorno de shell

Otros consejos

Es cierto que fue un truco horrible, pero inserté esto:

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')

en un punto temprano en un programa de mine . Después de eso, podría ejecutar mi programa utilizando un entorno de shell no modificado en todos los sistemas operativos relevantes para mí (mi programa descubre el lenguaje que se utilizará más adelante en su procesamiento de todos modos).

Parece que puede cambiar la configuración regional cambiando la variable de entorno LC_ALL .

$ 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')

Desde aquí : intente agregar o editar el ~ / .profile o ~ / .bash_profile para exportar correctamente la configuración regional al iniciar una nueva sesión.

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

Antigua pregunta, pero esto puede ayudar a otros: este es un error de Python que a partir de marzo de 2016 aún no se ha resuelto en Python 2 o 3: https://bugs.python.org/issue18378 .

El resumen es que Python asume configuraciones regionales similares a GNU y evita (divergencias POSIXY correctas) como en entornos BSD (como es OS X). Y el entorno local UTF8 existe en BSD, no en Linux, de ahí el problema.

En cuanto a soluciones o depuración: Terminal.app puede configurar las variables de entorno local (consulte Preferencias - Perfiles - Avanzado - Internacional; de manera similar para iTerm o lo que sea). Por lo tanto, uno puede encontrar las variables de entorno local establecidas en una ventana de terminal, pero las variables NO se establecen cuando se ejecuta una aplicación empaquetada.

Para algunos casos (como Sphinx en Python 2.7 y 3.5 muriendo en OS X debido a '' ValueError: locale desconocido: UTF-8 ''), la solución es deshabilitar la casilla de verificación de preferencias para configurar las variables de entorno locales.

Pero eso puede causar problemas en otros programas: si los valores locales no están configurados, bash 4.3 (de MacPorts) se quejará en cada solicitud con " advertencia: setlocale: LC_CTYPE: no puede cambiar la configuración regional (): No existe dicho archivo o directorio " ...

Entonces, dado que el error está en Python, la solución probablemente debería hacerse en el programa python (como en la respuesta de @Jacob Oscarson) o en la invocación de python (configurando los valores locales en algún valor adecuado).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top