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

Использование функции gettext.gettext для перевода строк в Python
Раздел: Интернационализация, Локализация
gettext.gettext(message: str): str

Основные сведения о функции gettext.gettext

Функция gettext.gettext() представляет собой основной метод интернационализации (i18n) в языке Python. Она предназначена для перевода текстовых строк на различные языки. Применение функции наблюдается в проектах, требующих поддержки нескольких языков интерфейса.

Механизм работы основан на поиске переданной строки в предварительно подготовленных переводах (файлах .po/.mo). Если перевод обнаружен, возвращается его значение. В противном случае возвращается исходная строка без изменений.

Функция принимает один обязательный аргумент:

  • message (str) - текстовая строка, которую требуется перевести.

Возвращаемое значение:

  • Переведенная строка (str), если перевод существует в текущем каталоге переводов.
  • Исходная строка (str), если соответствие не найдено.

Примеры использования gettext.gettext

Базовый пример с установкой перевода:

import gettext

gettext.bindtextdomain('myapp', 'locales')
gettext.textdomain('myapp')
_ = gettext.gettext

print(_("Hello, world!"))
print(_("Welcome to the application."))
# Если в каталоге locales существует перевод для "Hello, world!":
Привет, мир!
# Если перевода для второй фразы нет:
Welcome to the application.

Непосредственный вызов без создания алиаса:

import gettext

ru = gettext.translation('myapp', 'locales', ['ru'])
ru.install()

print(gettext.gettext("File not found"))
Файл не найден

Альтернативные функции в Python

Модуль gettext содержит несколько специализированных функций:

  • gettext.ngettext() - обработка множественных чисел. Принимает три аргумента: единственное число, множественное число и числовое значение для выбора формы.
  • gettext.pgettext() - контекстный перевод. Первый параметр - контекст, второй - строка для перевода. Позволяет различать одинаковые строки в разных контекстах.
  • gettext.npgettext() - комбинация контекста и множественного числа.

Функцию pgettext целесообразно применять при наличии омонимичных строк, требующих разных переводов. Функция ngettext незаменима для корректного согласования с числительными в различных языках.

Реализации интернационализации в других языках

В JavaScript распространена библиотека i18next:

// Установка: npm install i18next
i18next.init({
  lng: 'ru',
  resources: {
    ru: { translation: { "Hello": "Привет" } }
  }
});
console.log(i18next.t('Hello'));
Привет

В Java используют ResourceBundle:

ResourceBundle bundle = ResourceBundle.getBundle("Messages", new Locale("ru"));
String text = bundle.getString("hello");
System.out.println(text);
Привет

В PHP встроены функции gettext:

bindtextdomain("myapp", "./locale");
textdomain("myapp");
echo gettext("Hello");
Привет

Основное отличие Python-реализации - обязательная предварительная установка каталога переводов методом install() или прямая работа с объектом translation.

Типичные ошибки при работе с gettext.gettext

Отсутствие предварительной установки перевода:

import gettext

print(gettext.gettext("Test string"))  # Не установлен домен перевода
Test string  # Всегда возвращает исходную строку

Неверный путь к каталогу переводов:

import gettext

gettext.bindtextdomain('myapp', '/wrong/path')
gettext.textdomain('myapp')
_ = gettext.gettext
print(_("Hello"))
Hello  # Переводы не загружены, возвращается оригинал

Использование изменяемых строк как ключей:

import gettext
from datetime import datetime

_ = gettext.gettext
dynamic_msg = f"Current date: {datetime.now()}"
print(_(dynamic_msg))  # Динамическая строка не подлежит переводу
Current date: 2023-10-05 14:30:00  # Невозможно найти в файлах перевода

Изменения в последних версиях Python

В Python 3.8 в модуль gettext добавлена функция gettext.npgettext() для работы с контекстными сообщениями во множественном числе. Также улучшена обработка кодировок в файлах .mo.

В Python 3.11 оптимизирована скорость загрузки каталогов переводов, особенно заметная при работе с большим количеством языковых файлов. Изменения не затрагивают сигнатуру основной функции gettext.

Расширенные примеры применения gettext.gettext

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

Пример python
import gettext

def set_language(lang_code):
    try:
        trans = gettext.translation('app', 'locales', [lang_code])
        trans.install()
    except FileNotFoundError:
        gettext.NullTranslations().install()

set_language('es')
_ = gettext.gettext
print(_("Good morning"))

set_language('fr')
_ = gettext.gettext
print(_("Good morning"))
Buenos días
Bonjour

Комбинирование с форматированием строк:

Пример python
import gettext
gettext.install('myapp', 'locales')
_ = gettext.gettext

name = "Алексей"
print(_("Hello, %s!") % name)  # Старый стиль
print(_("Hello, {name}!").format(name=name))  # Новый стиль
Привет, Алексей!
Привет, Алексей!

Использование с классами и модулями:

Пример python
import gettext
_ = gettext.gettext

class UserGreeting:
    def __init__(self, username):
        self.username = username
    
    def welcome(self):
        return _("Welcome, {user}").format(user=self.username)

ru_trans = gettext.translation('app', 'locales', ['ru'])
ru_trans.install()

greeting = UserGreeting("Мария")
print(greeting.welcome())
Добро пожаловать, Мария

питон gettext.gettext function comments

En
Gettext.gettext Translate message, return localized string