Как правильно установить языковой стандарт 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с питоном 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
Christoph

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:

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.