locale — Службы интернационализации
Исходный код: Lib/locale.py
Модуль locale предоставляет доступ к базе данных локалей POSIX и её функциям. Механизм локалей POSIX позволяет программистам учитывать в приложении некоторые культурные особенности, не требуя от них знания всех особенностей каждой страны, в которой выполняется программное обеспечение.
Модуль locale реализован поверх модуля _locale, который, в свою очередь, использует реализацию локалей ANSI C, если она доступна.
Модуль locale определяет следующее исключение и функции:
-
exception locale.Error -
Исключение, возбуждаемое, если локаль, переданная в
setlocale(), не распознана.
-
locale.setlocale(category, locale=None) -
Если задана locale и она не равна
None,setlocale()изменяет настройку локали для category. Доступные категории перечислены в описании данных ниже. Значением locale может быть строка или итерируемый объект из двух строк (код языка и кодировка). Если передан итерируемый объект, он преобразуется в имя локали с помощью механизма подстановки псевдонимов локалей. Пустая строка указывает на настройки пользователя по умолчанию. Если изменить локаль не удаётся, возбуждается исключениеError. В случае успеха возвращается новая настройка локали.Если аргумент locale опущен или равен
None, возвращается текущая настройка для category.На большинстве систем
setlocale()не является потокобезопасной. Обычно приложения начинают работу с вызоваimport locale locale.setlocale(locale.LC_ALL, '')
Он задаёт для всех категорий локаль по умолчанию, используемую пользователем (обычно указанную в переменной окружения
LANG). Если после этого локаль не изменяется, многопоточность не должна вызывать проблем.
-
locale.localeconv() -
Возвращает базу данных локальных соглашений в виде словаря. В этом словаре используются следующие строки-ключи:
Категория
Ключ
Значение
'decimal_point'Символ десятичного разделителя.
'grouping'Последовательность чисел, задающих позиции относительно друг друга, в которых ожидается
'thousands_sep'. Если последовательность заканчивается наCHAR_MAX, дальнейшая группировка не выполняется. Если последовательность заканчивается на0, размер последней группы используется повторно.'thousands_sep'Символ, используемый между группами.
'int_curr_symbol'Международный символ валюты.
'currency_symbol'Локальный символ валюты.
'p_cs_precedes/n_cs_precedes'Стоит ли символ валюты перед значением (для положительных и отрицательных значений соответственно).
'p_sep_by_space/n_sep_by_space'Отделяется ли символ валюты от значения пробелом (для положительных и отрицательных значений соответственно).
'mon_decimal_point'Десятичный разделитель для денежных значений.
'frac_digits'Количество дробных разрядов, используемых при локальном форматировании денежных значений.
'int_frac_digits'Количество дробных разрядов, используемых при международном форматировании денежных значений.
'mon_thousands_sep'Разделитель групп для денежных значений.
'mon_grouping'Аналогично
'grouping', используется для денежных значений.'positive_sign'Символ, обозначающий положительное денежное значение.
'negative_sign'Символ, обозначающий отрицательное денежное значение.
'p_sign_posn/n_sign_posn'Положение знака (для положительных и отрицательных значений соответственно); см. ниже.
Всем числовым значениям можно присвоить
CHAR_MAX, чтобы указать, что в этой локали значение не задано.Возможные значения для
'p_sign_posn'и'n_sign_posn'приведены ниже.Значение
Пояснение
0Валюта и значение заключены в скобки.
1Знак должен предшествовать значению и символу валюты.
2Знак должен следовать за значением и символом валюты.
3Знак должен непосредственно предшествовать значению.
4Знак должен непосредственно следовать за значением.
CHAR_MAXВ этой локали значение не задано.
Функция временно устанавливает локаль
LC_CTYPEв значение локалиLC_NUMERICилиLC_MONETARY, если локали различаются и числовые или денежные строки содержат символы не из ASCII. Это временное изменение влияет на другие потоки.Изменено в версии 3.7: В некоторых случаях функция теперь временно устанавливает локаль
LC_CTYPEв значение локалиLC_NUMERIC.
-
locale.nl_langinfo(option) -
Возвращает строку с некоторыми сведениями, зависящими от локали. Эта функция доступна не во всех системах, а набор возможных параметров может различаться на разных платформах. Возможные значения аргумента — числа, для которых в модуле locale имеются символьные константы.
Функция
nl_langinfo()принимает один из следующих ключей. Большинство описаний взято из соответствующих описаний в библиотеке GNU C.-
locale.CODESET -
Получить строку с названием кодировки символов, используемой в выбранной локали.
-
locale.D_T_FMT -
Получить строку, которую можно использовать в качестве строки формата для
time.strftime(), чтобы представить дату и время в соответствии с локалью.
-
locale.D_FMT -
Получить строку, которую можно использовать в качестве строки формата для
time.strftime(), чтобы представить дату в соответствии с локалью.
-
locale.T_FMT -
Получить строку, которую можно использовать в качестве строки формата для
time.strftime(), чтобы представить время в соответствии с локалью.
-
locale.T_FMT_AMPM -
Получить строку формата для
time.strftime(), чтобы представить время в формате am/pm.
-
locale.DAY_1 -
locale.DAY_2 -
locale.DAY_3 -
locale.DAY_4 -
locale.DAY_5 -
locale.DAY_6 -
locale.DAY_7 -
Получить название n-го дня недели.
Примечание
Здесь используется принятый в США порядок:
DAY_1— воскресенье, а не международный порядок (ISO 8601), в котором неделя начинается с понедельника.
-
locale.ABDAY_1 -
locale.ABDAY_2 -
locale.ABDAY_3 -
locale.ABDAY_4 -
locale.ABDAY_5 -
locale.ABDAY_6 -
locale.ABDAY_7 -
Получить сокращённое название n-го дня недели.
-
locale.MON_1 -
locale.MON_2 -
locale.MON_3 -
locale.MON_4 -
locale.MON_5 -
locale.MON_6 -
locale.MON_7 -
locale.MON_8 -
locale.MON_9 -
locale.MON_10 -
locale.MON_11 -
locale.MON_12 -
Получить название n-го месяца.
-
locale.ABMON_1 -
locale.ABMON_2 -
locale.ABMON_3 -
locale.ABMON_4 -
locale.ABMON_5 -
locale.ABMON_6 -
locale.ABMON_7 -
locale.ABMON_8 -
locale.ABMON_9 -
locale.ABMON_10 -
locale.ABMON_11 -
locale.ABMON_12 -
Получить сокращённое название n-го месяца.
-
locale.RADIXCHAR -
Получить символ десятичного разделителя (десятичную точку, десятичную запятую и т. д.).
-
locale.THOUSEP -
Получить символ-разделитель тысяч (групп по три цифры).
-
locale.YESEXPR -
Получить регулярное выражение, которое можно использовать с функцией обработки регулярных выражений для распознавания положительного ответа на вопрос с ответом «да» или «нет».
-
locale.NOEXPR -
Получить регулярное выражение, которое можно использовать с функцией
regex(3)для распознавания отрицательного ответа на вопрос с ответом «да» или «нет».
-
locale.CRNCYSTR -
Получить символ валюты с префиксом «-», если символ должен располагаться перед значением, «+», если символ должен располагаться после значения, или «.», если символ должен заменять десятичный разделитель.
-
locale.ERA -
Получить строку, описывающую способы исчисления и отображения лет для каждой эры в данной локали.
Большинство локалей не определяет это значение. Пример локали, в которой оно определено, — японская. В Японии традиционное представление дат включает название эры, соответствующей правлению императора того времени.
Обычно нет необходимости напрямую использовать это значение. Указание модификатора
Eв строках формата заставляет функциюtime.strftime()использовать эти сведения. Формат возвращаемой строки задан в Основных спецификациях The Open Group, выпуск 8, пункте 7.3.5.2 Доступ к LC_TIME из языка C.
-
locale.ERA_D_T_FMT -
Получить строку формата для
time.strftime(), чтобы представить дату и время с учётом эр, в соответствии с локалью.
-
locale.ERA_D_FMT -
Получить строку формата для
time.strftime(), чтобы представить дату с учётом эр, в соответствии с локалью.
-
locale.ERA_T_FMT -
Получить строку формата для
time.strftime(), чтобы представить время с учётом эр, в соответствии с локалью.
-
locale.ALT_DIGITS -
Получить строку, состоящую не более чем из 100 символов, разделённых точками с запятой и используемых для представления значений от 0 до 99 в соответствии с локалью. В большинстве локалей эта строка пуста.
-
-
locale.getdefaultlocale([envvars]) -
Пытается определить настройки локали по умолчанию и возвращает их в виде кортежа формы
(language code, encoding).Согласно POSIX, программа, не вызывавшая
setlocale(LC_ALL, ''), работает с переносимой локалью'C'. Вызовsetlocale(LC_ALL, '')позволяет использовать локаль по умолчанию, заданную переменнойLANG. Чтобы не влиять на текущую настройку локали, мы имитируем описанное выше поведение.Для обеспечения совместимости с другими платформами проверяется не только переменная
LANG, но и список переменных, переданный в качестве параметра envvars. Будет использована первая найденная определённая переменная. По умолчанию envvars содержит список поиска, используемый GNU gettext; он всегда должен включать имя переменной'LANG'. Список поиска GNU gettext содержит'LC_ALL','LC_CTYPE','LANG'и'LANGUAGE'именно в таком порядке.За исключением кода
'C', код языка соответствует RFC 1766. Значения language code и encoding могут быть равныNone, если их невозможно определить.Устарело с версии 3.11, будет удалено в версии 3.15.
-
locale.getlocale(category=LC_CTYPE) -
Возвращает текущую настройку для заданной категории локали в виде последовательности, содержащей код языка и кодировку. В качестве category можно указать любое из значений
LC_*, кромеLC_ALL. По умолчанию используетсяLC_CTYPE.За исключением кода
'C', код языка соответствует RFC 1766. Значения language code и encoding могут быть равныNone, если их невозможно определить.
-
locale.getpreferredencoding(do_setlocale=True) -
Возвращает кодировку локали, используемую для текстовых данных согласно предпочтениям пользователя. На разных системах предпочтения пользователя выражаются по-разному, а на некоторых системах их невозможно получить программно, поэтому эта функция возвращает лишь предположительное значение.
В некоторых системах для получения предпочтений пользователя необходимо вызвать
setlocale(), поэтому эта функция не является потокобезопасной. Если вызов setlocale не требуется или нежелателен, параметру do_setlocale следует присвоитьFalse.На Android или при включённом режиме UTF-8 Python всегда возвращается
'utf-8'; аргументы кодировка локали и do_setlocale игнорируются.Предварительная инициализация Python настраивает локаль LC_CTYPE. См. также кодировку файловой системы и обработчик ошибок.
Изменено в версии 3.7: На Android или при включённом режиме UTF-8 Python функция теперь всегда возвращает
"utf-8".
-
locale.getencoding() -
Получить текущую кодировку локали:
- На Android и VxWorks возвращает
"utf-8". - В Unix возвращает кодировку текущей локали
LC_CTYPE. Возвращает"utf-8", еслиnl_langinfo(CODESET)возвращает пустую строку, например, если текущая локаль LC_CTYPE не поддерживается. - В Windows возвращает кодовую страницу ANSI.
Предварительная инициализация Python настраивает локаль LC_CTYPE. См. также кодировку файловой системы и обработчик ошибок.
Эта функция похожа на
getpreferredencoding(False), но игнорирует режим UTF-8 Python.Добавлено в версии 3.11.
- На Android и VxWorks возвращает
-
locale.normalize(localename) -
Возвращает нормализованный код локали для заданного имени локали. Возвращаемый код локали форматируется для использования с
setlocale(). Если нормализация не удаётся, исходное имя возвращается без изменений.Если заданная кодировка неизвестна, функция, как и
setlocale(), использует кодировку по умолчанию для кода локали.
-
locale.resetlocale(category=LC_ALL) -
Устанавливает для category локаль по умолчанию.
Настройка по умолчанию определяется вызовом
getdefaultlocale(). По умолчанию category имеет значениеLC_ALL.Устарело с версии 3.11, будет удалено в версии 3.13.
-
locale.strcoll(string1, string2) -
Сравнивает две строки в соответствии с текущей настройкой
LC_COLLATE. Как и любая другая функция сравнения, возвращает отрицательное или положительное значение либо0в зависимости от того, предшествует ли string1 строке string2 при сортировке, следует за ней или равна ей.
-
locale.strxfrm(string) -
Преобразует строку в строку, пригодную для сравнений с учётом локали. Например,
strxfrm(s1) < strxfrm(s2)эквивалентноstrcoll(s1, s2) < 0. Эту функцию можно использовать, если одна и та же строка сравнивается многократно, например при сортировке последовательности строк.
-
locale.format_string(format, val, grouping=False, monetary=False) -
Форматирует число val в соответствии с текущей настройкой
LC_NUMERIC. Формат соответствует соглашениям оператора%. Для значений с плавающей точкой десятичный разделитель при необходимости заменяется. Если grouping равноTrue, также учитывается группировка.Если monetary имеет значение true, при преобразовании используются разделитель тысяч и строки группировки для денежных значений.
Обрабатывает спецификаторы форматирования так же, как
format % val, но с учётом текущих настроек локали.Изменено в версии 3.7: Добавлен именованный параметр monetary.
-
locale.currency(val, symbol=True, grouping=False, international=False) -
Форматирует число val в соответствии с текущими настройками
LC_MONETARY.Возвращаемая строка включает символ валюты, если symbol имеет значение true (по умолчанию). Если grouping равно
True(не используется по умолчанию), значение группируется. Если international равноTrue(не используется по умолчанию), применяется международный символ валюты.Примечание
Эта функция не работает с локалью ‘C’, поэтому сначала необходимо задать локаль с помощью
setlocale().
-
locale.str(float) -
Форматирует число с плавающей точкой в том же формате, что и встроенная функция
str(float), но учитывает десятичный разделитель.
-
locale.delocalize(string) -
Преобразует строку в нормализованную строку числа в соответствии с настройками
LC_NUMERIC.Добавлено в версии 3.5.
-
locale.localize(string, grouping=False, monetary=False) -
Преобразует нормализованную строку числа в отформатированную строку в соответствии с настройками
LC_NUMERIC.Добавлено в версии 3.10.
-
locale.atof(string, func=float) -
Преобразует строку в число в соответствии с настройками
LC_NUMERIC, вызывая func для результата вызоваdelocalize()с аргументом string.
-
locale.atoi(string) -
Преобразует строку в целое число в соответствии с соглашениями
LC_NUMERIC.
-
locale.LC_CTYPE -
Категория локали для функций, работающих с типами символов. Важнее всего то, что эта категория задаёт кодировку текста, то есть способ интерпретации байтов как кодовых точек Unicode. О том, как эта переменная может автоматически принудительно устанавливаться в
C.UTF-8во избежание проблем из-за недопустимых настроек в контейнерах или несовместимых настроек, переданных через удалённые SSH-подключения, см. PEP 538 и PEP 540.Python не использует внутри себя зависящие от локали функции преобразования символов из
ctype.h. Вместо этого внутреннийpyctype.hпредоставляет эквивалентные функции, не зависящие от локали, напримерPy_TOLOWER.
-
locale.LC_COLLATE -
Категория локали для сортировки строк. На неё влияют функции
strcoll()иstrxfrm()модуляlocale.
-
locale.LC_TIME -
Категория локали для форматирования времени. Функция
time.strftime()следует этим соглашениям.
-
locale.LC_MONETARY -
Категория локали для форматирования денежных значений. Доступные параметры можно получить с помощью функции
localeconv().
-
locale.LC_MESSAGES -
Категория локали для отображения сообщений. В настоящее время Python не поддерживает сообщения с учетом локали, специфичные для приложения. Эта категория может влиять на сообщения, отображаемые операционной системой, например возвращаемые функцией
os.strerror().Это значение может быть недоступно в операционных системах, не соответствующих стандарту POSIX, в частности в Windows.
-
locale.LC_NUMERIC -
Категория локали для форматирования чисел. На эту категорию влияют функции
format_string(),atoi(),atof()иstr()модуляlocale. На все остальные операции форматирования чисел эта категория не влияет.
-
locale.LC_ALL -
Совокупность всех настроек локали. Если при изменении локали используется этот флаг, предпринимается попытка задать локаль для всех категорий. Если для какой-либо категории это не удается, ни одна из категорий не меняется. При получении локали с помощью этого флага возвращается строка, указывающая настройки всех категорий. Эту строку впоследствии можно использовать для восстановления настроек.
-
locale.CHAR_MAX -
Это символьная константа, используемая для различных значений, возвращаемых функцией
localeconv().
Пример:
>>> import locale
>>> loc = locale.getlocale() # get current locale
# use German locale; name might vary with platform
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
>>> locale.strcoll('f\xe4n', 'foo') # compare a string containing an umlaut
>>> locale.setlocale(locale.LC_ALL, '') # use user's preferred locale
>>> locale.setlocale(locale.LC_ALL, 'C') # use default (C) locale
>>> locale.setlocale(locale.LC_ALL, loc) # restore saved locale
Общие сведения, подробности, подсказки, советы и предостережения
Стандарт C определяет локаль как свойство всей программы, изменение которого может быть относительно затратным. Кроме того, некоторые реализации работают некорректно: частая смена локали может приводить к аварийному завершению программы с созданием дампа ядра. Поэтому правильно использовать локаль бывает непросто.
Изначально при запуске программы локаль имеет значение C, независимо от предпочтительной локали пользователя. Есть одно исключение: при запуске категория LC_CTYPE изменяется, чтобы задать текущую кодировку локали в соответствии с предпочтительной кодировкой локали пользователя. Чтобы использовать предпочтительные настройки локали пользователя для остальных категорий, программа должна явно запросить это, вызвав setlocale(LC_ALL, '').
Как правило, вызывать setlocale() в библиотечной функции — плохая идея, поскольку это побочно влияет на всю программу. Сохранение и восстановление локали почти так же нежелательно: это затратная операция, которая влияет на другие потоки, выполняющиеся до восстановления настроек.
Если при написании модуля общего назначения вам нужна версия операции, не зависящая от локали, но на которую локаль влияет (например, некоторые форматы, используемые с time.strftime()), придется найти способ выполнить ее без стандартной библиотечной функции. Еще лучше — убедить себя, что настройки локали использовать допустимо. Лишь в крайнем случае следует документировать, что модуль несовместим с настройками локали, отличными от C.
Единственный способ выполнять числовые операции с учетом локали — использовать специальные функции, определенные этим модулем: atof(), atoi(), format_string(), str().
Выполнять преобразование регистра и классификацию символов с учетом локали невозможно. Для текстовых строк Unicode эти операции выполняются только на основании значения символа, а для байтовых строк преобразования и классификация выполняются на основании значения ASCII байта; байты со старшим установленным битом (то есть не-ASCII-байты) никогда не преобразуются и не считаются частью класса символов, например букв или пробельных символов.
Для авторов расширений и программ, встраивающих Python
Модули расширений никогда не должны вызывать setlocale(), кроме случаев, когда нужно узнать текущую локаль. Но поскольку возвращаемое значение можно использовать переносимым образом только для ее восстановления, это не слишком полезно (разве что, возможно, чтобы узнать, установлена ли локаль C).
Когда код Python использует модуль locale для изменения локали, это также влияет на встраивающее приложение. Если приложение не должно подвергаться этому влиянию, ему следует удалить модуль расширения _locale (который выполняет всю работу) из таблицы встроенных модулей в файле config.c и убедиться, что модуль _locale недоступен как разделяемая библиотека.
Доступ к каталогам сообщений
-
locale.gettext(msg)
-
locale.dgettext(domain, msg)
-
locale.dcgettext(domain, msg, category)
-
locale.textdomain(domain)
-
locale.bindtextdomain(domain, dir)
-
locale.bind_textdomain_codeset(domain, codeset)
Модуль locale предоставляет интерфейс gettext из библиотеки C в системах, где этот интерфейс доступен. Он состоит из функций gettext(), dgettext(), dcgettext(), textdomain(), bindtextdomain() и bind_textdomain_codeset(). Они похожи на одноименные функции модуля gettext, но используют двоичный формат каталогов сообщений библиотеки C и алгоритмы поиска библиотеки C для обнаружения каталогов сообщений.
Приложениям Python обычно не требуется вызывать эти функции; вместо них следует использовать gettext. Известное исключение — приложения, связанные с дополнительными библиотеками C, которые внутри вызывают функции C gettext или dcgettext. Для таких приложений может потребоваться привязать текстовый домен, чтобы библиотеки могли правильно находить свои каталоги сообщений.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/locale.html