Який правильний спосіб встановити локаль Python у Windows?


80

Я намагаюся відсортувати список рядків у відповідності з мовою. Я використовував бібліотеку Babel для інших завдань, пов'язаних з i18n, але вона не підтримує сортування. localeМодуль Python надає strcollфункцію, але вимагає, щоб локаль процесу була встановлена ​​на ту, з якою я хочу працювати. Якийсь біль, але я можу з цим жити.

Проблема в тому, що я не можу фактично встановити локаль. У документації до localeмодуля подано такий приклад:

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

Коли я запускаю це, я отримую таке:

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

Що я роблю не так?

Відповіді:


109

Здається, ви використовуєте Windows. Рядки мови там різні. Подивіться більш точно на документ:

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

У Windows, я думаю, це було б приблизно так:

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

MSDN має перелік мовних рядків та рядків країн / регіонів


5
FWIW, у мене була проблема під Ubuntu 13.04, Linux 3.8.0-19з python 2.7.4при спробі встановити локаль fr_FR. Встановлення його fr_FR.UTF-8для мене спрацювало.
Zoneur,

Для Python 3.6.3 у Conda 4.4.11, Windows 7, мовні рядки здаються такими ж, як інші ОС.
srodriguex

2
Цей список є більш вичерпним: msdn.microsoft.com/en-us/library/cc233982.aspx
Крістіан

2
Зв’язані документи здаються занадто недавніми для WServer2018R2, якими я повинен був користуватися 'eng_usa'( 'en_US'не працював)
Boop

17

Це єдиний правильний спосіб його використання, надаючи приклад для німецької мови:

import locale

locale.setlocale(category=locale.LC_ALL,
                 locale="German"  # Note: do not use "de_DE" as it doesn't work)

1
Це єдина відповідь, яка насправді відповідає на питання.
ImportanceOfBeingErnest

це мені допомогло, але мені довелося змінити Germanна Portuguese_Brazil.1252. Чи знаєте ви документацію з переліком цих значень?
Генріке Брісола,

15

Ви не повинні передавати явну локаль setlocale, це неправильно. Нехай це дізнається з навколишнього середовища. Ви повинні передати йому порожній рядок

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

10
Я не згадував про це у питанні, оскільки це не було безпосередньо пов’язано, але код, який я писав тоді, був розроблений для використання на веб-сервері. Іншими словами, локаль може змінюватися з кожним запитом, і це не обов'язково завжди збігається з мовою середовища.
DNS

2
DNS: Чи читали ви документи для мови? Це означає, що може бути небезпечно називати setlocale "багато", і це не є безпечним для потоку. Тож можливо щось інше, ніж setlocale - це рішення. Gettext може завантажувати різні каталоги і переключатися під час виконання; але я не знаю, для чого ви використовуєте локаль.
u0b34a0f6ae

Якщо ваш користувач не знаходиться на вашій локальній машині
Габріель

8

Ubuntu

У Ubuntu у вас може виникнути ця проблема, оскільки у вас не встановлено локальну систему в системі.

З оболонки спробуйте:

$> locale -a

і перевірте, чи знайдете ви локаль, яка вас цікавить. В іншому випадку вам доведеться її встановити:

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

де XXX - це ваша мова (у моєму випадку "xxx = it", італійська мова) Потім запустіть dpkg-reconfigure:

$> sudo dpkg-reconfigure locales

Після цього спробуйте ще раз у своїй оболонці python:

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

(це для італійської мови, що було те, що мені потрібно)


13
Це питання конкретно задає питання про Windows
Крістоф

7

Я знаю, що це запитували роки тому, але я подумав спробувати додати те, що з’ясував, використовуючи Python 3.6 у Windows:

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

Я спробував деякі, і це також, здається, є способом з’ясувати, що доступно в Windows.

Корисно знати: Це з якихось причин не сумісне з strptime () у поточній стабільній версії Python

А потім ви просто встановлюєте локаль:

locale.setlocale(locale.LC_ALL, any_item_of_the_printed_strings)


4

З locale.setlocale docs:

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

Під Linux (особливо Ubuntu) ви можете або використовувати

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

або

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

Ви отримаєте таку ж помилку, якщо локаль не встановлений у системі. Отже, переконайтеся, що у вашій системі встановлено локаль :

$ locale -a # to list the currently installed locales
$ (sudo) locale-gen de_DE.UTF-8 # to install new locale
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.