Jaki jest prawidłowy sposób ustawienia języka Python w systemie Windows?

80

Próbuję posortować listę ciągów w sposób uwzględniający ustawienia regionalne. Użyłem biblioteki Babel do innych zadań związanych z i18n, ale nie obsługuje ona sortowania. localeModuł Pythona zapewnia strcollfunkcję, ale wymaga ustawienia ustawień regionalnych procesu na to, z którym chcę pracować. Trochę bólu, ale mogę z tym żyć.

Problem polega na tym, że nie mogę ustawić ustawień regionalnych. Dokumentacji dla localemodułu daje ten przykład:

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

Kiedy to uruchamiam, otrzymuję to:

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

Co ja robię źle?

DNS
źródło

Odpowiedzi:

109

Wygląda na to, że używasz systemu Windows. Łańcuchy ustawień regionalnych są tam inne. Przyjrzyj się dokładniej dokumentowi:

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

W systemie Windows myślę, że byłoby to coś takiego:

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

MSDN zawiera listę ciągów językowych i ciągów krajów / regionów

Schnouki
źródło
5
FWIW, miałem problem pod Ubuntu 13.04, Linux 3.8.0-19z pythonem 2.7.4podczas próby ustawienia ustawień regionalnych na fr_FR. Ustawienie to fr_FR.UTF-8zadziałało dla mnie.
Zoneur,
W przypadku Pythona 3.6.3 w Conda 4.4.11, Windows 7, łańcuchy ustawień regionalnych wydają się być takie same, jak w innych systemach operacyjnych.
srodriguex
2
Ta lista jest bardziej wyczerpująca: msdn.microsoft.com/en-us/library/cc233982.aspx
Cristian Ciupitu
2
Połączone dokumenty wydają się być zbyt nowe dla WServer2018R2, które musiałem użyć 'eng_usa'( 'en_US'nie działały)
Boop
17

Jest to jedyny poprawny sposób korzystania z niego, podając przykład dla niemieckiej lokalizacji:

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)
Boštjan Mejak
źródło
1
To jedyna odpowiedź, która faktycznie odpowiada na to pytanie.
ImportanceOfBeingErnest
to pomogło mi, ale musiałem zmienić Germansię Portuguese_Brazil.1252. Czy znasz dokumentację zawierającą te wartości?
Henrique Brisola
15

Nie powinieneś przekazywać jawnego locale do setlocale, to jest złe. Niech dowie się z otoczenia. Musisz przekazać mu pusty ciąg

import locale
locale.setlocale(locale.LC_ALL, '')
u0b34a0f6ae
źródło
10
Nie wspomniałem o tym w pytaniu, ponieważ nie było to bezpośrednio powiązane, ale kod, który wtedy pisałem, był przeznaczony do użytku na serwerze sieciowym. Innymi słowy, ustawienia narodowe mogą się zmieniać z każdym żądaniem i niekoniecznie zawsze są takie same jak ustawienia regionalne środowiska.
DNS
2
DNS: czy przeczytałeś dokumentację dotyczącą języka? Oznacza to, że wywołanie setlocale „dużo” może być niebezpieczne i nie jest bezpieczne dla wątków. Może więc rozwiązaniem jest coś innego niż setlocale. Gettext może na przykład ładować różne katalogi i przełączać się w czasie wykonywania; ale nie wiem, do czego używasz ustawień regionalnych.
u0b34a0f6ae
Chyba że twojego użytkownika nie ma na twoim lokalnym komputerze
Gabriel
8

Ubuntu

W systemie Ubuntu możesz mieć ten problem, ponieważ nie masz tego lokalnego zainstalowanego w systemie.

Z powłoki spróbuj:

$> locale -a

i sprawdź, czy znalazłeś interesującą Cię lokalizację. W przeciwnym razie musisz ją zainstalować:

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

gdzie XXX to Twój język (w moim przypadku „xxx = it”, język włoski) Następnie uruchom dpkg-reconfigure:

$> sudo dpkg-reconfigure locales

Następnie spróbuj ponownie w powłoce Pythona:

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

(to jest dla włoskiego regionu, czego potrzebowałem)

linello
źródło
13
To pytanie dotyczy konkretnie systemu Windows
Christoph
7

Wiem, że zadawano to wiele lat temu, ale pomyślałem, że spróbuję dodać to, czego się dowiedziałem, używając Pythona 3.6 w systemie Windows:

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

Wypróbowałem kilka i to również wydaje się być sposobem na sprawdzenie, co jest dostępne w systemie Windows.

Warto wiedzieć: z jakiegoś powodu nie jest to zgodne ze strptime () w obecnej stabilnej wersji Pythona

Następnie po prostu ustawiasz lokalizację:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)

TheGeekGuy
źródło
4

Z dokumentów 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.
    """"

W Linuksie (zwłaszcza Ubuntu) możesz użyć

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

lub

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

Otrzymasz ten sam błąd, jeśli lokalizacja nie jest zainstalowana w systemie. Więc upewnij się, że masz zainstalowane ustawienia regionalne :

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
Aleksandra Stefanowa
źródło