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
Динамическое переключение языков в приложении:
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
Комбинирование с форматированием строк:
import gettext
gettext.install('myapp', 'locales')
_ = gettext.gettext
name = "Алексей"
print(_("Hello, %s!") % name) # Старый стиль
print(_("Hello, {name}!").format(name=name)) # Новый стильПривет, Алексей! Привет, Алексей!
Использование с классами и модулями:
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())Добро пожаловать, Мария