locale.md
1> **Источник:** https://python-all.ru/3.15/library/locale.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `locale` – Службы интернационализации89**Исходный код:** [Lib/locale.py](https://python-all.ru/src/3.15/Lib/locale.py)1011---1213Модуль `locale` предоставляет доступ к базе данных локалей POSIX и её функциональности. Механизм локалей POSIX позволяет разработчикам решать задачи, связанные с культурными особенностями приложения, не требуя от них знания всех тонкостей каждой страны, где выполняется программа.1415Модуль `locale` реализован поверх модуля `_locale`, который, в свою очередь, использует реализацию локали ANSI C, если она доступна.1617Модуль `locale` определяет следующее исключение и функции:1819#### `exception locale.Error`2021Исключение возникает, когда локаль, переданная в [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale), не распознана.2223#### `locale.setlocale(category, locale=None)`2425Если *locale* задан и не равен `None`, функция `setlocale()` изменяет настройки локали для категории *category*. Доступные категории перечислены ниже в описании данных. *locale* может быть строкой [string](https://python-all.ru/3.15/library/locale.html#locale-name) или парой – кодом языка и кодировкой. Пустая строка задает пользовательские настройки по умолчанию. Если изменение локали не удалось, вызывается исключение [`Error`](https://python-all.ru/3.15/library/locale.html#locale.Error). В случае успеха возвращается новая настройка локали.2627Если *locale* – это пара, она преобразуется в имя локали с помощью механизма псевдонимов локалей. Код языка имеет тот же формат, что и [имя локали](https://python-all.ru/3.15/library/locale.html#locale-name), но без кодировки. Код языка и кодировка могут быть `None`.2829Если *locale* опущен или равен `None`, возвращается текущая настройка для категории *category*.3031Пример:3233```python34>>> import locale35>>> loc = locale.setlocale(locale.LC_ALL) # получить текущую локаль36# use German locale; name and availability varies with platform37>>> locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')38>>> locale.strcoll('f\xe4n', 'foo') # сравнить строку, содержащую умлаут39>>> locale.setlocale(locale.LC_ALL, '') # использовать предпочтительную локаль пользователя40>>> locale.setlocale(locale.LC_ALL, 'C') # использовать локаль по умолчанию (C)41>>> locale.setlocale(locale.LC_ALL, loc) # восстановить сохранённую локаль42```4344`setlocale()` не является потокобезопасным на большинстве систем. Приложения обычно начинаются с вызова:4546```python47import locale48locale.setlocale(locale.LC_ALL, '')49```5051Это устанавливает локаль для всех категорий в пользовательскую настройку по умолчанию (обычно заданную в переменной окружения `LANG`). Если впоследствии локаль не изменять, использование многопоточности не должно вызывать проблем.5253Изменено в версии 3.15: Поддержка кодов языка с `@`-модификаторами.5455#### `locale.localeconv()`5657Возвращает словарь с данными о локальных соглашениях. Ключами этого словаря являются следующие строки:5859| Категория | Клавиша | Значение |60| --- | --- | --- |61| [`LC_NUMERIC`](https://python-all.ru/3.15/library/locale.html#locale.LC_NUMERIC) | `'decimal_point'` | Символ десятичной точки. |62| | `'grouping'` | Последовательность чисел, указывающая, в каких относительных позициях ожидается `'thousands_sep'`. Если последовательность завершается значением [`CHAR_MAX`](https://python-all.ru/3.15/library/locale.html#locale.CHAR_MAX), дальнейшая группировка не выполняется. Если последовательность завершается значением `0`, размер последней группы используется повторно. |63| | `'thousands_sep'` | Символ, используемый между группами. |64| [`LC_MONETARY`](https://python-all.ru/3.15/library/locale.html#locale.LC_MONETARY) | `'int_curr_symbol'` | Международный символ валюты. |65| | `'currency_symbol'` | Локальный символ валюты. |66| | `'p_cs_precedes/n_cs_precedes'` | Предшествует ли символ валюты значению (для положительных и отрицательных значений соответственно). |67| | `'p_sep_by_space/n_sep_by_space'` | Отделяется ли символ валюты от значения пробелом (для положительных и отрицательных значений соответственно). |68| | `'mon_decimal_point'` | Десятичная точка, используемая для денежных значений. |69| | `'frac_digits'` | Количество дробных цифр, используемых в локальном форматировании денежных значений. |70| | `'int_frac_digits'` | Количество дробных цифр, используемых в международном форматировании денежных значений. |71| | `'mon_thousands_sep'` | Разделитель групп, используемый для денежных значений. |72| | `'mon_grouping'` | Эквивалентно `'grouping'`, используется для денежных значений. |73| | `'positive_sign'` | Символ, используемый для обозначения положительного денежного значения. |74| | `'negative_sign'` | Символ, используемый для обозначения отрицательного денежного значения. |75| | `'p_sign_posn/n_sign_posn'` | Положение знака (для положительных и отрицательных значений соответственно), см. ниже. |7677Все числовые значения можно задать как [`CHAR_MAX`](https://python-all.ru/3.15/library/locale.html#locale.CHAR_MAX), чтобы указать, что в данной локали значение не задано.7879Возможные значения для `'p_sign_posn'` и `'n_sign_posn'` приведены ниже.8081| Значение | Пояснение |82| --- | --- |83| `0` | Валюта и значение заключаются в скобки. |84| `1` | Знак должен стоять перед значением и символом валюты. |85| `2` | Знак должен следовать после значения и символа валюты. |86| `3` | Знак должен стоять непосредственно перед значением. |87| `4` | Знак должен стоять непосредственно после значения. |88| `CHAR_MAX` | В этой локали ничего не указано. |8990Функция временно устанавливает локали `LC_CTYPE`, `LC_NUMERIC` или `LC_MONETARY`, если локали различаются, а числовые или денежные строки содержат не-ASCII символы. Это временное изменение влияет на другие потоки.9192Изменено в версии 3.7: Теперь функция в некоторых случаях временно устанавливает локаль `LC_CTYPE` в локаль `LC_NUMERIC`.9394#### `locale.nl_langinfo(option)`9596Возвращает строку с информацией, зависящей от локали. Эта функция доступна не на всех системах, и набор возможных опций может различаться на разных платформах. Аргументы – числа, для которых в модуле locale определены символьные константы.9798Функция `nl_langinfo()` принимает один из следующих ключей. Большинство описаний взяты из соответствующих описаний в библиотеке GNU C.99100#### `locale.CODESET`101102Возвращает строку с именем кодировки символов, используемой в выбранной локали.103104#### `locale.D_T_FMT`105106Возвращает строку, которую можно использовать как строку форматирования для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления даты и времени с учётом локали.107108#### `locale.D_FMT`109110Возвращает строку, которую можно использовать как строку форматирования для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления даты с учётом локали.111112#### `locale.T_FMT`113114Возвращает строку, которую можно использовать как строку форматирования для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления времени с учётом локали.115116#### `locale.T_FMT_AMPM`117118Возвращает строку форматирования для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления времени в формате AM/PM.119120#### `locale.DAY_1`121122#### `locale.DAY_2`123124#### `locale.DAY_3`125126#### `locale.DAY_4`127128#### `locale.DAY_5`129130#### `locale.DAY_6`131132#### `locale.DAY_7`133134Возвращает название n-го дня недели.135136> **Примечание**137>138> В соответствии с американским соглашением [`DAY_1`](https://python-all.ru/3.15/library/locale.html#locale.DAY_1) – воскресенье, а не международным (ISO 8601), где первый день недели – понедельник.139140#### `locale.ABDAY_1`141142#### `locale.ABDAY_2`143144#### `locale.ABDAY_3`145146#### `locale.ABDAY_4`147148#### `locale.ABDAY_5`149150#### `locale.ABDAY_6`151152#### `locale.ABDAY_7`153154Возвращает сокращённое название n-го дня недели.155156#### `locale.MON_1`157158#### `locale.MON_2`159160#### `locale.MON_3`161162#### `locale.MON_4`163164#### `locale.MON_5`165166#### `locale.MON_6`167168#### `locale.MON_7`169170#### `locale.MON_8`171172#### `locale.MON_9`173174#### `locale.MON_10`175176#### `locale.MON_11`177178#### `locale.MON_12`179180Возвращает название n-го месяца.181182#### `locale.ABMON_1`183184#### `locale.ABMON_2`185186#### `locale.ABMON_3`187188#### `locale.ABMON_4`189190#### `locale.ABMON_5`191192#### `locale.ABMON_6`193194#### `locale.ABMON_7`195196#### `locale.ABMON_8`197198#### `locale.ABMON_9`199200#### `locale.ABMON_10`201202#### `locale.ABMON_11`203204#### `locale.ABMON_12`205206Получить сокращённое название n-го месяца.207208#### `locale.RADIXCHAR`209210Получить символ десятичного разделителя (десятичная точка, десятичная запятая и т.д.).211212#### `locale.THOUSEP`213214Получить символ разделителя тысяч (групп по три цифры).215216#### `locale.YESEXPR`217218Получить регулярное выражение, которое можно использовать с функцией regex для распознавания положительного ответа на вопрос «да/нет».219220#### `locale.NOEXPR`221222Получить регулярное выражение, которое можно использовать с функцией `regex(3)` для распознавания отрицательного ответа на вопрос «да/нет».223224> **Примечание**225>226> Регулярные выражения для [`YESEXPR`](https://python-all.ru/3.15/library/locale.html#locale.YESEXPR) и [`NOEXPR`](https://python-all.ru/3.15/library/locale.html#locale.NOEXPR) используют синтаксис, подходящий для функции `regex` из библиотеки C, который может отличаться от синтаксиса, используемого в [`re`](https://python-all.ru/3.15/library/re.html#module-re).227228#### `locale.CRNCYSTR`229230Получить символ валюты, перед которым стоит «-», если символ должен отображаться перед значением, «+», если символ должен отображаться после значения, или «.», если символ должен заменить десятичный разделитель.231232#### `locale.ERA`233234Получить строку, описывающую, как подсчитываются и отображаются годы для каждой эры в локали.235236Большинство локалей не определяют это значение. Примером локали, которая определяет это значение, является японская. В Японии традиционное представление дат включает название эры, соответствующей правлению действующего императора.237238Обычно нет необходимости использовать это значение напрямую. Указание модификатора `E` в строках формата заставляет функцию [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) использовать эту информацию. Формат возвращаемой строки описан в *The Open Group Base Specifications Issue 8*, параграф [7.3.5.2 LC\_TIME C-Language Access](https://python-all.ru/3.15/library/locale.html).239240#### `locale.ERA_D_T_FMT`241242Получить строку формата для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления даты и времени в локализованном формате, основанном на эре.243244#### `locale.ERA_D_FMT`245246Получить строку формата для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления даты в локализованном формате, основанном на эре.247248#### `locale.ERA_T_FMT`249250Получить строку формата для [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) для представления времени в локализованном формате, основанном на эре.251252#### `locale.ALT_DIGITS`253254Получить строку, состоящую из не более чем 100 символов, разделённых точкой с запятой, используемых для представления значений от 0 до 99 в локализованном виде. В большинстве локалей это пустая строка.255256Функция временно устанавливает локаль `LC_CTYPE` на локаль категории, определяющей запрашиваемое значение (`LC_TIME`, `LC_NUMERIC`, `LC_MONETARY` или `LC_MESSAGES`), если локали различаются и результирующая строка не является ASCII. Это временное изменение влияет на другие потоки.257258Изменено в версии 3.14: Теперь функция временно устанавливает локаль `LC_CTYPE` в некоторых случаях.259260#### `locale.getdefaultlocale([envvars])`261262Пытается определить настройки локали по умолчанию и возвращает их в виде кортежа вида `(language code, encoding)`.263264Согласно POSIX, программа, которая не вызывала `setlocale(LC_ALL, '')`, работает с переносимой локалью `'C'`. Вызов `setlocale(LC_ALL, '')` позволяет ей использовать локаль по умолчанию, определённую переменной `LANG`. Поскольку мы не хотим вмешиваться в текущую настройку локали, мы имитируем описанное выше поведение.265266Для поддержания совместимости с другими платформами тестируется не только переменная `LANG`, но и список переменных, задаваемый параметром envvars. Первая обнаруженная определённая переменная будет использована. *envvars* по умолчанию равен пути поиска, используемому в GNU gettext; он всегда должен содержать имя переменной `'LANG'`. Путь поиска GNU gettext содержит `'LC_ALL'`, `'LC_CTYPE'`, `'LANG'` и `'LANGUAGE'` в указанном порядке.267268Код языка имеет тот же формат, что и [имя локали](https://python-all.ru/3.15/library/locale.html#locale-name), но без кодировки и модификатора `@`. Код языка и кодировка могут быть равны `None`, если их значения не удаётся определить. Локаль «C» представляется как `(None, None)`.269270#### `locale.getlocale(category=LC_CTYPE)`271272Возвращает текущую настройку для указанной категории локали в виде кортежа, содержащего код языка и кодировку. *category* может быть одним из значений `LC_*`, кроме [`LC_ALL`](https://python-all.ru/3.15/library/locale.html#locale.LC_ALL). По умолчанию используется [`LC_CTYPE`](https://python-all.ru/3.15/library/locale.html#locale.LC_CTYPE).273274Код языка имеет тот же формат, что и [имя локали](https://python-all.ru/3.15/library/locale.html#locale-name), но без кодировки. Код языка и кодировка могут быть `None`, если их значения не удаётся определить. Локаль «C» представлена как `(None, None)`.275276Изменено в версии 3.15: `@`-модификаторы больше не удаляются молча, а включаются в код языка.277278#### `locale.getpreferredencoding(do_setlocale=True)`279280Возвращает [кодировку локали](https://python-all.ru/3.15/glossary.html#term-locale-encoding), используемую для текстовых данных, в соответствии с пользовательскими предпочтениями. В разных системах пользовательские предпочтения выражаются по-разному, и на некоторых системах их может быть невозможно получить программно, поэтому эта функция возвращает только предположительное значение.281282На некоторых системах для получения пользовательских предпочтений необходимо вызывать [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale), поэтому эта функция не является потокобезопасной. Если вызывать setlocale не требуется или нежелательно, *do\_setlocale* следует установить в `False`.283284На Android или если включен [режим Python UTF-8](https://python-all.ru/3.15/library/os.html#utf8-mode), всегда возвращается `'utf-8'`; аргументы [кодировка локали](https://python-all.ru/3.15/glossary.html#term-locale-encoding) и *do\_setlocale* игнорируются.285286[Предварительная инициализация Python](https://python-all.ru/3.15/c-api/init_config.html#c-preinit) настраивает локаль LC\_CTYPE. См. также [кодировку файловой системы и обработчик ошибок](https://python-all.ru/3.15/glossary.html#term-filesystem-encoding-and-error-handler).287288Изменено в версии 3.7: Теперь функция всегда возвращает `"utf-8"` на Android или если включен [режим Python UTF-8](https://python-all.ru/3.15/library/os.html#utf8-mode).289290#### `locale.getencoding()`291292Возвращает текущую [кодировку локали](https://python-all.ru/3.15/glossary.html#term-locale-encoding):293294- На Android и VxWorks возвращает `"utf-8"`.295- На Unix возвращает кодировку текущей локали [`LC_CTYPE`](https://python-all.ru/3.15/library/locale.html#locale.LC_CTYPE). Возвращает `"utf-8"`, если `nl_langinfo(CODESET)` возвращает пустую строку: например, если текущая локаль LC\_CTYPE не поддерживается.296- На Windows возвращает кодовую страницу ANSI.297298[Предварительная инициализация Python](https://python-all.ru/3.15/c-api/init_config.html#c-preinit) настраивает локаль LC\_CTYPE. См. также [кодировку файловой системы и обработчик ошибок](https://python-all.ru/3.15/glossary.html#term-filesystem-encoding-and-error-handler).299300Эта функция аналогична [`getpreferredencoding(False)`](https://python-all.ru/3.15/library/locale.html#locale.getpreferredencoding), за исключением того, что она игнорирует [режим Python UTF-8](https://python-all.ru/3.15/library/os.html#utf8-mode).301302Добавлено в версии 3.12.303304#### `locale.normalize(localename)`305306Возвращает нормализованный код локали для заданного имени локали. Возвращённый код локали отформатирован для использования с [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale). Если нормализация не удалась, исходное имя возвращается без изменений.307308Если заданная кодировка неизвестна, функция использует кодировку по умолчанию для кода локали, как и [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale).309310#### `locale.strcoll(string1, string2)`311312Сравнивает две строки в соответствии с текущей настройкой [`LC_COLLATE`](https://python-all.ru/3.15/library/locale.html#locale.LC_COLLATE). Как и любая другая функция сравнения, возвращает отрицательное, положительное значение или `0` в зависимости от того, располагается ли *string1* до или после *string2* или равна ей.313314#### `locale.strxfrm(string)`315316Преобразует строку в форму, пригодную для сравнений с учётом локали. Например, `strxfrm(s1) < strxfrm(s2)` эквивалентно `strcoll(s1, s2) < 0`. Эта функция может использоваться, когда одна и та же строка сравнивается многократно, например, при сортировке последовательности строк.317318#### `locale.format_string(format, val, grouping=False, monetary=False)`319320Форматирует число *val* в соответствии с текущей настройкой [`LC_NUMERIC`](https://python-all.ru/3.15/library/locale.html#locale.LC_NUMERIC). Формат следует соглашениям оператора `%`. Для чисел с плавающей точкой десятичный разделитель при необходимости изменяется. Если *grouping* равно `True`, также учитывается группировка разрядов.321322Если *monetary* истинно, преобразование использует денежные разделители тысяч и строки группировки.323324Обрабатывает спецификаторы форматирования, как в `format % val`, но с учётом текущих настроек локали.325326Изменено в версии 3.7: Добавлен ключевой параметр *monetary*.327328#### `locale.currency(val, symbol=True, grouping=False, international=False)`329330Форматирует число *val* в соответствии с текущими настройками [`LC_MONETARY`](https://python-all.ru/3.15/library/locale.html#locale.LC_MONETARY).331332Возвращаемая строка включает символ валюты, если *symbol* истинно (значение по умолчанию). Если *grouping* равно `True` (не по умолчанию), группировка выполняется с учётом этого значения. Если *international* равно `True` (не по умолчанию), используется международный символ валюты.333334> **Примечание**335>336> Эта функция не работает с локалью «C», поэтому сначала необходимо задать локаль через [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale).337338#### `locale.str(float)`339340Форматирует число с плавающей запятой в том же формате, что и встроенная функция `str(float)`, но с учётом десятичного разделителя.341342#### `locale.delocalize(string)`343344Преобразует строку в нормализованное строковое представление числа в соответствии с настройками [`LC_NUMERIC`](https://python-all.ru/3.15/library/locale.html#locale.LC_NUMERIC).345346Добавлено в версии 3.5.347348#### `locale.localize(string, grouping=False, monetary=False)`349350Преобразует нормализованное строковое представление числа в отформатированную строку в соответствии с настройками [`LC_NUMERIC`](https://python-all.ru/3.15/library/locale.html#locale.LC_NUMERIC).351352Добавлено в версии 3.10.353354#### `locale.atof(string, func=float)`355356Преобразует строку в число, следуя настройкам [`LC_NUMERIC`](https://python-all.ru/3.15/library/locale.html#locale.LC_NUMERIC), вызывая *func* для результата вызова [`delocalize()`](https://python-all.ru/3.15/library/locale.html#locale.delocalize) для *string*.357358#### `locale.atoi(string)`359360Преобразует строку в целое число, следуя соглашениям [`LC_NUMERIC`](https://python-all.ru/3.15/library/locale.html#locale.LC_NUMERIC).361362#### `locale.LC_CTYPE`363364Категория локали для функций работы с типами символов. Самое важное: эта категория определяет кодировку текста, то есть как байты интерпретируются как кодовые точки Unicode. См. [**PEP 538**](https://python-all.ru/3.15/library/locale.html) и [**PEP 540**](https://python-all.ru/3.15/library/locale.html) о том, как эта переменная может автоматически приводиться к `C.UTF-8` для предотвращения проблем, вызванных некорректными настройками в контейнерах или несовместимыми настройками, переданными через удалённые SSH-соединения.365366Python не использует внутренне зависящие от локали функции преобразования символов из `ctype.h`. Вместо этого `pyctype.h` предоставляет не зависящие от локали эквиваленты, такие как [`Py_TOLOWER`](https://python-all.ru/3.15/c-api/conversion.html#c.Py_TOLOWER).367368#### `locale.LC_COLLATE`369370Категория локали для сортировки строк. Функции [`strcoll()`](https://python-all.ru/3.15/library/locale.html#locale.strcoll) и [`strxfrm()`](https://python-all.ru/3.15/library/locale.html#locale.strxfrm) модуля `locale` затрагиваются.371372#### `locale.LC_TIME`373374Категория локали для форматирования времени. Функция [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime) следует этим соглашениям.375376#### `locale.LC_MONETARY`377378Категория локали для форматирования денежных значений. Доступные параметры можно получить из функции [`localeconv()`](https://python-all.ru/3.15/library/locale.html#locale.localeconv).379380#### `locale.LC_MESSAGES`381382Категория локали для отображения сообщений. В настоящее время Python не поддерживает сообщения, учитывающие локаль, для конкретных приложений. Сообщения, выводимые операционной системой, например возвращаемые [`os.strerror()`](https://python-all.ru/3.15/library/os.html#os.strerror), могут затрагиваться этой категорией.383384Это значение может быть недоступно в операционных системах, не соответствующих стандарту POSIX, в первую очередь в Windows.385386#### `locale.LC_NUMERIC`387388Категория локали для форматирования чисел. Функции [`format_string()`](https://python-all.ru/3.15/library/locale.html#locale.format_string), [`atoi()`](https://python-all.ru/3.15/library/locale.html#locale.atoi), [`atof()`](https://python-all.ru/3.15/library/locale.html#locale.atof) и [`str()`](https://python-all.ru/3.15/library/locale.html#locale.str) модуля `locale` затрагиваются этой категорией. Все остальные операции форматирования чисел не затрагиваются.389390#### `locale.LC_ALL`391392Комбинация всех настроек локали. Если этот флаг используется при изменении локали, предпринимается попытка установить локаль для всех категорий. Если это не удаётся для какой-либо категории, ни одна категория не изменяется. При получении локали с помощью этого флага возвращается строка, указывающая настройки для всех категорий. Эту строку можно впоследствии использовать для восстановления настроек.393394#### `locale.CHAR_MAX`395396Это символическая константа, используемая для различных значений, возвращаемых [`localeconv()`](https://python-all.ru/3.15/library/locale.html#locale.localeconv).397398## Предыстория, подробности, подсказки, советы и предостережения399400Стандарт C определяет локаль как свойство всей программы, изменение которого может быть относительно дорогим. Кроме того, некоторые реализации сломаны таким образом, что частая смена локали может вызывать дампы памяти. Это делает локаль несколько болезненной для правильного использования.401402Изначально при запуске программы локалью является `C`, независимо от того, какая локаль предпочтительна для пользователя. Есть одно исключение: категория [`LC_CTYPE`](https://python-all.ru/3.15/library/locale.html#locale.LC_CTYPE) изменяется при запуске, чтобы установить текущую кодировку локали на предпочтительную кодировку локали пользователя. Программа должна явно указать, что она хочет использовать предпочтительные настройки локали пользователя для других категорий, вызвав `setlocale(LC_ALL, '')`.403404Обычно плохая идея вызывать [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale) в какой-либо библиотечной функции, так как побочный эффект затрагивает всю программу. Сохранение и восстановление почти так же плохо: это дорого и затрагивает другие потоки, которые могут выполняться до восстановления настроек.405406Если при написании модуля общего назначения требуется независимая от локали версия операции, на которую влияет локаль (например, определённые форматы, используемые с [`time.strftime()`](https://python-all.ru/3.15/library/time.html#time.strftime)), необходимо найти способ сделать это без использования процедур из стандартной библиотеки. Ещё лучше убедиться, что использование настроек локали допустимо. И только в крайнем случае стоит документировать, что модуль несовместим с настройками локали, отличными от `C`.407408Единственный способ выполнять числовые операции в соответствии с локалью – использовать специальные функции, определённые в этом модуле: [`atof()`](https://python-all.ru/3.15/library/locale.html#locale.atof), [`atoi()`](https://python-all.ru/3.15/library/locale.html#locale.atoi), [`format_string()`](https://python-all.ru/3.15/library/locale.html#locale.format_string), [`str()`](https://python-all.ru/3.15/library/locale.html#locale.str).409410Не существует способа выполнять преобразование регистра и классификацию символов в соответствии с локалью. Для текстовых строк (Unicode) они выполняются только по значению символа, тогда как для байтовых строк преобразования и классификации выполняются по значению ASCII байта, а байты, у которых установлен старший бит (т.е. не-ASCII байты), никогда не преобразуются и не считаются частью какого-либо класса символов, такого как буква или пробел.411412## Имена локалей413414Формат имени локали зависит от платформы, а набор поддерживаемых локалей может зависеть от конфигурации системы.415416На платформах POSIX он обычно имеет формат [\[1\]](https://python-all.ru/3.15/library/locale.html#id4):417418```419420 language ["_" territory] ["." charset] ["@" modifier]421```422423где *язык* – двух- или трёхбуквенный код языка из [ISO 639](https://python-all.ru/3.15/library/locale.html), *территория* – двухбуквенный код страны или региона из [ISO 3166](https://python-all.ru/3.15/library/locale.html), *кодировка* – кодировка локали, а *модификатор* – название письменности, подтег языка, идентификатор порядка сортировки или другой модификатор локали (например, «latin», «valencia», «stroke» и «euro»).424425В Windows поддерживается несколько форматов. [\[2\]](https://python-all.ru/3.15/library/locale.html#id5) [\[3\]](https://python-all.ru/3.15/library/locale.html#id6) Подмножество тегов [IETF BCP 47](https://python-all.ru/3.15/library/locale.html):426427```428429 language ["-" script] ["-" territory] ["." charset]430 language ["-" script] "-" territory "-" modifier431```432433где *язык* и *территория* имеют то же значение, что и в POSIX, *письменность* – четырёхбуквенный код письменности из [ISO 15924](https://python-all.ru/3.15/library/locale.html), а *модификатор* – подтег языка, идентификатор порядка сортировки или пользовательский модификатор (например, «valencia», «stroke» или «x-python»). Поддерживаются разделители как дефис (`'-'`), так и подчёркивание (`'_'`). Для тегов BCP 47 допускается только кодировка UTF-8.434435Windows также поддерживает имена локалей в формате:436437```438439 language ["_" territory] ["." charset]440```441442где *язык* и *территория* – полные названия, например «English» и «United States», а *кодировка* – либо номер кодовой страницы (например, «1252»), либо UTF-8. В этом формате поддерживается только разделитель подчёркивание.443444Локаль «C» поддерживается на всех платформах.445446\[[1](https://python-all.ru/3.15/library/locale.html#id1)\]447448[IEEE Std 1003.1-2024; 8.2 Переменные интернационализации](https://python-all.ru/3.15/library/locale.html)449450\[[2](https://python-all.ru/3.15/library/locale.html#id2)\]451452[UCRT: имена локалей, языки и строки стран/регионов](https://python-all.ru/3.15/library/locale.html)453454\[[3](https://python-all.ru/3.15/library/locale.html#id3)\]455456[Имена локалей](https://python-all.ru/3.15/library/locale.html)457458## Для разработчиков расширений и программ, встраивающих Python459460Модули расширений никогда не должны вызывать [`setlocale()`](https://python-all.ru/3.15/library/locale.html#locale.setlocale), за исключением случаев, когда нужно узнать текущую локаль. Но поскольку возвращаемое значение можно переносимо использовать только для её восстановления, это не очень полезно (кроме, возможно, выяснения, является ли локаль `C` или нет).461462Когда код Python использует модуль `locale` для смены локали, это также влияет на встраиваемое приложение. Если встраиваемое приложение не хочет, чтобы это происходило, оно должно удалить модуль расширения `_locale` (который выполняет всю работу) из таблицы встроенных модулей в файле `config.c`, и убедиться, что модуль `_locale` недоступен как разделяемая библиотека.463464## Доступ к каталогам сообщений465466#### `locale.gettext(msg)`467468#### `locale.dgettext(domain, msg)`469470#### `locale.dcgettext(domain, msg, category)`471472#### `locale.textdomain(domain)`473474#### `locale.bindtextdomain(domain, dir)`475476#### `locale.bind_textdomain_codeset(domain, codeset)`477478Модуль locale предоставляет интерфейс gettext библиотеки C на системах, которые поддерживают этот интерфейс. Он состоит из функций [`gettext()`](https://python-all.ru/3.15/library/gettext.html#module-gettext), [`dgettext()`](https://python-all.ru/3.15/library/locale.html#locale.dgettext), [`dcgettext()`](https://python-all.ru/3.15/library/locale.html#locale.dcgettext), [`textdomain()`](https://python-all.ru/3.15/library/locale.html#locale.textdomain), [`bindtextdomain()`](https://python-all.ru/3.15/library/locale.html#locale.bindtextdomain), и [`bind_textdomain_codeset()`](https://python-all.ru/3.15/library/locale.html#locale.bind_textdomain_codeset). Они аналогичны одноимённым функциям в модуле [`gettext`](https://python-all.ru/3.15/library/gettext.html#module-gettext), но используют бинарный формат библиотеки C для каталогов сообщений и алгоритмы поиска библиотеки C для нахождения каталогов сообщений.479480Обычно приложениям Python нет необходимости вызывать эти функции, и вместо них следует использовать [`gettext`](https://python-all.ru/3.15/library/gettext.html#module-gettext). Известным исключением из этого правила являются приложения, которые связываются с дополнительными библиотеками C, внутренне вызывающими функции C `gettext` или `dcgettext`. Для таких приложений может потребоваться привязать текстовый домен, чтобы библиотеки могли правильно найти свои каталоги сообщений.481