Допустим вы написали плагин для wordpress. Что дальше? Можно ли как то расширить аудиторию пользователей, чтобы стяжать ещё большую славу :)? Ответ, конечно же, — да, можно. Иначе этой статьи бы не было. Расскажу, как сделать и подключить файлы переводов для некого абстрактного плагина.
Сначала разберемся как же устроена «многоязычность» в wordpress. Достаточно поковырять любой многоязычный проект и будут ясны составляющие этого коктейля, а именно:
- Использование специальных функций движка:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* Функция выполняет перевод данного ей текста $text, используя контекст словаря domain. Перевод возвращаем в вызывающий код. */ function __( $text, $domain = 'default' ) { return translate( $text, $domain ); } /* Функция выполняет перевод данного ей текста $text, используя контекст словаря domain. Но! Перевод сразу выводим в поток вывода. */ function _e( $text, $domain = 'default' ) { echo translate( $text, $domain ); } |
где $text — строка подлежащая переводу, а $domain — это префикс файла-словаря, откуда следует брать перевод. Весьма разумная задумка с префиксом файла, позволяет получать уникальный перевод одной и той же фразы в контексте данного модуля.
- Наличие специальных языковых файлов с переводами и расширениями .po и .mo. Файл PO — это по сути файл-проект, для системы он не нужен, а нужен он тем, кто тоже хочет по-переводить ваш плагин на свой язык. Тогда они берут его за основу для своего языка. Вообще, по правилам хорошего тона, следует выкладывать ещё файл с расширением .pot, но об этом чуть чуть позже. Файл .mo, как раз содержит скомпилированные для сайта переводы и загружается системой, если мы скажем, где его можно взять.
- Системе нужно сказать, что у нас есть файлы переводов, и указать где они лежат, но сделать это нужно до того, как сами фразы будут пытаться переводиться — т.е. на стадии инициализации.
Пойдем прямо по пунктам.
С функциями __($text, $domain) и _e($text, $domain), думаю, все понятно. Разве что, пока не ясно, где мы задаём значение $domain. Узнаем это позже.
Второй пункт — нужно подготовить словари. Где взять редактор и как вообще готовить эти словари. Такой редактор есть, называется PoEdit, в вот домашняя страничка PoEdit. Скачайте его от туда. Редактор позволит создать как новый файл .po, так и нужный нам .mo. Можно также сделать .po вручную, т.к. это обычный текстовый файл. Наиболее простой способ — взять какой то готовый .po (.pot) файл, поменять значения в шапке на подходящие вашему проекту и добавить после шапки строки с вашими ключевыми константами, переводом которых вы озадачены. Давайте взглянем на такой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Russian (ru_Ru) translation for WordPress. # Copyright (C) YEAR WordPress contributors. # This file is distributed under the same license as the WordPress package. # Shra <to@shra.ru>, 2010. # msgid "" msgstr "" "Project-Id-Version: WordPress 2.9\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-01-22 16:40-0500\n" "PO-Revision-Date: 2010-01-22 17:17+0500\n" "Last-Translator: Shra\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Russian\n" "X-Poedit-Country: RUSSIAN FEDERATION\n" "X-Poedit-SourceCharset: utf-8\n" "MIME-Version: 1.0\n" "Language-Team: \n" msgid "This profile is created in demo purposes. For view only." msgstr "" msgid "ONE MORE FRASE TO TRANSLATE" msgstr "" |
После шапки (в которой принципиальное значение, наверное, имеет только указание на кодировку) идут однотипные пары значений — msgid и msgstr. Сначала в msgid вы указываете что переводить, а потом в msgstr — на что переводить. Файл, в котором указаны только значения msgid (как в нашем примере) — записывается с расширением .pot — им будет удобно пользоваться другим разработчикам-локализаторам, которые захотят перевести ваш плагин на свой, к примеру, родной язык.
Копия .pot записывается с расширением .po и открывается PoEdit. Там мы видим довольно простую картину — два окошечка, в одном надо выбирать фразы, а во втором вводить переводы этих фраз. Все довольно просто, думаю, вы разберетесь. Перед выходом из программы, сохранитесь. Автоматически будет сгенерирован файл .mo.
У нас практически все готово. Осталось правильно назвать наши файлы и куда то их сложить. Имена языковых файлов состоят из двух частей: [domain]-[xx_XX].mo, [domain]-[xx_XX].po и файл [domain].pot. Вместо [domain] рекомендую использовать имя вашего плагина. [xx_XX] — это язык локализации. Он, к примеру, устанавливается в файле wp-config.php. Для русского языка выглядит как «ru_RU».
Куда сложить файлы. Рекомендую (это не обязательно) сделать для них отдельную папку внутри папки вашего плагина, например «languages».
Тогда нам останется выполнить последний шаг. А именно, сообщить wordpress, что у нас есть файлы перевода. Типично это выполняется так:
1 2 3 4 5 6 7 8 9 10 |
function mypluginprefix_loaddomain() { if (function_exists('load_plugin_textdomain')) { /* укажите используемый вами префикс файла-словаря [domain] и каталог, где лежат файлы */ load_plugin_textdomain('[domain]', 'wp-content/plugins/myplugin/languages'); } } // вызываем функцию подключения словаря на этапе инициализации add_action('init', 'mypluginprefix_loaddomain'); |
Теперь посмотрим пример кода (до и после), где мы выполняем вывод текстовой константы:
1 2 3 4 5 6 |
/* до использования словарей */ echo "Hello, World!"; /* и используя наш новый словарь; пусть myplugindomain - это префикс наших словарей, т.е. словари называются - myplugindomain-ru_RU.mo, myplugindomain-ru_RU.po и myplugindomain.pot */ _e("Hello, World!", 'myplugindomain'); |
Если остались ещё вопросы — пишите.
Не получается по Вашей схеме русифицировать плагин eSop :(
Это, фактически, официальный гайд. Попробуйте почитать ещё и здесь — http://codex.wordpress.org/I18n_for_WordPress_Developers, авось найдете, что у вас не стыкуется.
Ой спасибо! Перевел FancyBox и подключил, до этого какие то продвинутые способы подключения насмотрелся, а так как в функциях несилен, то неполучалось, а по вашему способу, в легкую!
Если Вы заинтересованы в инструменте, который обеспечивает быстрый и эффективный перевод тем и плагинов WordPress, я рекомендую Вам использовать этот инструмент на базе web: http://poeditor.com/ Особенностью данного инструмента является наличие плагина, который Вы можете использовать для интеграции его API в Ваш WordPress. Это позволяет Вам сэкономить значительное время на процессе организации файлов.