# `locale` — Internationalization services

Вихідний код: Lib/locale.py

Модуль `locale` відкриває доступ до бази даних і функцій POSIX locale. Механізм локалізації POSIX дозволяє програмістам мати справу з певними культурними проблемами в додатку, не вимагаючи від програміста знання всіх особливостей кожної країни, де виконується програмне забезпечення.

The `locale` module is implemented on top of the `_locale` module, which in turn uses an ANSI C locale implementation if available.

Модуль `locale` визначає такі винятки та функції:

exception locale.Error

  Виняток виникає, коли локаль, передана `setlocale()`, не розпізнається.

locale.setlocale(category, locale=None)

  If locale is given and not `None`, `setlocale()` modifies the locale setting for the category. The available categories are listed in the data description below. locale may be a string, or a pair, language code and encoding. An empty string specifies the user’s default settings. If the modification of the locale fails, the exception `Error` is raised. If successful, the new locale setting is returned.

  If locale is a pair, it is converted to a locale name using the locale aliasing engine. The language code has the same format as a locale name, but without encoding and `@`-modifier. The language code and encoding can be `None`.

  Якщо locale пропущено або `None`, повертається поточне налаштування для category.

  `setlocale()` не є потокобезпечним у більшості систем. Програми зазвичай починаються з виклику

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

  Це встановлює локаль для всіх категорій на налаштування користувача за замовчуванням (зазвичай вказується у змінній середовища `LANG`). Якщо після цього локаль не буде змінено, використання багатопоточності не повинно викликати проблем.

locale.localeconv()

  Повертає базу даних локальних угод як словник. Цей словник має такі рядки як ключі:

  Категорія | ключ | Значення
  --- | --- | ---
  `LC_NUMERIC` | `'десяткова_крапка''` | Символ десяткової точки.
  | `'групування''` | Послідовність чисел, що вказує, які відносні позиції очікується `'thousands_sep`. Якщо послідовність закінчується `CHAR_MAX`, подальше групування не виконується. Якщо послідовність завершується `0`, останній розмір групи використовується повторно.
  | `'thousands_sep''` | Символ, що використовується між групами.
  `LC_MONETARY` | `'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'` | Еквівалент `'групування''`, що використовується для грошових значень.
  | `'позитивний_знак'` | Символ, який використовується для позначення додатної грошової вартості.
  | `'негативний_знак'` | Символ, який використовується для позначення від’ємної грошової вартості.
  | `'p_sign_posn/n_sign_posn''` | Розташування знака (для додатних чи від’ємних значень) див. нижче.

  Для всіх числових значень можна встановити значення `CHAR_MAX`, щоб вказати, що в цій локалі не вказано значення.

  Нижче наведено можливі значення для `'p_sign_posn'` і `'n_sign_posn'`.

  Значення | Пояснення
  --- | ---
  `0` | Валюта та значення взяті в дужки.
  `1` | Знак має передувати символу вартості та валюти.
  `2` | Знак повинен слідувати за символом вартості та валюти.
  `3` | Знак повинен стояти безпосередньо перед значенням.
  `4` | Знак повинен слідувати безпосередньо за значенням.
  `CHAR_MAX` | У цій локалі нічого не вказано.

  The function temporarily sets the `LC_CTYPE` locale to the `LC_NUMERIC` locale or the `LC_MONETARY` locale if locales are different and numeric or monetary strings are non-ASCII. This temporary change affects other threads.

  Змінено в версії 3.7: The function now temporarily sets the `LC_CTYPE` locale to the `LC_NUMERIC` locale in some cases.

locale.nl_langinfo(option)

  Повертає деяку інформацію про локаль у вигляді рядка. Ця функція доступна не в усіх системах, і набір можливих параметрів також може відрізнятися на різних платформах. Можливими значеннями аргументів є числа, для яких у модулі локалі доступні символьні константи.

  Функція `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

    Get a regular expression that can be used with the `regex(3)` function to recognize a negative response to a yes/no question.

    Примітка

    The regular expressions for `YESEXPR` and `NOEXPR` use syntax suitable for the `regex` function from the C library, which might differ from the syntax used in `re`.

  locale.CRNCYSTR

    Отримайте символ грошової одиниці, якому передує «-», якщо символ має стояти перед значенням, «+», якщо символ має стояти після значення, або «.» якщо символ повинен замінити символ основи.

  locale.ERA

    Get a string which describes how years are counted and displayed for each era in a locale.

    Більшість локалей не визначають це значення. Прикладом локалі, яка визначає це значення, є японська. У Японії традиційне представлення дат включає назву епохи, яка відповідає правлінню тодішнього імператора.

    Normally it should not be necessary to use this value directly. Specifying the `E` modifier in their format strings causes the `time.strftime()` function to use this information. The format of the returned string is specified in The Open Group Base Specifications Issue 8, paragraph 7.3.5.2 LC_TIME C-Language Access.

  locale.ERA_D_T_FMT

    Отримайте рядок формату для `time.strftime()`, щоб представити дату й час у спосіб, що залежить від місцевості й епохи.

  locale.ERA_D_FMT

    Отримайте рядок формату для `time.strftime()`, щоб представити дату залежно від локалі на основі епохи.

  locale.ERA_T_FMT

    Отримайте рядок формату для `time.strftime()`, щоб представити час залежно від локалі на основі епохи.

  locale.ALT_DIGITS

    Get a string consisting of up to 100 semicolon-separated symbols used to represent the values 0 to 99 in a locale-specific way. In most locales this is an empty string.

  The function temporarily sets the `LC_CTYPE` locale to the locale of the category that determines the requested value (`LC_TIME`, `LC_NUMERIC`, `LC_MONETARY` or `LC_MESSAGES`) if locales are different and the resulting string is non-ASCII. This temporary change affects other threads.

  Змінено в версії 3.14: The function now temporarily sets the `LC_CTYPE` locale in some cases.

locale.getdefaultlocale([envvars])

  Намагається визначити параметри мови за замовчуванням і повертає їх як кортеж у формі `(код мови, кодування)`.

  Відповідно до POSIX, програма, яка не викликала `setlocale(LC_ALL, '')`, працює з використанням портативної локалі `'C''`. Виклик `setlocale(LC_ALL, '')` дозволяє використовувати локаль за замовчуванням, як визначено змінною `LANG`. Оскільки ми не хочемо втручатися в поточні налаштування локалі, ми таким чином емулюємо поведінку, як описано вище.

  Щоб підтримувати сумісність з іншими платформами, перевіряється не лише змінна `LANG`, але й список змінних, наданий як параметр envvars. Використовуватиметься перший знайдений. envvars за умовчанням використовує шлях пошуку, який використовується в GNU gettext; він завжди повинен містити назву змінної `'LANG'`. Шлях пошуку GNU gettext містить `'LC_ALL'`, `'LC_CTYPE'`, `'LANG'` і `'LANGUAGE'`, у такому порядку.

  The language code has the same format as a locale name, but without encoding and `@`-modifier. The language code and encoding may be `None` if their values cannot be determined. The «C» locale is represented as `(None, None)`.

  Deprecated since version 3.11, will be removed in version 3.15.

locale.getlocale(category=LC_CTYPE)

  Returns the current setting for the given locale category as a tuple containing the language code and encoding. category may be one of the `LC_*` values except `LC_ALL`. It defaults to `LC_CTYPE`.

  The language code has the same format as a locale name, but without encoding and `@`-modifier. The language code and encoding may be `None` if their values cannot be determined. The «C» locale is represented as `(None, None)`.

locale.getpreferredencoding(do_setlocale=True)

  Повертає locale encoding, що використовується для текстових даних, відповідно до вподобань користувача. Налаштування користувача виражаються по-різному в різних системах і можуть бути недоступні програмно в деяких системах, тому ця функція повертає лише припущення.

  У деяких системах необхідно викликати `setlocale()`, щоб отримати параметри користувача, тому ця функція небезпечна для потоків. Якщо виклик setlocale не є необхідним або бажаним, do_setlocale має бути встановлено на `False`.

  On Android or if the Python UTF-8 Mode is enabled, always return `'utf-8'`, the locale encoding and the do_setlocale argument are ignored.

  Попередня ініціалізація Python налаштовує локаль LC_CTYPE. Дивіться також filesystem encoding and error handler.

  Змінено в версії 3.7: The function now always returns `"utf-8"` on Android or if the Python UTF-8 Mode is enabled.

locale.getencoding()

  Get the current locale encoding:

  - On Android and VxWorks, return `"utf-8"`.

  - On Unix, return the encoding of the current `LC_CTYPE` locale. Return `"utf-8"` if `nl_langinfo(CODESET)` returns an empty string: for example, if the current LC_CTYPE locale is not supported.

  - On Windows, return the ANSI code page.

  Попередня ініціалізація Python налаштовує локаль LC_CTYPE. Дивіться також filesystem encoding and error handler.

  This function is similar to `getpreferredencoding(False)` except this function ignores the Python UTF-8 Mode.

  Added in version 3.11.

locale.normalize(localename)

  Повертає нормалізований код мови для заданої назви мови. Повернений код мови відформатовано для використання з `setlocale()`. Якщо нормалізація не вдається, вихідне ім’я повертається без змін.

  Якщо задане кодування невідоме, функція за замовчуванням використовує кодування за замовчуванням для коду мови, як `setlocale()`.

locale.strcoll(string1, string2)

  Порівнює два рядки відповідно до поточного параметра `LC_COLLATE`. Як і будь-яка інша функція порівняння, повертає від’ємне або додатне значення, або `0`, залежно від того, чи рядок1 порівнює до чи після рядок2 або дорівнює йому.

locale.strxfrm(string)

  Перетворює рядок на такий, який можна використовувати для порівняння з урахуванням локалі. Наприклад, `strxfrm(s1) < strxfrm(s2)` еквівалентно `strcoll(s1, s2) < 0`. Цю функцію можна використовувати, коли той самий рядок порівнюється багаторазово, наприклад. під час зіставлення послідовності рядків.

locale.format_string(format, val, grouping=False, monetary=False)

  Formats a number val according to the current `LC_NUMERIC` setting. The format follows the conventions of the `%` operator. For floating-point values, the decimal point is modified if appropriate. If grouping is `True`, also takes the grouping into account.

  Якщо monetary має значення true, для перетворення використовуються грошові розділювачі тисяч і рядки групування.

  Обробляє специфікатори форматування як у `format % val`, але враховує поточні налаштування мови.

  Змінено в версії 3.7: Додано параметр ключового слова monetary.

locale.currency(val, symbol=True, grouping=False, international=False)

  Форматує число val відповідно до поточних налаштувань `LC_MONETARY`.

  The returned string includes the currency symbol if symbol is true, which is the default. If grouping is `True` (which is not the default), grouping is done with the value. If international is `True` (which is not the default), the international currency symbol is used.

  Примітка

  This function will not work with the „C“ locale, so you have to set a locale via `setlocale()` first.

locale.str(float)

  Formats a floating-point number using the same format as the built-in function `str(float)`, but takes the decimal point into account.

locale.delocalize(string)

  Перетворює рядок у нормалізований числовий рядок відповідно до параметрів `LC_NUMERIC`.

  Added in version 3.5.

locale.localize(string, grouping=False, monetary=False)

  Перетворює нормалізований числовий рядок у відформатований рядок відповідно до параметрів `LC_NUMERIC`.

  Added in version 3.10.

locale.atof(string, func=float)

  Перетворює рядок на число відповідно до налаштувань `LC_NUMERIC`, викликаючи func в результаті виклику `delocalize()` для string.

locale.atoi(string)

  Перетворює рядок на ціле число, дотримуючись угод `LC_NUMERIC`.

locale.LC_CTYPE

  Locale category for the character type functions. Most importantly, this category defines the text encoding, i.e. how bytes are interpreted as Unicode codepoints. See PEP 538 and PEP 540 for how this variable might be automatically coerced to `C.UTF-8` to avoid issues created by invalid settings in containers or incompatible settings passed over remote SSH connections.

  Python doesn’t internally use locale-dependent character transformation functions from `ctype.h`. Instead, an internal `pyctype.h` provides locale-independent equivalents like `Py_TOLOWER`.

locale.LC_COLLATE

  Локальна категорія для сортування рядків. Це впливає на функції `strcoll()` і `strxfrm()` модуля `locale`.

locale.LC_TIME

  Локальна категорія для форматування часу. Функція `time.strftime()` відповідає цим умовам.

locale.LC_MONETARY

  Локальна категорія для форматування грошових значень. Доступні параметри доступні з функції `localeconv()`.

locale.LC_MESSAGES

  Категорія мови для відображення повідомлень. Python наразі не підтримує повідомлень із залежністю від мови програми. Ця категорія може вплинути на повідомлення, які відображає операційна система, наприклад ті, що повертає `os.strerror()`.

  This value may not be available on operating systems not conforming to the POSIX standard, most notably Windows.

locale.LC_NUMERIC

  Locale category for formatting numbers. The functions `format_string()`, `atoi()`, `atof()` and `str()` of the `locale` module are affected by that category. All other numeric formatting operations are not affected.

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

The only way to perform numeric operations according to the locale is to use the special functions defined by this module: `atof()`, `atoi()`, `format_string()`, `str()`.

Немає способу виконати перетворення регістру та класифікацію символів відповідно до локалі. Для текстових рядків (Unicode) вони виконуються лише відповідно до значення символу, тоді як для рядків байтів перетворення та класифікація виконуються відповідно до значення ASCII байта та байтів, для яких встановлено старший біт (тобто байти, що не належать до ASCII ) ніколи не перетворюються та не вважаються частиною класу символів, такого як літера чи пробіл.

## Locale names

The format of the locale name is platform dependent, and the set of supported locales can depend on the system configuration.

On Posix platforms, it usually has the format [1]:

      language ["_" territory] ["." charset] ["@" modifier]

where language is a two- or three-letter language code from ISO 639, territory is a two-letter country or region code from ISO 3166, charset is a locale encoding, and modifier is a script name, a language subtag, a sort order identifier, or other locale modifier (for example, «latin», «valencia», «stroke» and «euro»).

On Windows, several formats are supported. [2] [3] A subset of IETF BCP 47 tags:

      language ["-" script] ["-" territory] ["." charset]
      language ["-" script] "-" territory "-" modifier

where language and territory have the same meaning as in Posix, script is a four-letter script code from ISO 15924, and modifier is a language subtag, a sort order identifier or custom modifier (for example, «valencia», «stroke» or «x-python»). Both hyphen (`'-'`) and underscore (`'_'`) separators are supported. Only UTF-8 encoding is allowed for BCP 47 tags.

Windows also supports locale names in the format:

      language ["_" territory] ["." charset]

where language and territory are full names, such as «English» and «United States», and charset is either a code page number (for example, «1252») or UTF-8. Only the underscore separator is supported in this format.

The «C» locale is supported on all platforms.

[1]

IEEE Std 1003.1-2024; 8.2 Internationalization Variables

[2]

UCRT Locale names, Languages, and Country/Region strings

[3]

Locale Names

## Для авторів розширень і програм, які вбудовують Python

Модулі розширення ніколи не повинні викликати `setlocale()`, за винятком того, щоб дізнатися, яка поточна локаль. Але оскільки значення, що повертається, можна використати лише портативно, щоб відновити його, це не дуже корисно (за винятком, можливо, для того, щоб дізнатися, чи є локаль `C`).

When Python code uses the `locale` module to change the locale, this also affects the embedding application. If the embedding application doesn’t want this to happen, it should remove the `_locale` extension module (which does all the work) from the table of built-in modules in the `config.c` file, and make sure that the `_locale` module is not accessible as a shared library.

## Доступ до каталогів повідомлень

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)

The locale module exposes the C library’s gettext interface on systems that provide this interface. It consists of the functions `gettext()`, `dgettext()`, `dcgettext()`, `textdomain()`, `bindtextdomain()`, and `bind_textdomain_codeset()`. These are similar to the same functions in the `gettext` module, but use the C library’s binary format for message catalogs, and the C library’s search algorithms for locating message catalogs.

Python applications should normally find no need to invoke these functions, and should use `gettext` instead. A known exception to this rule are applications that link with additional C libraries which internally invoke C functions `gettext` or `dcgettext`. For these applications, it may be necessary to bind the text domain, so that the libraries can properly locate their message catalogs.