¿Cuál es la forma correcta de configurar la configuración regional de Python en Windows?

80

Estoy intentando ordenar una lista de cadenas de una manera consciente de la configuración regional. He usado la biblioteca de Babel para otras tareas relacionadas con i18n, pero no admite la clasificación. El localemódulo de Python proporciona una strcollfunción, pero requiere que la configuración regional del proceso se establezca con la que quiero trabajar. Es una especie de dolor, pero puedo vivir con eso.

El problema es que parece que no puedo establecer la configuración regional. La documentación del localemódulo da este ejemplo:

import locale
locale.setlocale(locale.LC_ALL, 'de_DE')

Cuando ejecuto eso, obtengo esto:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\Lib\locale.py", line 494, in setlocale
locale.Error: unsupported locale setting

¿Qué estoy haciendo mal?

DNS
fuente

Respuestas:

109

Parece que estás usando Windows. Las cadenas de configuración regional son diferentes allí. Eche un vistazo más preciso al documento:

locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform

En Windows, creo que sería algo como:

locale.setlocale(locale.LC_ALL, 'deu_deu')

MSDN tiene una lista de cadenas de idiomas y cadenas de países / regiones

Schnouki
fuente
5
FWIW, tuve el problema debajo de Ubuntu 13.04, Linux 3.8.0-19con python 2.7.4al intentar establecer la configuración regional en fr_FR. Configurarlo fr_FR.UTF-8funcionó para mí.
Zoneur
Para Python 3.6.3 en Conda 4.4.11, Windows 7, las cadenas de configuración regional parecen ser las mismas que en otros sistemas operativos.
srodriguex
2
Esta lista es más completa: msdn.microsoft.com/en-us/library/cc233982.aspx
Cristian Ciupitu
2
Los documentos vinculados parecen ser demasiado recientes para WServer2018R2 Tuve que usar 'eng_usa'( 'en_US'no funcionó)
Boop
17

Esta es la única forma correcta de usarlo, proporcionando un ejemplo para la configuración regional alemana:

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)
Boštjan Mejak
fuente
1
Esta es la única respuesta que realmente responde a la pregunta.
ImportanceOfBeingErnest
Esto me ayudó, pero tuve que cambiar Germana Portuguese_Brazil.1252. ¿Conoce una documentación que enumere estos valores?
Henrique Brisola
15

No debe pasar una configuración regional explícita a setlocale, está mal. Deja que se entere del medio ambiente. Tienes que pasarle una cadena vacía

import locale
locale.setlocale(locale.LC_ALL, '')
u0b34a0f6ae
fuente
10
No mencioné esto en la pregunta porque no estaba directamente relacionado, pero el código que estaba escribiendo en ese momento fue diseñado para su uso en un servidor web. En otras palabras, la configuración regional puede cambiar con cada solicitud y no es necesariamente la misma que la configuración regional del entorno.
DNS
2
DNS: ¿Ha leído los documentos sobre la configuración regional? Implica que podría ser peligroso llamar a setlocale "much", y no es seguro para subprocesos. Entonces, tal vez algo más que setlocale sea la solución. Gettext puede cargar diferentes catálogos y cambiar en tiempo de ejecución, por ejemplo; pero no sé para qué estás usando la configuración regional.
u0b34a0f6ae
A menos que su usuario no esté en su máquina local
Gabriel
8

Ubuntu

En Ubuntu, puede tener este problema porque no tiene ese local instalado en su sistema.

Desde shell intente un:

$> locale -a

y compruebe si encuentra la configuración regional que le interesa. De lo contrario, debe instalarla:

$> sudo apt-get install language-pack-XXX

donde XXX es su idioma (en mi caso "xxx = it", configuración regional italiana) Luego ejecute un dpkg-reconfigure:

$> sudo dpkg-reconfigure locales

Después de eso, intente nuevamente en su shell de python:

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

(esto es para la configuración regional italiana, que era lo que necesitaba)

linello
fuente
13
Esta pregunta se refiere específicamente a Windows
Christoph
7

Sé que esto se preguntó hace años, pero pensé en intentar agregar lo que descubrí, usando Python 3.6 en Windows:

import locale
for x in locale.windows_locale.values():
    print(x.replace('_','-'))

Probé algunos y eso también parece ser una forma de averiguar qué está disponible en Windows.

Es bueno saberlo: esto, por alguna razón, no es compatible con strptime () en la versión estable actual de Python

Y luego simplemente configura la configuración regional:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)

TheGeekGuy
fuente
4

De los documentos locale.setlocale:

locale.setlocale(category, locale=None):
    """
    Set the locale for the given category.  The locale can be
    a string, an iterable of two strings (language code and encoding),
    or None.
    """"

Bajo Linux (especialmente Ubuntu) puede usar

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

o

locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))

Obtendrá el mismo error si la configuración regional no está instalada en el sistema. Por lo tanto, asegúrese de tener la configuración regional instalada en su sistema:

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
Alexander Stefanov
fuente