Gettext

Коротко

Стандарт перевода программ из проекта GNU, на котором построена локализация WordPress: строки в коде помечают функциями, а перевод берут из языковых файлов.

Что такое «Gettext»

Gettext появился задолго до WordPress, в мире Unix-программ, и WordPress перенял его схему целиком. Разработчик пишет интерфейс на английском и оборачивает каждую видимую строку в функцию перевода. Специальная утилита собирает такие строки в шаблон, переводчик заполняет его, а при работе сайта WordPress подставляет вариант для выбранного языка. Это основа локализации ядра, тем и плагинов.

Функции и текстовый домен

Основные функции: __() возвращает перевод, _e() сразу выводит его, _x() добавляет контекст для двусмысленных слов, _n() выбирает форму множественного числа. Для безопасного вывода в HTML есть варианты esc_html__() и esc_attr_e(). Второй аргумент — текстовый домен, собственное имя плагина или темы, чтобы их переводы не смешивались.

printf(
    _n( '%d item in cart', '%d items in cart', $count, 'myshop' ),
    $count
);

В русском три формы множественного числа («1 товар», «2 товара», «5 товаров»), и правило их выбора хранится в самом файле перевода. Поэтому в коде достаточно английских вариантов для единственного и множественного числа, а русских форм может быть три.

Какие файлы участвуют

  • .pot — шаблон со всеми строками, его генерирует, например, команда wp i18n make-pot из WP-CLI;
  • .po — текстовый файл с переводами, его правят в Poedit или плагине Loco Translate;
  • .mo — скомпилированная версия, которую читает WordPress; в новых версиях ядро умеет загружать и более быстрые PHP-файлы .l10n.php.

Переводы с WordPress.org попадают в wp-content/languages/ и обновляются автоматически, поэтому свои правки чужого плагина там затрутся при следующем обновлении.

Подмена строки без правки плагина

Ядро пропускает каждую переведённую строку через одноимённый фильтр gettext. Через него можно заменить неудачную надпись в чужой теме, проверив текстовый домен и исходный текст. Пользоваться этим стоит точечно: фильтр вызывается для каждой строки страницы, и тяжёлая логика в нём замедляет сайт. Подробнее о подготовке кода к переводу — в статье об интернационализации.

Обновлено:

Все термины раздела «WordPress»

Что будем искать? Например,Продвижение