Локализация в шаблонах WordPress.
В чем разница между __(), _e(), _x(), и _ex()?

Русификация модулей и шаблонов в WordPress

Оригинал статьи на английском: WordPress Tutorials

Если вы разработчик модулей (plugins) или тем WordPress (ВордПресс), то вам наверняка придется использовать интернационализацию (i18n) во всех выводимых строчках текста. WordPress предлагает несколько функций, которые позволяют использовать шаблоны и модули WordPress на любом языке мира.

  • __()
  • _e()
  • _x()
  • _ex()
  • _n()

В некоторых старых модулях вы можете встретить функцию _c, которая, начиная с версии 2.9 заменена на _x.

Все эти функции возвращают или выводят в браузер строки, на языке, указанном в файле wp-config.php в качестве основного.

В чем же разница между ними?

__() и _e() — простейшие функции.  Первая возвращает переведенную строку, вторая — выводит перевод в браузер командой echo. Все просто, одна строка — один перевод.

Не так просто обстоит дело с функцией _x(). Допустим, на английском одна и то же словосочетание, в двух разных контекстах, имеет различное значение. Это отнюдь не означает, что эти значения в других трех тысячах языков так-же  отображаются одним словосочетанием. В такой ситуации трудности возникнут даже у переводчика Google.

К счастью, создатели ВордПресса предусмотрели решение для таких вариантов — функцию _x. Она имеет дополнительный параметр — $context, определяющий контекст употребления слова.

  • string _x (string $text, string $context, [string $domain = ‘default’])

Просто, не правда ли?

Осталось определить оба значения в файле .po:

msgctxt "test1"
msgid "testing"
msgstr "context1"
msgctxt «test2»
msgid «testing»
msgstr «context2»

msgctxt переведем как «message context» (контекст сообщения).

В результате исполнения кода

  • echo ‘Context: test1 -> ‘ . _x(‘testing’, ‘test1’, ‘test’);
  • echo ‘<br>Context: test2 -> ‘ . _x(‘testing’, ‘test2’, ‘test’);

получим

  • Context: test1 -> context1
  • Context: test2 -> context2

Оставшаяся функция _ex представляет из себя комбинацию функций _e и _x

. Она выводит в браузер перевод, используя контекст.

Если для редактирования файлов .pot вы используете визуальный редактор, учтите, что не все редакторы позволяют определение контекста для функций _x и _ex, и такое определение может уничтожить данные всего файла. Создавайте контекстные определения используя простой текстовый редактор, и вам будет счастье.

И последняя функция _n() возвращает единственное и множественное число для заданной строки.

  • _n( $single, $plural, $number, $domain = ‘default’ )

Если домен не указан в списке $l10n, то в результате сравнения будет возвращено  $plural или $single. Результат фукции обрабатывается фильтром ngettext.

Пример работы _n():

  • $domain = ‘test’;
  • $comment_count = 1;
  • echo _n(‘comment’, ‘comments’, $comment_count, $domain) . ‘<br/>’;
  • $comment_count = 2;
  • echo _n(‘comment’, ‘comments’, $comment_count, $domain);

соответствующий файл немецкой локализации (de_DE) содержит следующие строки:

  • msgid «comment»
  • msgid_plural «comments»
  • msgstr[0] «Kommentar»
  • msgstr[1] «Kommentare»

вывод функции будет следующим:

  • Kommentar
  • Kommentare

— корректное единстванное и множестванное число.

Для вывода числовых значений вы можете использовать sprintf(). Например:

  • $approved = 1;
  • echo sprintf( _n( ‘%s comment approved’, ‘%s comments approved’, $approved, ‘test’ ), $approved);
  • echo ‘<br/>’;
  • $approved = 2;
  • echo sprintf( _n( ‘%s comment approved’, ‘%s comments approved’, $approved, ‘test’ ), $approved );

Или, в упрощенной форме этот код выглядит так:

  • $approved = 1;
  • $text = _n( ‘%s comment approved’, ‘%s comments approved’, $approved, ‘test’ );
  • echo sprintf($text, $approved);
  • echo ‘<br/>’;
  • $approved = 2;
  • $text = _n( ‘%s comment approved’, ‘%s comments approved’, $approved, ‘test’ );
  • echo sprintf($text, $approved);

Сначала получаем корректный перевод множественного или единстванного числа в переменной $text. После чего строка обрабатывается функцийе  sprintf(), которая заменяет «%s» на значение из $approved.

Используя определение

  • msgid «%s comment approved»
  • msgid_plural «%s comments approved»
  • msgstr[0] «%s Kommentar genehmigt»
  • msgstr[1] «%s Kommentare genehmigt»

получим:

  • 1 Kommentar genehmigt
  • 2 Kommentare genehmigt

И, на последок:

Комбинация _n() и _x() называется _nx()

  • function _nx($single, $plural, $number, $context, $domain = ‘default’)
Метки: , , ,    Опубликовано в WordPress

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*