Gettext: примеры (PHP)
gettext(string $message): stringОсновы функции gettext в PHP
Функция gettext является частью системы интернационализации GNU gettext и используется в PHP для перевода текстовых строк. Она осуществляет поиск перевода строки в текущем домене перевода и возвращает переведённый вариант, если он существует.
Функция применяется в проектах, требующих поддержки нескольких языков. Она позволяет отделить текстовые данные от кода программы, упрощая локализацию.
Основной синтаксис: gettext(string $message). Функция принимает один обязательный параметр:
- $message - строка для перевода, которая используется как ключ в файлах перевода.
Существует также альтернативный синтаксис: _(string $message), где функция вызывается через псевдоним.
Базовые примеры использования
Предварительная настройка локали и домена перевода:
putenv('LC_ALL=ru_RU.UTF-8');
setlocale(LC_ALL, 'ru_RU.UTF-8');
bindtextdomain('messages', './locale');
textdomain('messages');
echo gettext('Hello world');
// или сокращённая форма:
echo _('Hello world');Привет мир
Функция возвращает оригинальную строку, если перевод отсутствует:
echo gettext('Untranslated string');Untranslated string
Альтернативные решения в PHP
Позволяет указать домен перевода напрямую: dgettext('domain', 'message'). Используется при работе с несколькими доменами.
Обрабатывает множественные формы: ngettext('single', 'plural', $count). Возвращает правильную форму в зависимости от числа.
Компонент Symfony Translation предоставляет более гибкую систему с поддержкой различных форматов файлов (YAML, XML, JSON). Подходит для крупных проектов.
Реализации в других языках
import gettext
gettext.bindtextdomain('app', './locale')
gettext.textdomain('app')
tr = gettext.gettext
print(tr('Hello'))Привет
i18next.init({
lng: 'ru',
resources: {
ru: { translation: { hello: 'Привет' } }
}
});
console.log(i18next.t('hello'));Привет
В MySQL отсутствуют встроенные функции перевода, но можно использовать таблицы переводов с оператором JOIN.
Распространённые ошибки
// Не установлена локаль
bindtextdomain('app', './locale');
textdomain('app');
echo _('Hello');Hello
Система возвращает оригинальные строки, если файлы .mo не найдены в указанном пути.
Файлы .po и .mo должны использовать UTF-8 для корректного отображения символов.
Изменения в новых версиях PHP
В PHP 8 не было внесено значительных изменений в работу gettext. Функция сохранила обратную совместимость с предыдущими версиями.
В будущих версиях планируется улучшение обработки ошибок при загрузке файлов перевода.
Расширенные примеры применения
Использование pgettext для указания контекста перевода:
echo pgettext('menu', 'Open');
echo pgettext('file', 'Open');Открыть (меню) Открыть (файл)
$count = 5;
echo ngettext('%d apple', '%d apples', $count);5 apples
function translate($domain, $message) {
return dgettext($domain, $message);
}
echo translate('admin', 'Settings');Настройки
echo sprintf(_('Welcome, %s'), $username);Добро пожаловать, Иван