Polylang: pll_e() и pll__() в functions.php не работают

13 февр. 2013 г., 12:34:42
Просмотры: 16K
Голосов: 2

У меня в файле functions.php есть функции, которые выводят блоки HTML. Проблема возникает с плагином Polylang, который использует пользовательские функции pll_e() и pll__().

Эти функции правильно работают в index.php в любой теме, но не работают корректно в functions.php, где они всегда возвращают строки на языке по умолчанию, даже если они зарегистрированы в админке.

Таким образом, те же самые блоки, выводимые в index.php с помощью функций pll_, работают нормально. Но те же блоки, выводимые в functions.php, всегда появляются на английском.

Я разместил этот вопрос на официальном форуме поддержки плагина. Ответов пока нет.

Кто-нибудь здесь имеет представление, в чём может быть проблема?

Большое спасибо!

1
Комментарии

Я использовал pll__ в functions.php без каких-либо проблем. Вы уверены, что предоставили необходимый перевод с помощью pll_register_string или через панель управления?

RRikesh RRikesh
29 апр. 2013 г. 09:31:13
Все ответы на вопрос 1
3

У меня нет опыта работы с плагином Polylang, но я думаю, можно с уверенностью предположить, что это связано с порядком загрузки плагина Polylang и файла functions.php вашей темы. Когда вы вызываете функцию в глобальной области видимости (т.е. не внутри другой функции) в файле index.php или любом другом шаблонном файле, она будет выполнена на позднем этапе процесса загрузки страницы, после полной инициализации WordPress и даже после того, как сервер начал отправлять ответ клиенту.

Однако функция, вызванная в глобальной области видимости файла functions.php, выполняется гораздо раньше. Во время типичной загрузки страницы сначала WordPress настраивает себя, затем загружает плагины и только в конце — тему. Однако этот процесс не такой линейный, как может показаться, поскольку некоторые плагины могут зависеть от функциональности, которая становится доступной только после полной инициализации WordPress, загрузки темы или начала отправки ответа сервера. WordPress решает эту проблему с помощью хуков, которые позволяют плагину или теме выполнять код на определенных этапах процесса загрузки.

Чтобы сделать длинный ответ коротким еще длиннее, вам нужно убедиться, что вы не вызываете pll_e() или pll__(), пока не будете уверены, что плагин Polylang готов. Это можно определить, изучив его исходный код (или, возможно, документацию), но я предполагаю, что подключение к хуку init будет достаточным. Функции, вызываемые в глобальной области видимости functions.php, выполняются до хука init, но, добавив хук init, вы можете заставить функцию выполняться на более позднем этапе. Вот как это сделать:

function my_setup() {
    global $some_var;
    $some_var = pll__('Строка, требующая локализации', 'localization_domain'); // Предполагается, что эта функция ведет себя аналогично __()

    pll_e("Мы просто выведем это где-нибудь", 'localization_domain');
}
add_action('init', 'my_setup');
13 февр. 2013 г. 13:11:10
Комментарии

Нет... не работает... :( Не знаю, что делать!

Lightworker Lightworker
14 февр. 2013 г. 11:25:11

Что ты пробовал? Использовал другие хуки вместо init? Также надеюсь, что ты не просто скопировал/вставил мой код, так как в нем была ошибка. :)

Simon Simon
14 февр. 2013 г. 12:52:25

Я посмотрел Polylang и pll__($string) - это просто обертка вокруг __($string, 'pll_string'), которая встроена в WordPress. Однако плагин добавляет фильтры к override_load_textdomain, gettext и gettext_with_context. Он также загружает свой собственный textdomain на хуках wp, login_init, admin_init, поэтому, скорее всего, функции будут доступны после любого из этих событий. Также, после завершения настройки, он вызывает событие pll_language_defined, которое тоже может быть полезно изучить. В целом, мой лучший совет - посмотреть исходный код Polylang, чтобы понять, как он работает.

Simon Simon
14 февр. 2013 г. 13:02:36