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
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.
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
où 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
Selon ce lien , il est résolu en entrant cette commande:
exportation LC_ALL = C
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')
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.
Si vous êtes sur une Debian (ou une fourche Debian), vous pouvez ajouter des locales à l'aide de:
dpkg-reconfigure locales
Sur Arch Linux, j'ai pu résoudre ce problème en exécutant Sudo locale-gen
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
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 =
/etc/locale-gen
. Ne commentez pas les ancienslocale-gen
pour générer les locales récemment ajoutéesSi 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é.
À 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
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
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.
Ouvrez juste le fichier .bashrc et ajoutez ceci
exportation LC_ALL = C
puis tapez source .bashrc dans le terminal.
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.
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