Gettext.install: примеры (PYTHON)
gettext.install(domain: str, localedir: str = None, codeset: str = None): NoneОписание функции gettext.install
Функция gettext.install модуля gettext в Python предназначена для глобальной установки функции перевода в пространство имен встроенных функций. Она упрощает интернационализацию приложений, добавляя функцию _() в модуль builtins, делая её доступной во всех модулях программы без необходимости импорта.
Основное использование связано с установкой механизма перевода строк на основе указанного домена и каталога с переводами. После вызова функция _() становится доступной глобально для перевода строковых литералов.
Аргументы функции:
domain(строка) - имя домена перевода (файла .mo). Значение по умолчанию: 'gettext'.localedir(строка или None) - путь к каталогу, содержащему подкаталоги с переводами (например, 'locale'). Значение по умолчанию: None (поиск в стандартных местах).codeset(строка или None) - кодировка для перевода. Значение по умолчанию: None (используется системная кодировка).names(кортеж строк или None) - имена функций для установки. Значение по умолчанию: ('_',). Может включать 'gettext', 'ngettext', 'lgettext', 'lngettext'.
Функция не возвращает значений. Её действие заключается в установке указанных функций в модуль builtins. При установке только '_' она фактически присваивает builtins._ = gettext.gettext (или gettext.ngettext если переданы два аргумента).
Примеры использования gettext.install
Простой пример установки перевода:
import gettext
gettext.install('myapp', localedir='locale')
print(_('Hello World'))# Результат зависит от наличия перевода. # Если перевод для текущей локали существует, выводится перевод. # Иначе выводится исходная строка 'Hello World'.
Пример с установкой нескольких функций:
import gettext
gettext.install('myapp', localedir='locale', names=('gettext', 'ngettext'))
print(gettext('Hello'))
print(ngettext('one file', '%d files', 5))Hello 5 files
Пример с указанием кодировки (актуально для Python 2, в Python 3 обычно не требуется):
import gettext
gettext.install('app', localedir='locale', codeset='utf-8')
print(_('Привет'))Привет
Похожие функции в Python
gettext.translation() - создает объект перевода для конкретного домена и локали, позволяя более гибко управлять переводами, например для нескольких языков одновременно. Возвращает объект GNUTranslations. Предпочтительнее использовать, когда нужен контроль над объектом перевода, например для переключения языков в runtime.
gettext.gettext() - базовая функция перевода для одного домена без глобальной установки. Требует явного вызова или присваивания. Подходит для модулей, где нежелательно изменять глобальное пространство имен.
gettext.ngettext() - функция для перевода с учетом множественного числа. Используется когда количество элементов влияет на форму перевода. Часто устанавливается через параметр names в install().
gettext.pgettext() и gettext.npgettext() - функции для контекстного перевода, где одна строка может иметь разные значения в зависимости от контекста. Появились в Python 3.8. Предпочтительны для избежания неоднозначностей в переводе.
Типичные ошибки при использовании
Ошибка отсутствия файлов перевода: если указан неверный localedir или отсутствуют файлы .mo, функция вернет исходные строки без ошибки.
import gettext
gettext.install('app', localedir='wrong_path')
print(_('Hello')) # Файл перевода не найденHello # Выводится исходная строка
Конфликт имен: установка функции _() может перезаписать другую функцию с тем же именем в builtins.
import builtins
builtins._ = lambda: 'existing'
import gettext
gettext.install('app')
print(_()) # Теперь это функция перевода# Вывод зависит от перевода строки '' # Может вернуть пустую строку или ошибку
Проблемы с кодировкой в Python 2: если не указать codeset, могут возникнуть ошибки с не-ASCII символами.
# Python 2
gettext.install('app')
print(_('Café')) # Может вызвать UnicodeDecodeError# Ошибка или некорректный вывод
Ошибка при использовании с динамическими строками: функция предназначена для строковых литералов, динамические строки могут не переводиться.
import gettext
gettext.install('app')
dynamic_string = 'Hello'
print(_(dynamic_string)) # Перевод может не сработатьHello # Файл перевода ищет ключ 'Hello'
Изменения в последних версиях Python
В Python 3.8 добавлены функции pgettext() и npgettext() для контекстного перевода. Их можно установить через параметр names в install().
В Python 3.11 улучшена обработка ошибок при загрузке файлов перевода. Некритичные ошибки (например, отсутствие .mo файла) не вызывают исключений, а приводят к использованию исходных строк.
Параметр codeset в Python 3 стал менее актуальным, так как строки по умолчанию используют Unicode. В Python 2 он был необходим для корректного отображения переведенных строк.
Начиная с Python 3.5, функция install() поддерживает установку функций lgettext и lngettext (возвращают bytes) через параметр names.
Расширенные примеры использования
Пример с переключением языка во время выполнения:
import gettext, locale
# Устанавливаем начальный язык
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
gettext.install('app', localedir='locale')
print(_('Hello'))
# Меняем язык
locale.setlocale(locale.LC_ALL, 'ru_RU.UTF-8')
gettext.translation('app', localedir='locale', languages=['ru']).install()
print(_('Hello'))Hello Привет
Пример с использованием множественного числа:
import gettext
gettext.install('app', localedir='locale', names=('_', 'ngettext'))
print(ngettext('%(num)d file', '%(num)d files', 1) % {'num': 1})
print(ngettext('%(num)d file', '%(num)d files', 5) % {'num': 5})1 file 5 files
Пример с контекстным переводом (Python 3.8+):
import gettext
gettext.install('app', localedir='locale', names=('pgettext', 'npgettext'))
# 'menu' - контекст, 'File' - строка для перевода
print(pgettext('menu', 'File'))
print(pgettext('button', 'File')) # Другой контекстФайл # Перевод для меню Файл_кнопка # Перевод для кнопки (пример)
Пример с кастомной функцией перевода:
import gettext, builtins
gettext.install('app')
# Сохраняем оригинальную функцию
original_gettext = builtins._
# Декорируем её
def custom_gettext(s):
result = original_gettext(s)
return result.upper() if result else result
builtins._ = custom_gettext
print(_('hello world'))HELLO WORLD # Перевод приведен к верхнему регистру
Пример использования без глобальной установки (альтернативный подход):
import gettext
t = gettext.translation('app', localedir='locale', fallback=True)
_ = t.gettext
print(_('Hello')) # Работает только в текущем модулеПривет
Аналоги функции в других языках программирования
В JavaScript (i18next): библиотека i18next предоставляет аналогичный механизм с функцией t(). Требует настройки и загрузки ресурсов.
// Установка и использование
i18next.init({ lng: 'ru', resources: { ru: { translation: { hello: 'Привет' } } } });
console.log(i18next.t('hello'));Привет
В PHP: функция gettext() работает с системной библиотекой gettext. Требует настройки локали и загрузки доменов.
// Установка домена
setlocale(LC_ALL, 'ru_RU.utf8');
bindtextdomain('myapp', './locale');
textdomain('myapp');
echo gettext('Hello');Привет
В Java (ResourceBundle): используется для локализации через файлы свойств, без глобальной функции перевода.
// Загрузка ресурсов
ResourceBundle bundle = ResourceBundle.getBundle("Messages", new Locale("ru"));
String hello = bundle.getString("hello");
System.out.println(hello);Привет
В Golang (gotext): пакет golang.org/x/text/message предоставляет принтеры с поддержкой перевода, без глобальной установки.
// Создание принтера с локалью
p := message.NewPrinter(language.Russian)
p.Printf("Hello")
// Вывод зависит от загруженных каталогов переводаПривет
Основное отличие Python - глобальная установка функции _(), что упрощает использование, но может приводить к конфликтам.