Локализация в шаблонах WordPress

Или в чем разница между __(), _e(), _x(), и _ex()?

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

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

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

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

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

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

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

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

К счастью, создатели WP предусмотрели решение для таких вариантов — функцию _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 '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);
$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);
    $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);
    $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')

Дополнительная информация:
Источник: web.Chervach.com

Комментарии (0)

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