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()использовать эти сведения. Формат возвращаемой строки не определён, поэтому не следует рассчитывать на то, что он будет одинаковым в разных системах.
-
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) -
Возвращает текущую настройку указанной категории локали в виде последовательности, содержащей language code и encoding. Аргумент 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.format(format, val, grouping=False, monetary=False) -
Обратите внимание, что эта функция работает как
format_string(), но только с одной спецификацией%char. Например,'%f'и'%.0f'— допустимые спецификаторы, а'%f KiB'— нет.Для строк формата целиком используйте
format_string().Устарело с версии 3.7: Вместо неё используйте
format_string().
-
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(),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(), 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 и её алгоритмы поиска этих каталогов.
Приложениям Python обычно не требуется вызывать эти функции; вместо них следует использовать gettext. Известное исключение из этого правила — приложения, связанные с дополнительными библиотеками C, которые внутри вызывают функции C gettext или dcgettext. Таким приложениям может потребоваться привязать текстовый домен, чтобы библиотеки могли правильно находить свои каталоги сообщений.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/locale.html