суббота, 7 февраля 2009 г.

Как сделать мультиязычный плагин для Wordpress

Задача мультиязычности – одна из важнейших при работе над плагином (или темой) для Wordpress. Особенно в том случае, когда вы собираетесь сделать свой труд публичным. Только мультиязычность позволит множеству почитателей этой системы в полной мере насладиться вашим гениальным творением.

Я начал делать свой собственный плагин, не обращая особого внимания на то, чтобы перевести интейфейс на другие языки. Первая версия делалась просто для удовольствия. Но после того, как я, спустя какое-то время выложил его на всеобщее обозрение, первым появился вопрос: “А почему только на английском языке”?



По правде говоря, мне лень было отвлекаться на изучение стандартных средств перевода, которые предлставляет Wordpress, потому я просто в настройках сделал переключатель языка с русского на английский, сделал двумерный массив, который состоял из наименования языка и метки на этом языке, и везде, где требовалось выводить сообщение – выводить элемент массива $lang[i][g], где i – язык и  j – метка. Выглядело это так:
[sourcecode language='php']
$lang = array(
'en_EN' =>
array('Options' => 'XMPP sender options',
'server' => 'Enter a jabber server which you will use to send messages from site. You should have a jabber account on it (talk.google.com for example).:',
'language' => 'language/язык:',
'port' => 'Enter a jabber server port (5222 for example): ',
'login' => 'Enter login to your account on server entered previously: ',
'password' => 'Enter password to your account on server entered previously: ',
'admincopy' => 'Send copy to special admin jabber account? '
),
'ru_RU' =>
array('Options' => 'Настройки XMPP sender',
'server' => 'Введите сервер jabber, который вы будете использовать для отправления сообщений с сайта. У вас должен быть зарегистрирован jabber аккаунт на нем (например, talk.google.com).:',
'language' => 'language/язык:',
'port' => 'Введите порт сервера jabber (например, 5222): ',
'login' => 'Введите логин на сервер jabber, который вы выбрали выше: ',
'password' => 'Введите пароль для вашего аккаунта на сервере Jabber, который вы выбрали выше: ',
'admincopy' => 'Слать копии сообщений администратору? '
)
);
[/sourcecode]

Вызовы осуществлялись так:
[sourcecode language='php']
echo _t( $xlang, 'language' );
[/sourcecode]
Согласитесь, нелепо немного? Но зато быстро и не отвлекало от основной задачи.

Пришло время все сделать по человечески. В первую очередь это коснулось мультиязычности.

Для того, чтобы приложение работало на многих языках, в Wordpress (и не только) используется механизм текстовых доменов.

Смысл этого в том, что в тексте программы для вывода меток на экран используются специальные функции:

  • __('String', 'domain')

  • _e('String', 'domain')

  • __ngettext('String', 'Strings', $c, 'domain')


В чем отличия?

Первая используется для  того, чтобы пометить текстовыю переменную для перевода.

Например, $d = __('String', 'domain');

Вторая действует практически аналогично, но еще и выводит  эту строку на устройство вывода (экран монитора). Это аналог функции echo.

Третья нужна для того, чтобы система понимала, какие строки использовать в случае, если переменная $c в единственном или множественном числе (как вы понимаете, не совсем удачное решение для русского языка).

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

Итак, код плагина переработан с учетом всего вышеизложенного. Осталось добавить в начале вызов еще одной функции :
[sourcecode language='php']
load_plugin_textdomain('xmpp-sender', false, dirname( plugin_basename(__FILE__) ) . '/lang');[/sourcecode]
Это нужно как раз для того, чтобы присоединить к файлу программы необходимый файл перевода.

Готово? Почти.

Теперь необходимо сгенерировать для файла программы .pot файл. Это файл, который используется в программах перевода для создания файла перевода. Я так и не нашел хорошего генератора таких файлов в интернет, единственный генератор, который нормально отработал – на сайте wordpress.org (для моего плагина ссылка выглядит так: http://wordpress.org/extend/plugins/xmpp-sender/admin/). Для того, чтобы им воспользоваться, надо залить плагин на сайт.

Ничего сложного в этом нет. Регистрируетесь. Переходите в директорию плагинов и делаете заявку на публикацию нового плагина. Спустя какое-то время ее удовлетворяют (так, во всяком случае, было  у меня). После этого, можно залить необходимые файлы в svn репозиторий. Этот процесс я описывать не буду, увольте. Тема для отдельной статьи.

После того, как файлы залиты на сайт, спустя какое-то время, ваш плагине становится доступным для скачивания. Одновременно с этим, вы можете зайти по приведенной выше ссылке (с вашим названием плагина) и  сгенерировать .pot файл. Для этого надо нажать на кнопку Get Pot и сохранить файл.

GetPot

Сохраняем файл локально. Осталось дело за малым – создать перевод. Это делается в программе poedit. Скачать ее можно здесь. Обладатели linux-систем так же могут установить его из репозитария.

Выбираем в меню – Создать каталог из POT-файла

create

Вводим необходимые данные:

opt

После нажатия “Ок” сохраняем .PO файл в атком виде: xmpp-sender-ru_RU.po. Обратите внимание, в конце, после имени домена, который вы использовали при формировании меток в программе, стоят символы “-ru_RU”. Это обязательное условие того, что программа найдет ваш файл перевода на русском языке. После чего вводим переводы строк:

po

Перевели все строки? Сохраняем полученный труд. Файлы с расширениями .po и .mo копируем в папку плагина (в моем случае, это /xmpp-sender/lang/), которая была определена в функции load_plugin_textdomain.

Вуаля. Все должно работать на русском языке.

Пример, приведенный в статье, плагин XMPP-sender, который служит для отправки  XMPP-уведомлений в Wordpress, можно скачать и посмотреть здесь

Еще про переводы в Wordpress можно почитать здесь

3 комментария:

  1. Если честно, я вообще не вижу смысла в переводе. Стандартные английские слова и выражения. Не на языке племени тумба-юмба же (:

    ОтветитьУдалить
  2. @Конкере, не поверишь, в мире еще столько народу, для которых что выучить английский, что полететь на луну - недостижимые мечты ;-)
    Тем более, сделав плагин готовым к переводу, ты позволяешь его быстро и безболезненно перевести не только на русский, а еще на сотню языков по всему миру...

    ОтветитьУдалить
  3. blog.laptev.info поздравляю вас с праздниками почаще обновляйте и я всегда буду вашим читателем

    ОтветитьУдалить