Błąd ustawień regionalnych Python: nieobsługiwane ustawienie regionalne

317

Dlaczego pojawia się następujący błąd podczas wykonywania tego w Pythonie:

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

Działa to również z innymi lokalizacjami, takimi jak fr lub nl. Używam Ubuntu 11.04.

Aktualizacja: Wykonanie następujących czynności nic nie dało:

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
toom
źródło
8
Czy masz na de_DEliście locale -a? Jeśli nie, musisz go zainstalować .
Bakuriu
1
Powiązane: skrypt bash do zainstalowania wszystkich lokalizacji na Ubuntu.
rkrzr
12
locale.setlocale(locale.LC_ALL, 'de_DE')jest źle. Trzeba locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma,
2
Czasami można odkryć dostępne kodowanie języka / kraju chcesz za pomocą wbudowanego w aliasów: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Odpowiedzi:

647

Uruchom następujące polecenia

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

Rozwiąże to.

Pamiętaj, aby dopasować .UTF-8część do faktycznej składni znalezionej w danych wyjściowych locale -anp. W .utf8niektórych systemach.

Muhammad Hassan
źródło
8
Nie musiałem używać polecenia dpkg. W końcu, jeśli problem występuje lokalnie, prawdziwym rozwiązaniem byłoby dodanie dwóch pierwszych poleceń do aplikacji startowych.
RolandiXor
2
To mi nie zadziałało. export LC_ALL="en_US.UTF-8"nie powiodło się Z tym, -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) co działało, robiąc to:export LC_ALL=C
Jonathan
204

Zgodnie z tym linkiem rozwiązano go, wprowadzając następujące polecenie:

eksport LC_ALL = C

Fatemeh Abdollahei
źródło
4
Co to znaczy? - ok, ustawia zmienne środowiskowe LC_ALLna wartość 'C'- ale dlaczego miałoby to działać?
Martin Thoma,
Wyszukuję i próbuję to za każdym razem, gdy zmieniam komputer, i działa to za każdym razem, gdy inne metody tego nie robią.
MinKi Jo
197

Prawdopodobnie nie masz de_DEdostępnych ustawień regionalnych.

Za pomocą polecenia możesz wyświetlić listę dostępnych ustawień regionalnych locale -a. Na przykład na moim komputerze:

$ 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

Pamiętaj, że jeśli chcesz ustawić ustawienia regionalne it_IT, musisz także określić .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'

Aby zainstalować nowe ustawienia regionalne, użyj:

sudo apt-get install language-pack-id

gdzie idjest kod języka (wzięty stąd )

Po zainstalowaniu ustawień regionalnych postępuj zgodnie z zaleceniami Juliena Palarda i ponownie skonfiguruj ustawienia regionalne za pomocą:

sudo dpkg-reconfigure locales
Bakuriu
źródło
To nie działało w moim kontenerze dokującym Debiana. Ale to zadziałało. stackoverflow.com/questions/28405902/…
Chris
45

Jedna z powyższych odpowiedzi stanowi rozwiązanie:

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

Problem z powyższym rozwiązaniem polega na tym, że należy to zrobić na powłoce Linux-a. Jeśli jednak udostępniasz kod do pracy na komputerze klienckim, jest to złe podejście. Próbowałem również wykonać powyższe polecenia za pomocą os.system (), ale nadal nie działa.

Rozwiązaniem, które działało dla mnie jest

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')
Ayush Vatsyayan
źródło
32

Trwałym rozwiązaniem byłoby uzupełnienie brakujących wartości w danych wyjściowych pokazanych poleceniem: locale

Dane wyjściowe localeto:

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

Aby uzupełnić brakujące wartości, edytuj ~ / .bashrc:

 $ vim ~/.bashrc

Dodaj następujące wiersze po powyższym poleceniu (załóżmy, że chcesz, aby en_US.UTF-8 był twoim językiem):

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

Jeśli ten plik jest tylko do odczytu, będziesz musiał wykonać kroki wymienione przez The GeekyBoy . Odpowiedź udzielona przez dr Beco w Superuser zawiera szczegółowe informacje dotyczące zapisywania plików tylko do odczytu.

Po zapisaniu pliku wykonaj:

$ source ~/.bashrc

Teraz już nie będziesz mieć do czynienia z tym samym problemem.

lorenzofeliz
źródło
15

Jeśli korzystasz z Debiana (lub rozwidlenia Debiana), możesz dodać ustawienia narodowe, używając:

dpkg-reconfigure locales
Julien Palard
źródło
Czy dpkg-reconfigure localeswyświetla Ci się lokalne menu wyboru, takie jak to: vpser.net/uploads/2013/01/dpkg-reconfigure-locales-1.jpg ?
Julien Palard
Nie. Właśnie otrzymałem wyniki, które opublikowałem w aktualizacji mojego pytania.
toom
6

W Arch Linux mogłem to naprawić, uruchamiając sudo locale-gen

Keith Smiley
źródło
4

Dla przypomnienia, miałem ten sam problem, ale żadne z rozwiązań nie zadziałało. Zaktualizowałem komputer i przeprowadziłem migrację komputera. Miałem mieszany lokalny angielski i hiszpański:

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

Ale w mojej nowej instalacji Debiana właśnie wybrałem język angielski jako lokalizację. To, co w końcu zadziałało, polegało na ponownej konfiguracji pakietu locales, aby dodać i wygenerować również hiszpański.

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8
kikeenrique
źródło
4

Po prostu otwórz plik .bashrc i dodaj go

eksport LC_ALL = C

a następnie wpisz source .bashrc w terminalu.

Saroj Rai
źródło
4

Twój błąd wyraźnie mówi, że próbujesz użyć ustawień regionalnych czegoś tam nie było.

>>> 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 581, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

locale.Error: nieobsługiwane ustawienie regionalne

Aby sprawdzić dostępne ustawienia, użyj locale -a

deb@deb-Latitude-E7470:/ambot$ 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
POSIX

więc możesz użyć jednego z nich,

>>> locale.setlocale(locale.LC_ALL, 'en_AG.utf8')
'en_AG.utf8'
>>> 

dla de_DE

Ten plik można dostosować ręcznie lub zaktualizować za pomocą narzędzia update-locale.

update-locale LANG=de_DE.UTF-8
Mohideen bin Mohammed
źródło
2
  • uruchom to polecenie, localeaby uzyskać informacje o używanych ustawieniach regionalnych. Jak na przykład:

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 =

  • wyszukaj listę ustawionych lokalizacji w pierwszym kroku /etc/locale-genpliku. Odkomentowanie używanych
  • uruchom, locale-genaby wygenerować nowo dodane ustawienia narodowe
andy
źródło
2

Moim zdaniem najłatwiejszym sposobem ustawienia lokalnych ustawień regionalnych w python {, 3} jest:

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

Następnie rzeczy zorientowane na ustawienia regionalne po prostu działają, jeśli masz przyzwoitą dystrybucję linuksową i powinny działać również na dystrybucjach binarnych innych systemów operacyjnych (lub to jest błąd IMHO).

>>> import datetime as dt
>>> print(dt.date.today().strftime("%A %d. %B %Y"))
Sonntag 11. Dezember 2016
użytkownik3780002
źródło
2

Umieść go Dockerfilepowyżej 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
Seenu S.
źródło
Dzięki, wypróbowałem inne rozwiązania (ustawienia regionalne dpkg-rekonfiguruj, locale-gen) i nic więcej nie działało w moim kontenerze debian: 9. Czy to naprawdę / standardowy sposób tworzenia ustawień regionalnych en_US.UTF-8?
jamshid
Tak, myślę, że to standardowa metoda ustawień regionalnych en_US.UTF-8. Po uruchomieniu localew terminalu dostajesz `LANG = en_US.UTF-8 i inne ustawienia regionalne? stackoverflow.com/questions/36394101/…
Seenu S
1

Ten błąd może wystąpić, jeśli właśnie dodałeś nowe ustawienia regionalne. Musisz ponownie uruchomić interaktywną powłokę Pythona ( quit() i python), aby uzyskać do niej dostęp.

imrek
źródło
1

Gdybym był tobą, użyłbym BABEL: http://babel.pocoo.org/en/latest/index.html

Mam ten sam problem przy użyciu Dockera, próbowałem każdego kroku i nie działałem dobrze, zawsze pojawiał się błąd lokalizacji, więc zdecydowałem się użyć BABEL i wszystko działało dobrze.

Carlos
źródło
0

Próbując zmusić Pythona do wyplucia nazw w określonych lokalizacjach , wylądowałem tutaj z tym samym problemem.

Szukając odpowiedzi, sprawy stały się trochę mistyczne.

Znalazłem ten kod python.

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

I rzeczywiście locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8') działa

Korzystając ze wskazówek, przetestowałem dalej, aby zobaczyć, co jest dostępne przy użyciu kodu 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

co daje

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)

Z których tylko powyższe działa! Aleen_DK.UTF-8 nie ma go na tej liście, chociaż działa!?!? Co?? A lista ustawień narodowych wygenerowana w Pythonie zawiera wiele kombinacji da i DK, których szukam, ale znowu nie ma UTF-8 dla da / DK ...

Jestem na dystrybucji Linuksa Point (opartej na Debianie), a tutaj localemówi między innymi LC_TIME="en_DK.UTF-8", że wiem, że działa, ale nie w lokalizacji, której potrzebuję.

locale -a mówi

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

Więc zdecydowanie muszę zainstalować inne ustawienia regionalne , co zrobiłem przez edycję /etc/locale.gen, odkomentowanie potrzebnej linii da_DK.UTF-8 UTF-8i uruchomienie polecenialocale-gen

Teraz locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8') też działa i mogę uzyskać moje zlokalizowane nazwy dni i miesięcy.

Moja konkluzja:

Python: locale.locale_alias wcale nie jest pomocny w wyszukiwaniu dostępnych ustawień regionalnych !!!

Linux: bardzo łatwo jest uzyskać listę ustawień regionalnych i zainstalować nowe ustawienia regionalne. Dostępna jest duża pomoc.

Windows: Trochę badałem, ale nic rozstrzygającego. Są jednak posty prowadzące do odpowiedzi, ale nie odczuwałem potrzeby, by je realizować.

DonPedro
źródło
0

jeśli dobrze rozumiem, głównym źródłem błędu jest dokładna składnia nazwy ustawienia narodowego. Zwłaszcza, że ​​wydaje się różnić między dystrybucjami. Wspomniałem tutaj w różnych odpowiedziach / komentarzach:

de_DE.utf8
de_DE.UTF-8

Chociaż jest to oczywiście to samo dla człowieka, to samo nie dotyczy standardowego algorytmu deterministycznego.

Prawdopodobnie zrobisz coś w stylu:

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
Torge Husfeldt
źródło
0

python szuka .UFT-8, ale prawdopodobnie masz .utf8 spróbuj zainstalować pakiety .UFT-8 z sudo dpkg-rekonfiguruj ustawienia regionalne

Peter Frumau
źródło
-2

najpierw upewnij się, że masz zainstalowany pakiet językowy, wykonując:

sudo apt-get install language-pack-en-base


sudo dpkg-reconfigure locales
Yaron Soffer
źródło
angielski pakiet językowy jest instalowany domyślnie - ponadto odpowiedź jest już tutaj podana, a tej brakuje sformatowania.
Skandix