Документация Python неофициальный перевод

gettext.md

410 строк · 39.1 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.14/library/gettext.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `gettext` – Многоязычные сервисы интернационализации89**Исходный код:** [Lib/gettext.py](https://python-all.ru/src/3.14/Lib/gettext.py)1011---1213Модуль `gettext` предоставляет службы интернационализации (I18N) и локализации (L10N) для модулей и приложений Python. Он поддерживает как API каталогов сообщений GNU **gettext**, так и более высокоуровневый API на основе классов, который может лучше подходить для файлов Python. Описанный ниже интерфейс позволяет писать сообщения модуля и приложения на одном естественном языке и предоставлять каталог переведённых сообщений для работы на разных естественных языках.1415Также даются некоторые советы по локализации модулей и приложений Python.1617## GNU **gettext** API1819Модуль `gettext` определяет следующий API, очень похожий на API GNU **gettext**. Использование этого API повлияет на перевод всего приложения глобально. Часто это желательно, если приложение одноязычное и выбор языка зависит от локали пользователя. Если требуется локализовать модуль Python или приложению нужно переключать языки на лету, вероятно, следует использовать API на основе классов.2021#### `gettext.bindtextdomain(domain, localedir=None)`2223Привязывает *domain* к каталогу локали *localedir*. Конкретнее, `gettext` будет искать двоичные файлы `.mo` для указанного домена, используя путь (в Unix): `localedir/language/LC_MESSAGES/domain.mo`, где *language* ищется в переменных окружения `LANGUAGE`, `LC_ALL`, `LC_MESSAGES` и `LANG` соответственно.2425Если *localedir* опущен или равен `None`, то возвращается текущая привязка для *domain*. [\[1\]](https://python-all.ru/3.14/library/gettext.html#id3)2627#### `gettext.textdomain(domain=None)`2829Изменяет или запрашивает текущий глобальный домен. Если *domain* равен `None`, возвращается текущий глобальный домен; в противном случае глобальный домен устанавливается в *domain*, который и возвращается.3031#### `gettext.gettext(message, /)`3233Возвращает локализованный перевод *message* на основе текущего глобального домена, языка и каталога локали. Эта функция обычно имеет псевдоним `_()` в локальном пространстве имён (см. примеры ниже).3435#### `gettext.dgettext(domain, message, /)`3637Как [`gettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.gettext), но ищет сообщение в указанном *domain*.3839#### `gettext.ngettext(singular, plural, n, /)`4041Как [`gettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.gettext), но учитывает формы множественного числа. Если перевод найден, применяет формулу множественного числа к *n* и возвращает результирующее сообщение (в некоторых языках более двух форм множественного числа). Если перевод не найден, возвращает *singular*, если *n* равно 1; в противном случае возвращает *plural*.4243Формула множественного числа берётся из заголовка каталога. Это выражение на C или Python со свободной переменной *n*; выражение вычисляет индекс формы множественного числа в каталоге. См. [документацию GNU gettext](https://python-all.ru/3.14/library/gettext.html) для точного синтаксиса, используемого в файлах `.po`, и формулы для различных языков.4445#### `gettext.dngettext(domain, singular, plural, n, /)`4647Как [`ngettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.ngettext), но ищет сообщение в указанном *domain*.4849#### `gettext.pgettext(context, message, /)`5051#### `gettext.dpgettext(domain, context, message, /)`5253#### `gettext.npgettext(context, singular, plural, n, /)`5455#### `gettext.dnpgettext(domain, context, singular, plural, n, /)`5657Аналогично соответствующим функциям без `p` в префиксе (то есть [`gettext()`](https://python-all.ru/3.14/library/gettext.html#module-gettext), [`dgettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.dgettext), [`ngettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.ngettext), [`dngettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.dngettext)), но перевод ограничен заданным *context* сообщения.5859Добавлено в версии 3.8.6061Обратите внимание, что GNU **gettext** также определяет метод `dcgettext()`, но он был признан бесполезным и на данный момент не реализован.6263Вот пример типичного использования этого API:6465```python66import gettext67gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')68gettext.textdomain('myapplication')69_ = gettext.gettext70# ...71print(_('This is a translatable string.'))72```7374## API на основе классов7576API на основе классов модуля `gettext` даёт больше гибкости и удобства, чем API GNU **gettext**. Это рекомендуемый способ локализации приложений и модулей Python. `gettext` определяет класс [`GNUTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.GNUTranslations), который реализует разбор файлов формата GNU `.mo` и имеет методы для возврата строк. Экземпляры этого класса также могут устанавливать себя во встроенное пространство имён в качестве функции `_()`.7778#### `gettext.find(domain, localedir=None, languages=None, all=False)`7980Эта функция реализует стандартный алгоритм поиска файла `.mo`. Она принимает *domain*, идентичный тому, что принимает [`textdomain()`](https://python-all.ru/3.14/library/gettext.html#gettext.textdomain). Необязательный параметр *localedir* – как в [`bindtextdomain()`](https://python-all.ru/3.14/library/gettext.html#gettext.bindtextdomain). Необязательный *languages* – это список строк, где каждая строка – код языка.8182Если *localedir* не указан, используется системный каталог локали по умолчанию. [\[2\]](https://python-all.ru/3.14/library/gettext.html#id4) Если *languages* не указан, то проверяются следующие переменные окружения: `LANGUAGE`, `LC_ALL`, `LC_MESSAGES` и `LANG`. Для переменной *languages* используется первая из них, возвращающая непустое значение. Переменные окружения должны содержать разделённый двоеточиями список языков; он будет разбит по двоеточиям для получения ожидаемого списка кодов языков.8384`find()` затем расширяет и нормализует языки, а затем перебирает их в поисках существующего файла, построенного из следующих компонентов:8586`localedir/language/LC_MESSAGES/domain.mo`8788Первое существующее имя файла возвращается `find()`. Если такого файла не найдено, возвращается `None`. Если указан *all*, возвращается список всех имён файлов в том порядке, в котором они встречаются в списке языков или в переменных окружения.8990#### `gettext.translation(domain, localedir=None, languages=None, class_=None, fallback=False)`9192Возвращает экземпляр `*Translations` на основе *domain*, *localedir* и *languages*, которые сначала передаются в [`find()`](https://python-all.ru/3.14/library/gettext.html#gettext.find) для получения списка соответствующих путей к файлам `.mo`. Экземпляры с одинаковыми именами файлов `.mo` кэшируются. Фактически создаётся класс *class\_*, если он указан, иначе [`GNUTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.GNUTranslations). Конструктор класса должен принимать единственный аргумент [файловый объект](https://python-all.ru/3.14/glossary.html#term-file-object).9394Если найдено несколько файлов, последующие файлы используются как запасные для предыдущих. Чтобы иметь возможность задать запасной вариант, [`copy.copy()`](https://python-all.ru/3.14/library/copy.html#copy.copy) используется для клонирования каждого объекта перевода из кэша; фактические данные экземпляра по-прежнему являются общими с кэшем.9596Если файл `.mo` не найден, эта функция вызывает [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError), если *fallback* имеет значение false (по умолчанию), и возвращает экземпляр [`NullTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations), если *fallback* имеет значение true.9798Изменено в версии 3.3: [`IOError`](https://python-all.ru/3.14/library/exceptions.html#IOError) раньше возбуждалось, теперь это псевдоним [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError).99100Изменено в версии 3.11: параметр *codeset* удалён.101102#### `gettext.install(domain, localedir=None, *, names=None)`103104Эта функция устанавливает `_()` в пространстве имён встроенных функций Python, на основе *domain* и *localedir*, которые передаются в функцию [`translation()`](https://python-all.ru/3.14/library/gettext.html#gettext.translation).105106Описание параметра *names* см. в описании метода [`install()`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations.install) объекта перевода.107108Как показано ниже, строки в приложении, предназначенные для перевода, обычно помечаются обёртыванием их в вызов функции `_()`, например:109110```python111print(_('This string will be translated.'))112```113114Для удобства функцию `_()` устанавливают в пространство имён встроенных функций Python, чтобы она была легко доступна во всех модулях приложения.115116Изменено в версии 3.11: *names* теперь является параметром только по ключевому слову.117118### Класс [`NullTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations)119120Классы перевода – это то, что фактически реализует перевод строк сообщений исходного файла в переведённые строки сообщений. Базовый класс, используемый всеми классами перевода, – [`NullTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations); он предоставляет базовый интерфейс, который можно использовать для написания собственных специализированных классов перевода. Ниже приведены методы `NullTranslations`:121122#### `class gettext.NullTranslations(fp=None)`123124Принимает необязательный [файловый объект](https://python-all.ru/3.14/glossary.html#term-file-object) *fp*, который игнорируется базовым классом. Инициализирует «защищённые» переменные экземпляра *\_info* и *\_charset*, которые устанавливаются производными классами, а также *\_fallback*, которая устанавливается через [`add_fallback()`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations.add_fallback). Затем вызывает `self._parse(fp)`, если *fp* не равен `None`.125126#### `_parse(fp)`127128В базовом классе это метод-заглушка; он принимает файловый объект *fp* и читает данные из файла, инициализируя свой каталог сообщений. Если у вас есть неподдерживаемый формат файла каталога сообщений, следует переопределить этот метод для разбора вашего формата.129130#### `add_fallback(fallback)`131132Добавляет *fallback* в качестве запасного объекта для текущего объекта перевода. Объект перевода должен обращаться к запасному объекту, если он не может предоставить перевод для данного сообщения.133134#### `gettext(message, /)`135136Если был установлен запасной объект, перенаправить `gettext()` к нему. В противном случае вернуть *message*. Переопределяется в производных классах.137138#### `ngettext(singular, plural, n, /)`139140Если был установлен запасной объект, перенаправить `ngettext()` к нему. В противном случае вернуть *singular*, если *n* равен 1; иначе вернуть *plural*. Переопределяется в производных классах.141142#### `pgettext(context, message, /)`143144Если был установлен запасной объект, перенаправить `pgettext()` к нему. В противном случае вернуть переведённое сообщение. Переопределяется в производных классах.145146Добавлено в версии 3.8.147148#### `npgettext(context, singular, plural, n, /)`149150Если был установлен запасной объект, перенаправить `npgettext()` к нему. В противном случае вернуть переведённое сообщение. Переопределяется в производных классах.151152Добавлено в версии 3.8.153154#### `info()`155156Возвращает словарь, содержащий метаданные из файла каталога сообщений.157158#### `charset()`159160Возвращает кодировку файла каталога сообщений.161162#### `install(names=None)`163164Этот метод устанавливает [`gettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations.gettext) во встроенное пространство имён, связывая его с `_`.165166Если задан параметр *names*, он должен быть последовательностью, содержащей имена функций, которые требуется установить во встроенное пространство имён в дополнение к `_()`. Поддерживаемые имена: `'gettext'`, `'ngettext'`, `'pgettext'` и `'npgettext'`.167168Обратите внимание, что это лишь один из способов, хоть и самый удобный, сделать функцию `_()` доступной в приложении. Поскольку это влияет на всё приложение глобально, и в особенности на встроенное пространство имён, локализованные модули никогда не должны устанавливать `_()`. Вместо этого им следует использовать следующий код, чтобы сделать `_()` доступной в своём модуле:169170```python171import gettext172t = gettext.translation('mymodule', ...)173_ = t.gettext174```175176Это помещает `_()` только в глобальное пространство имён модуля и поэтому влияет только на вызовы внутри этого модуля.177178Изменено в версии 3.8: Добавлены `'pgettext'` и `'npgettext'`.179180### Класс [`GNUTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.GNUTranslations)181182Модуль `gettext` предоставляет один дополнительный класс, производный от [`NullTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations): [`GNUTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.GNUTranslations). Этот класс переопределяет `_parse()`, чтобы обеспечить чтение файлов `.mo` в формате GNU **gettext** как в формате big-endian, так и little-endian.183184[`GNUTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.GNUTranslations) извлекает необязательные метаданные из каталога переводов. По соглашению в GNU **gettext** метаданные включаются как перевод пустой строки. Эти метаданные представлены в стиле [**RFC 822**](https://python-all.ru/3.14/library/gettext.html) парами `key: value` и должны содержать ключ `Project-Id-Version`. Если найден ключ `Content-Type`, то свойство `charset` используется для инициализации «защищённой» переменной экземпляра `_charset`, по умолчанию равной `None`, если не найдено. Если указана кодировка charset, то все идентификаторы сообщений и строки сообщений, прочитанные из каталога, преобразуются в Unicode с использованием этой кодировки; в противном случае предполагается ASCII.185186Поскольку идентификаторы сообщений также читаются как строки Unicode, все методы `*gettext()` будут считать идентификаторы сообщений строками Unicode, а не байтовыми строками.187188Весь набор пар ключ/значение помещается в словарь и устанавливается как «защищённая» переменная экземпляра `_info`.189190Если магическое число файла `.mo` недействительно, основной номер версии неожиданный, или возникают другие проблемы при чтении файла, создание экземпляра класса [`GNUTranslations`](https://python-all.ru/3.14/library/gettext.html#gettext.GNUTranslations) может вызвать исключение [`OSError`](https://python-all.ru/3.14/library/exceptions.html#OSError).191192#### `class gettext.GNUTranslations`193194Следующие методы переопределены из реализации базового класса:195196#### `gettext(message, /)`197198Ищет идентификатор *message* в каталоге и возвращает соответствующую строку сообщения в виде строки Unicode. Если в каталоге нет записи для идентификатора *message* и задан резервный источник (fallback), поиск перенаправляется в метод [`gettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations.gettext) резервного источника. В противном случае возвращается идентификатор *message*.199200#### `ngettext(singular, plural, n, /)`201202Выполняет поиск формы множественного числа по идентификатору сообщения. *singular* используется как идентификатор сообщения для поиска в каталоге, а *n* используется для определения того, какую форму множественного числа использовать. Возвращаемая строка сообщения является строкой Unicode.203204Если идентификатор сообщения не найден в каталоге и указан резервный источник, запрос перенаправляется в метод [`ngettext()`](https://python-all.ru/3.14/library/gettext.html#gettext.NullTranslations.ngettext) резервного источника. В противном случае, когда *n* равно 1, возвращается *singular*, а в остальных случаях возвращается *plural*.205206Вот пример:207208```python209n = len(os.listdir('.'))210cat = GNUTranslations(somefile)211message = cat.ngettext(212    'There is %(num)d file in this directory',213    'There are %(num)d files in this directory',214    n) % {'num': n}215```216217#### `pgettext(context, message, /)`218219Ищет идентификаторы *context* и *message* в каталоге и возвращает соответствующую строку сообщения в виде строки Unicode. Если в каталоге нет записи для идентификатора *message* и *context*, и задан резервный источник, поиск перенаправляется в метод `pgettext()` резервного источника. В противном случае возвращается идентификатор *message*.220221Добавлено в версии 3.8.222223#### `npgettext(context, singular, plural, n, /)`224225Выполняет поиск формы множественного числа по идентификатору сообщения. *singular* используется как идентификатор сообщения для поиска в каталоге, а *n* используется для определения того, какую форму множественного числа использовать.226227Если идентификатор сообщения для *context* не найден в каталоге и указан резервный источник, запрос перенаправляется в метод `npgettext()` резервного источника. В противном случае, когда *n* равно 1, возвращается *singular*, а во всех остальных случаях возвращается *plural*.228229Добавлено в версии 3.8.230231### Поддержка каталогов сообщений Solaris232233Операционная система Solaris определяет собственный двоичный формат файлов `.mo`, но, поскольку документации по этому формату найти не удалось, он в настоящее время не поддерживается.234235### Конструктор каталога236237GNOME использует версию модуля `gettext` от James Henstridge, но эта версия имеет несколько другой API. Её задокументированное использование было таким:238239```python240import gettext241cat = gettext.Catalog(domain, localedir)242_ = cat.gettext243print(_('hello world'))244```245246Для совместимости с этим старым модулем функция `Catalog()` является псевдонимом функции [`translation()`](https://python-all.ru/3.14/library/gettext.html#gettext.translation), описанной выше.247248Одно различие между этим модулем и модулем Хенстриджа: его объекты каталога поддерживали доступ через API отображения (mapping API), но, по-видимому, эта возможность не используется и поэтому в настоящее время не поддерживается.249250## Интернационализация программ и модулей251252Интернационализация (I18N) – это процесс, благодаря которому программа начинает работать с несколькими языками. Локализация (L10N) – это адаптация уже интернационализированной программы к местному языку и культурным особенностям. Чтобы добавить в программу на Python поддержку нескольких языков, нужно выполнить следующие шаги:2532541. подготовить программу или модуль, специально помечая переводимые строки2552. запустить набор инструментов над размеченными файлами для создания исходных каталогов сообщений2563. создать языковые переводы каталогов сообщений2574. использовать модуль `gettext` для корректного перевода строк сообщений258259Чтобы подготовить код к интернационализации, нужно просмотреть все строки в своих файлах. Любую строку, которую требуется перевести, следует пометить, обернув её в вызов `_('...')` – то есть в функцию [`_`](https://python-all.ru/3.14/library/gettext.html#module-gettext). Например:260261```python262filename = 'mylog.txt'263message = _('writing a log message')264with open(filename, 'w') as fp:265    fp.write(message)266```267268В этом примере строка `'writing a log message'` помечена как кандидат на перевод, а строки `'mylog.txt'` и `'w'` – нет.269270Существует несколько инструментов для извлечения строк, предназначенных для перевода. Исходная программа GNU **gettext** поддерживала только исходный код на C или C++, но её расширенная версия **xgettext** сканирует код на многих языках, включая Python, чтобы найти строки, помеченные как переводимые. [Babel](https://python-all.ru/3.14/library/gettext.html) – это библиотека интернационализации для Python, в состав которой входит скрипт `pybabel` для извлечения и компиляции каталогов сообщений. Программа Франсуа Пинара **xpot** делает то же самое и доступна как часть его [пакета po-utils](https://python-all.ru/3.14/library/gettext.html).271272(В Python также есть чисто питоновские версии этих программ: **pygettext.py** и **msgfmt.py**; некоторые дистрибутивы Python устанавливают их автоматически. **pygettext.py** похожа на **xgettext**, но понимает только исходный код Python и не умеет работать с другими языками вроде C или C++. **pygettext.py** поддерживает интерфейс командной строки, аналогичный **xgettext**; подробнее о его использовании – в выводе `pygettext.py --help`. **msgfmt.py** двоично совместима с GNU **msgfmt**. С этими двумя программами для интернационализации приложений на Python пакет GNU **gettext** может и не понадобиться.)273274**xgettext**, **pygettext** и похожие инструменты создают файлы `.po` – каталоги сообщений. Это структурированные, человекочитаемые файлы, содержащие каждую помеченную строку из исходного кода вместе с местом для переведённых версий этих строк.275276Копии этих файлов `.po` затем передаются переводчикам-людям, которые пишут переводы для каждого поддерживаемого естественного языка. Они возвращают готовые языковые версии в виде файла `<language-name>.po`, который компилируется в машинно-читаемый двоичный каталог `.mo` с помощью программы **msgfmt**. Файлы `.mo` используются модулем `gettext` для непосредственного перевода во время выполнения.277278То, как используется модуль `gettext` в коде, зависит от того, интернационализируется ли один модуль или всё приложение. В следующих двух разделах будет рассмотрен каждый случай.279280### Локализация модуля281282Если вы локализуете свой модуль, нужно соблюдать осторожность, чтобы не вносить глобальные изменения, например во встроенное пространство имён. Следует использовать не API GNU **gettext**, а API на основе классов.283284Допустим, модуль называется «spam», а его файлы перевода `.mo` для разных естественных языков лежат в каталоге `/usr/share/locale` в формате GNU **gettext**. Вот что нужно поместить в начало модуля:285286```python287import gettext288t = gettext.translation('spam', '/usr/share/locale')289_ = t.gettext290```291292### Локализация приложения293294Если вы локализуете приложение, можно установить функцию `_()` глобально во встроенное пространство имён, обычно в главном файле приложения. Тогда во всех файлах приложения можно будет использовать `_('...')` без явной установки в каждом из них.295296В простейшем случае нужно добавить в главный файл приложения следующий код:297298```python299import gettext300gettext.install('myapplication')301```302303Если требуется указать каталог с языковыми файлами, можно передать его в функцию [`install()`](https://python-all.ru/3.14/library/gettext.html#gettext.install):304305```python306import gettext307gettext.install('myapplication', '/usr/share/locale')308```309310### Переключение языков на лету311312Если программа должна одновременно поддерживать много языков, можно создать несколько экземпляров перевода и переключаться между ними явно:313314```python315import gettext316317lang1 = gettext.translation('myapplication', languages=['en'])318lang2 = gettext.translation('myapplication', languages=['fr'])319lang3 = gettext.translation('myapplication', languages=['de'])320321# начните с использования language1322lang1.install()323324# ... проходит время, пользователь выбирает language 2325lang2.install()326327# ... проходит ещё больше времени, пользователь выбирает language 3328lang3.install()329```330331### Отложенные переводы332333В большинстве случаев строки переводятся там же, где и пишутся. Однако иногда нужно пометить строки для перевода, но отложить собственно перевод на потом. Классический пример:334335```python336animals = ['mollusk',337           'albatross',338           'rat',339           'penguin',340           'python', ]341# ...342for a in animals:343    print(a)344```345346Здесь требуется пометить строки в списке `animals` как переводимые, но на самом деле переводить их нужно только при выводе на печать.347348Вот один из способов справиться с этим:349350```python351def _(message): return message352353animals = [_('mollusk'),354           _('albatross'),355           _('rat'),356           _('penguin'),357           _('python'), ]358359del _360361# ...362for a in animals:363    print(_(a))364```365366Это работает, потому что фиктивное определение `_()` просто возвращает строку без изменений. И это фиктивное определение временно переопределяет любое определение `_()` во встроенном пространстве имён (до команды [`del`](https://python-all.ru/3.14/reference/simple_stmts.html#del)). Однако будьте осторожны, если во вложенном пространстве имён уже есть определение `_()`.367368Обратите внимание, что второе использование `_()` не будет определено программой **gettext** как переводимое, поскольку параметр не является строковым литералом.369370Другой способ – следующий пример:371372```python373def N_(message): return message374375animals = [N_('mollusk'),376           N_('albatross'),377           N_('rat'),378           N_('penguin'),379           N_('python'), ]380381# ...382for a in animals:383    print(_(a))384```385386В этом случае переводимые строки помечаются функцией `N_()`, которая не конфликтует ни с одним определением `_()`. Однако придётся научить программу извлечения сообщений искать строки, помеченные `N_()`. **xgettext**, **pygettext**, `pybabel extract` и **xpot** – все они поддерживают это через ключ командной строки `-k`. Выбор `N_()` здесь совершенно произволен; с тем же успехом можно было использовать `MarkThisStringForTranslation()`.387388## Благодарности389390Следующие люди внесли код, отзывы, предложения по оформлению, предыдущие реализации и ценный опыт в создание этого модуля:391392- Peter Funk393- James Henstridge394- Juan David Ibáñez Palomar395- Marc-André Lemburg396- Martin von Löwis397- François Pinard398- Barry Warsaw399- Gustavo Niemeyer400401Сноски402403\[[1](https://python-all.ru/3.14/library/gettext.html#id1)\]404405Каталог локали по умолчанию зависит от системы; например, в Red Hat Linux он находится в `/usr/share/locale`, а в Solaris – в `/usr/lib/locale`. Модуль `gettext` не пытается поддерживать эти системно-зависимые значения по умолчанию; вместо этого его значение по умолчанию – `sys.base_prefix/share/locale` (см. [`sys.base_prefix`](https://python-all.ru/3.14/library/sys.html#sys.base_prefix)). По этой причине всегда лучше вызывать [`bindtextdomain()`](https://python-all.ru/3.14/library/gettext.html#gettext.bindtextdomain) с явным абсолютным путём в начале приложения.406407\[[2](https://python-all.ru/3.14/library/gettext.html#id2)\]408409См. сноску для [`bindtextdomain()`](https://python-all.ru/3.14/library/gettext.html#gettext.bindtextdomain) выше.410