J'essaie de trier une liste de chaînes de manière adaptée aux paramètres régionaux. J'ai utilisé la bibliothèque Babel pour d'autres tâches liées à i18n, mais elle ne prend pas en charge le tri. Le module locale
de Python fournit une fonction strcoll
, mais nécessite que les paramètres régionaux du processus soient définis sur celui avec lequel je veux travailler. Une sorte de douleur, mais je peux vivre avec.
Le problème est que je n'arrive pas à définir réellement les paramètres régionaux. La documentation du module locale
donne cet exemple:
import locale
locale.setlocale(locale.LC_ALL, 'de_DE')
Quand je lance ça, j'obtiens ceci:
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'est-ce que je fais mal?
Il semble que vous utilisiez Windows. Les chaînes de paramètres régionaux y sont différentes. Jetez un oeil plus précis sur le doc:
locale.setlocale(locale.LC_ALL, 'de_DE') # use German locale; name might vary with platform
Sous Windows, je pense que ce serait quelque chose comme:
locale.setlocale(locale.LC_ALL, 'deu_deu')
MSDN a une liste de chaînes de langue et de chaînes de pays/région
Vous devez ne pas passer de locale explicite à setlocale, c'est faux. Laissez-le découvrir de l'environnement. Vous devez lui passer une chaîne vide
import locale
locale.setlocale(locale.LC_ALL, '')
C'est la seule façon de le faire sous Windows (exemple pour les paramètres régionaux allemands):
import locale
locale.setlocale(category=locale.LC_ALL,
locale="German") # Not locale="de_DE"
Je sais que cela a été demandé il y a des années, mais je pensais que j'essaierais d'ajouter ce que j'ai découvert, en utilisant Python 3.6 sous Windows:
import locale
for x in locale.windows_locale.values():
print(x.replace('_','-'))
J'en ai essayé et cela semble aussi être un moyen de découvrir ce qui est disponible sur Windows.
Bon à savoir: pour une raison quelconque, ce n'est pas compatible avec strptime () dans la version stable actuelle de Python
Et puis vous définissez simplement les paramètres régionaux:
locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)
Sur Ubuntu, vous pouvez avoir ce problème car vous n'avez pas installé ce local sur votre système.
Depuis Shell, essayez:
$> locale -a
et vérifiez si vous trouvez les paramètres régionaux qui vous intéressent. Sinon, vous devez l'installer:
$> Sudo apt-get install language-pack-XXX
où XXX est votre langue (dans mon cas "xxx = it", paramètres régionaux italiens) Exécutez ensuite un dpkg-reconfigure
:
$> Sudo dpkg-reconfigure locales
Après cela, essayez à nouveau dans votre python Shell:
>>> import locale
>>> locale.setlocale(locale.LC_ALL,'it_IT.UTF-8')
(c'est pour les paramètres régionaux italiens, ce dont j'avais besoin)
Depuis les documents 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.
""""
Sous Linux (en particulier Ubuntu), vous pouvez soit utiliser
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
ou
locale.setlocale(locale.LC_ALL, ('de', 'utf-8'))
Vous obtiendrez la même erreur si l'environnement local est non installé sur le système. Donc, assurez-vous d'avoir les paramètres régionaux installés sur votre système:
$ locale -a # to list the currently installed locales
$ (Sudo) locale-gen de_DE.UTF-8 # to install new locale