web-dev-qa-db-fra.com

Erreur de paramètres régionaux Python: paramètre de paramètres régionaux non pris en charge

Pourquoi ai-je le message d'erreur suivant lorsque je fais cela en python:

>>> import locale
>>> print str( locale.getlocale() )
(None, None)
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 531, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

Cela fonctionne également avec d’autres régions comme fr ou nl. J'utilise Ubuntu 11.04.

Mise à jour: Les opérations suivantes n'ont rien donné:

dpkg-reconfigure locales
Perl: warning: Setting locale failed.
Perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = (unset)
    are supported and installed on your system.
Perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
260
toom

Exécuter les commandes suivantes

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
Sudo dpkg-reconfigure locales

Cela résoudra ce problème.

Veillez à faire correspondre la partie .UTF-8 à la syntaxe réelle trouvée dans le résultat de locale -a exemple .utf8 sur certains systèmes.

527
Muhammad Hassan

Vous n'avez probablement aucun paramètre local de_DE disponible.

Vous pouvez afficher une liste des paramètres régionaux disponibles avec la commande locale -a . Par exemple, sur mon ordinateur:

$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
it_CH.utf8
it_IT.utf8
POSIX

Notez que si vous souhaitez définir les paramètres régionaux sur it_IT, vous devez également spécifier le .utf8:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'it_IT')   # error!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 539, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>> locale.setlocale(locale.LC_ALL, 'it_IT.utf8')
'it_IT.utf8'

Pour installer un nouvel environnement local, utilisez:

Sudo apt-get install language-pack-id

id est le code de langue (pris de ici )

Après vous avez installé les paramètres régionaux, suivez les conseils de Julien Palard et reconfigurez les paramètres régionaux avec:

Sudo dpkg-reconfigure locales
176
Bakuriu

Selon ce lien , il est résolu en entrant cette commande:

exportation LC_ALL = C

148

Une des réponses ci-dessus fournit la solution:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
Sudo dpkg-reconfigure locales

Le problème avec la solution ci-dessus est que cela doit être fait sur le shell Linux. Cependant, si vous fournissez votre code pour qu'il fonctionne sur la machine cliente, c'est une mauvaise approche. J'ai également essayé d'exécuter les commandes ci-dessus en utilisant os.system (), mais cela ne fonctionne toujours pas.

La solution qui a fonctionné pour moi est

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
43
Ayush Vatsyayan

Une solution plus permanente consisterait à renseigner les valeurs manquantes dans la sortie affichée par la commande: locale

La sortie de locale est: 

 $ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Pour remplir les valeurs manquantes, éditez ~/.bashrc: 

 $ vim ~/.bashrc

Ajoutez les lignes suivantes après la commande ci-dessus (supposons que vous vouliez en_US.UTF-8 être votre langue):

export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

Si ce fichier est en lecture seule, vous devrez suivre les étapes mentionnées par The GeekyBoy . La réponse donnée par Dr Beco dans Superuser contient des détails sur la sauvegarde des fichiers en lecture seule.

Après avoir sauvegardé le fichier, faites:

$ source ~/.bashrc

Maintenant, vous ne rencontrerez plus le même problème.

31
lorenzofeliz

Si vous êtes sur une Debian (ou une fourche Debian), vous pouvez ajouter des locales à l'aide de:

dpkg-reconfigure locales
10
Julien Palard

Sur Arch Linux, j'ai pu résoudre ce problème en exécutant Sudo locale-gen

5
Keith Smiley

Pour mémoire, j'avais le même problème, mais aucune des solutions ne fonctionnait .. J'ai mis à niveau mon ordinateur et migré mon ordinateur. J'ai eu un endroit mixte anglais et espagnol:

$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Mais, lors de ma nouvelle installation de Debian, je viens de choisir l'anglais comme paramètre régional. Ce qui a finalement fonctionné a été de reconfigurer le paquetage locales pour ajouter et générer de l’espagnol.

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8
3
kikeenrique
  • exécutez cette commande locale pour connaître les paramètres régionaux utilisés. Tel que:

LANG = en_US.UTF-8
LANGUAGE = en_US: en
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"
LC_COLLATE = "en_US.UTF-8"
LC_MONETARY = "en_US.UTF-8"
LC_MESSAGES = "en_US.UTF-8"
LC_PAPER = "en_US.UTF-8"
LC_NAME = "en_US.UTF-8"
LC_ADDRESS = "en_US.UTF-8"
LC_TELEPHONE = "en_US.UTF-8"
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL = 

  • recherchez la liste des locales répertoriées à la première étape dans le fichier /etc/locale-gen. Ne commentez pas les anciens
  • lancez locale-gen pour générer les locales récemment ajoutées
2
andy

Si j'étais vous, j'utiliserais BABEL: http://babel.pocoo.org/en/latest/index.html

J'ai eu le même problème ici avec Docker, j'ai essayé toutes les étapes et je n'ai pas bien fonctionné, j'ai toujours des erreurs de paramètres régionaux, alors j'ai décidé d'utiliser BABEL et tout a bien fonctionné. 

1
Carlos

À mon avis, le moyen le plus simple de configurer les paramètres régionaux en python {, 3} est:

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

Ensuite, les éléments sensibles aux paramètres régionaux fonctionnent, si vous êtes sur une distribution Linux décente, et devraient également fonctionner sur les distributions binaires des autres systèmes d’exploitation (ou c’est un bogue à mon humble avis).

>>> import datetime as dt
>>> print(dt.date.today().strftime("%A %d. %B %Y"))
Sonntag 11. Dezember 2016
1
user3780002

Placez-le dans la Dockerfile au-dessus de la ENV.

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

ENV LANG en_US.UTF-8
1
seenu s

En essayant d'obtenir python à cracher des noms dans des paramètres régionaux spécifiques } _ j'ai atterri ici avec le même problème.

En cherchant la réponse, les choses ont un peu mystique, je trouve.

J'ai trouvé ce code python.

import locale
print locale.getdefaultlocale()
>> ('en_DK', 'UTF-8')

Et en effet, locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8') fonctionne

En utilisant les astuces ici, j'ai testé davantage pour voir ce qui est disponible en utilisant du code python

import locale
loc_list = [(a,b) for a,b in locale.locale_alias.items() ]
loc_size = len(loc_list)
print loc_size,'entries'

for loc in loc_list:
    try:
        locale.setlocale(locale.LC_TIME, loc[1])
        print 'SUCCES set {:12} ({})'.format(loc[1],loc[0])
    except:
        pass

qui donne

858 entries
SUCCES set en_US.UTF-8  (univ)
SUCCES set C            (c.ascii)
SUCCES set C            (c.en)
SUCCES set C            (posix-utf2)
SUCCES set C            (c)
SUCCES set C            (c_c)
SUCCES set C            (c_c.c)
SUCCES set en_IE.UTF-8  (en_ie.utf8@euro)
SUCCES set en_US.UTF-8  (universal.utf8@ucs4)
SUCCES set C            (posix)
SUCCES set C            (english_united-states.437)
SUCCES set en_US.UTF-8  (universal)

Dont seulement ci-dessus fonctionne! Mais le en_DK.UTF-8 ne figure pas dans cette liste, bien que cela fonctionne!?!? Quoi ?? Et la liste de paramètres régionaux générés par Python contient beaucoup de combinaisons de da et DK, que je recherche, mais là encore pas de UTF-8 pour da/DK ...

Je suis sur une distribution Linux Point (basée sur Debian), et ici locale dit entre autres LC_TIME="en_DK.UTF-8", qui, je le sais, fonctionne, mais pas les paramètres régionaux dont j'ai besoin.

locale -a dit

C
C.UTF-8
en_DK.utf8
en_US.utf8
POSIX

Donc, absolument besoin de installer d'autres paramètres régionaux , ce que j'ai fait en éditant /etc/locale.gen, retirez le commentaire de la ligne da_DK.UTF-8 UTF-8 et exécutez la commande locale-gen

Maintenant, locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8') fonctionne aussi et je peux obtenir mes noms de jour et de mois localisés.

Ma conclusion:

Python: locale.locale_alias n'est pas du tout utile pour trouver des locales disponibles !!!

Linux: Il est assez facile d’obtenir la liste des paramètres régionaux et d’installer de nouveaux paramètres régionaux. Beaucoup d'aide disponible.

Windows: J'ai enquêté un peu, mais rien de concluant. Il y a bien des messages qui mènent à des réponses, mais je n'ai pas ressenti l'envie de le poursuivre.

0
DonPedro

Ouvrez juste le fichier .bashrc et ajoutez ceci

exportation LC_ALL = C

puis tapez source .bashrc dans le terminal.

0
Saroj Rai

Cette erreur peut se produire si vous venez d'ajouter un nouvel environnement local. Vous devez redémarrer le shell interactif python (quit() et python) pour y accéder.

0
Drunken Master

si je comprends bien, la principale source d'erreur ici est la syntaxe exacte du nom de locale. Surtout que cela semble différer entre les distributions . J'ai vu mentionné ici dans différentes réponses/commentaires:

de_DE.utf8
de_DE.UTF-8

Bien que ce soit évidemment le même pour un être humain, il n'en va pas de même pour votre algorithme déterministe standard.

Donc, vous ferez probablement quelque chose dans le sens de:

DESIRED_LOCALE=de
DESIRED_LOCALE_COUNTRY=DE
DESIRED_CODEPAGE_RE=\.[Uu][Tt][Ff].?8
if [ $(locale -a | grep -cE "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}") -eq 1 ]
then
    export LC_ALL=$(locale -a | grep -m1 -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")
    export LANG=$LC_ALL
else
    echo "Not exactly one desired locale definition found: $(locale -a | grep -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")" >&2
fi
0
Torge Husfeldt