IT-Service-WordPress / WPF

Шаблон плагина для WordPress (CMS)
GNU General Public License v2.0
0 stars 0 forks source link

Проблема с локализацией плагина на WPF #29

Closed sergey-s-betke closed 10 years ago

sergey-s-betke commented 10 years ago

При локализации плагинов на WPF возникают сложности. Пример plugin-admin.php:

use \WPF\v1 as WPF;

new WPF\Plugin\Part\Base (
    new WPF\TextDomain\WPF( WPF\WPF_ADMINTEXTDOMAIN )
    , new WPF\TextDomain\Plugin( 'test' )

    , new WPF\GUI\Setting\Page\PluginOptions(
        new WPF\GUI\Setting\Page\Section\Base( 'id1', 'Первый раздел'
            , new WPF\GUI\Setting\Page\Control\Input(
                'test-option'
                , 'test-option'
                , __( 'Опция тест' )
                , __( 'Подробное описание опции.' )
            )
        )
        , new WPF\GUI\Setting\Page\Component\Help\Base(
            new WPF\GUI\Setting\Page\Component\Help\Tab( 'id', __( 'title' )
                , __( '<p>Содержание справки.</p>' )
            )
            , new WPF\GUI\Setting\Page\Component\Help\Tab( 'id2', __( 'title2' )
                , __( '<p>Содержание справки 2.</p>' )
            )
            , new WPF\GUI\Setting\Page\Component\Help\Sidebar(
                '<p><strong>' . __( 'For more information:' ) . '</strong></p>'
                . '<p>' . __( '<a href="http://codex.wordpress.org/Appearance_Header_Screen" target="_blank">Documentation on Custom Header</a>' ) . '</p>'
                . '<p>' . __( '<a href="https://wordpress.org/support/" target="_blank">Support Forums</a>' ) . '</p>'
            )
        )
    )

    , new WPF\Plugin\Component\Installer()
    , new WPF\Plugin\Component\DynamicController()
);

Локализация работать не будет! И вот почему - вызовы gettext мы получим на момент загрузки указанного выше файла.

А для локализации необходим отложенный вызов этих функций, уже после загрузки файлов локализации.

sergey-s-betke commented 10 years ago

Нда, это серьёзный просчёт в дизайне WPF...

Пока вижу следующее решение. Все строки оборачивать в вызов функции, которая на самом деле вернёт объект класса, реализующего __toString(). В таком варианте мы и обеспечим себе отложенный вызов gettext без существенного изменения кода и методологии построения плагинов на базе WPF.

sergey-s-betke commented 10 years ago

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 );

В принципе, чтобы не переопределяеть массу фукнций, можно было бы перехватить приведённые выше фильтры, и в них подменять строку на объект с отложенным переводом.

sergey-s-betke commented 10 years ago

Фильтр если и использовать, то однозначно ставить его придётся в конец всех фильтров, чтобы преждевременного преобразования в строку не произошло.

sergey-s-betke commented 10 years ago

Судя по коду apply_filters, вполне можно воспользоваться фильтрами для нашей задачи. Но при этом необходимо поставить наш фильтр в конец, что возможно - с помощью приоритета фильтров.

sergey-s-betke commented 10 years ago

Перехват фильтров будет выполнять в классах WPF\TextDomain\Base. А снимать фильтры будем в этих же классах по событию загрузки локализации.

sergey-s-betke commented 10 years ago

Кстати - нет смысл разделять домены для консоли администратора и прочих компонентов плагина. Локализация объединяется при загрузке нескольких файлов.

sergey-s-betke commented 10 years ago

Всё усложняю сильно. Куда проще просто сразу загрузить локализацию. Для этого грузить её через компоненты недопустимо - компоненты применяют позднее связывание, а для локализации в моём варианте это уже губительно.

Чтобы кардинально не менять дизайн, предлагаю следующее решение:

Да, пожалуй подобное решение может оказаться вполне работоспособным.

sergey-s-betke commented 10 years ago

Задачу решил существенно проще - создаю экземпляры компонентов TextDomain до экземпляра плагина и его частей. Код компонентов для этого исправлен. Протестировал, положительно.