Или в чем разница между __(), _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)