Gettext: примеры (PHP)

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

Позволяет указать домен перевода напрямую: dgettext('domain', 'message'). Используется при работе с несколькими доменами.

Функция ngettext

Обрабатывает множественные формы: ngettext('single', 'plural', $count). Возвращает правильную форму в зависимости от числа.

Библиотека Symfony Translation

Компонент Symfony Translation предоставляет более гибкую систему с поддержкой различных форматов файлов (YAML, XML, JSON). Подходит для крупных проектов.

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

Python модуль gettext
import gettext
gettext.bindtextdomain('app', './locale')
gettext.textdomain('app')
tr = gettext.gettext
print(tr('Hello'))
Привет
JavaScript библиотека i18next
i18next.init({
  lng: 'ru',
  resources: {
    ru: { translation: { hello: 'Привет' } }
  }
});
console.log(i18next.t('hello'));
Привет
MySQL функции

В MySQL отсутствуют встроенные функции перевода, но можно использовать таблицы переводов с оператором JOIN.

Распространённые ошибки

Неправильная настройка локали
// Не установлена локаль
bindtextdomain('app', './locale');
textdomain('app');
echo _('Hello');
Hello
Отсутствие файлов перевода

Система возвращает оригинальные строки, если файлы .mo не найдены в указанном пути.

Кодировка файлов

Файлы .po и .mo должны использовать UTF-8 для корректного отображения символов.

Изменения в новых версиях PHP

PHP 8.0 и выше

В PHP 8 не было внесено значительных изменений в работу gettext. Функция сохранила обратную совместимость с предыдущими версиями.

Предстоящие изменения

В будущих версиях планируется улучшение обработки ошибок при загрузке файлов перевода.

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

Работа с контекстами

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

Пример php
echo pgettext('menu', 'Open');
echo pgettext('file', 'Open');
Открыть (меню)
Открыть (файл)
Множественное число с ngettext
Пример php
$count = 5;
echo ngettext('%d apple', '%d apples', $count);
5 apples
Динамический выбор домена
Пример php
function translate($domain, $message) {
  return dgettext($domain, $message);
}
echo translate('admin', 'Settings');
Настройки
Комбинирование с sprintf
Пример php
echo sprintf(_('Welcome, %s'), $username);
Добро пожаловать, Иван

PHP gettext function comments

En
Gettext Lookup a message in the current domain