Closed sergey-s-betke closed 10 years ago
Нда, это серьёзный просчёт в дизайне WPF...
Пока вижу следующее решение. Все строки оборачивать в вызов функции, которая на самом деле вернёт объект класса, реализующего __toString()
. В таком варианте мы и обеспечим себе отложенный вызов gettext
без существенного изменения кода и методологии построения плагинов на базе WPF.
WordPress предлагает фильтры:
apply_filters( 'gettext', $translations, $text, $domain );
apply_filters( 'gettext_with_context', $translations, $text, $context, $domain );
apply_filters( 'ngettext', $translation, $single, $plural, $number, $domain );
apply_filters( 'ngettext_with_context', $translation, $single, $plural, $number, $context, $domain );
В принципе, чтобы не переопределяеть массу фукнций, можно было бы перехватить приведённые выше фильтры, и в них подменять строку на объект с отложенным переводом.
Фильтр если и использовать, то однозначно ставить его придётся в конец всех фильтров, чтобы преждевременного преобразования в строку не произошло.
Судя по коду apply_filters
, вполне можно воспользоваться фильтрами для нашей задачи. Но при этом необходимо поставить наш фильтр в конец, что возможно - с помощью приоритета фильтров.
Перехват фильтров будет выполнять в классах WPF\TextDomain\Base
. А снимать фильтры будем в этих же классах по событию загрузки локализации.
Кстати - нет смысл разделять домены для консоли администратора и прочих компонентов плагина. Локализация объединяется при загрузке нескольких файлов.
Всё усложняю сильно. Куда проще просто сразу загрузить локализацию. Для этого грузить её через компоненты недопустимо - компоненты применяют позднее связывание, а для локализации в моём варианте это уже губительно.
Чтобы кардинально не менять дизайн, предлагаю следующее решение:
Да, пожалуй подобное решение может оказаться вполне работоспособным.
Задачу решил существенно проще - создаю экземпляры компонентов TextDomain
до экземпляра плагина и его частей. Код компонентов для этого исправлен. Протестировал, положительно.
При локализации плагинов на WPF возникают сложности. Пример
plugin-admin.php
:Локализация работать не будет! И вот почему - вызовы
gettext
мы получим на момент загрузки указанного выше файла.А для локализации необходим отложенный вызов этих функций, уже после загрузки файлов локализации.