Gettext.install: примеры (PYTHON)

Использование 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.

Расширенные примеры использования

Пример с переключением языка во время выполнения:

Пример python
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
Привет

Пример с использованием множественного числа:

Пример python
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+):

Пример python
import gettext
gettext.install('app', localedir='locale', names=('pgettext', 'npgettext'))
# 'menu' - контекст, 'File' - строка для перевода
print(pgettext('menu', 'File'))
print(pgettext('button', 'File'))  # Другой контекст
Файл  # Перевод для меню
Файл_кнопка  # Перевод для кнопки (пример)

Пример с кастомной функцией перевода:

Пример python
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  # Перевод приведен к верхнему регистру

Пример использования без глобальной установки (альтернативный подход):

Пример python
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 - глобальная установка функции _(), что упрощает использование, но может приводить к конфликтам.

питон gettext.install function comments

En
Gettext.install Install _() in Python's builtins namespace