Перейти к содержимому

Руссификация тем WordPress’а

Начав поближе разбираться с WordPress'ом сразу столкнулся с необходимостью руссификации его тем. Применение решения "в лоб" связанное с прямым переводом отображаемых слов в исходниках мне как-то не импонирует. А столкнувшись с приятной возможностью локализации в теме Binary Blue я понял, что это то что надо. Немного поигравшись с новыми возможностями, я перешёл к другой теме и попробовал таким же образом руссифицировать и её. Не тут-то было!

Вначале о самом методе локализации. Его идея проста. Сперва создаем «базу» оригинальных слов/фраз и соответствующих им переводов, затем, перед отображением слова/фразы вызываем некую функцию, которая проверяет наличие в базе такой связки и если есть перевод, то на экран выводится именно перевод. Ну, а если нет, то оригинальное слово. Причём, таких функций может быть несколько.
WordPress использует для реализации собственной локализации именно такой метод и его код базируется на GNU gettext'е. Если вас интересуют технические подробности, то с ними лучше ознакомится на страничке с документацией на gettext. Вы должны знать, что в реализации всё несколько сложнее чем я описал. Т.е. я дал самую общую схему. Интересуют нюансы? Вы уже знаете где их найти. Меня, как, наверное и вас, интересует практическая сторона дела. Поэтому и перейдём к практике.

На этой странице в разделе "Translation Tools" выбираете удобный для вас редактор, в исходниках WordPress'а (wp-includes/languages) находите файл *.po, подсовываете его редактору и начинаете переводить. В итоге вашей работы вы должны получить файл с таким же именем, но расширением mo. Вот его кладёте туда же где взяли исходный файл, обновляете страничку и наслаждаетесь родными буквами. Кайф! Как всё просто! Но вы правильно сейчас подумали "а в чём же вас обманывают?" Не всё так просто.

Во-первых, вы редактору должны указать, что в итоге вас интересует кодировка UTF-8. Во-вторых, вы должны точно знать как назвать выходной файл, т.к. от имени файла зависит почти всё. Помните: как вы судно назовёте, так оно и поплывёт? Другое дело, что в нашем случае выбор нужных имён ограничен одним именем - ru_RU. И всё. Но если вы переводите и на другие языки, то обязательно почитатйте документацию на этой странице, особенно приложения "A. Language Codes" и "B. Country Codes". В общем, предположим, что у вас есть файл en_EN.po. Вы просто переименуете/копируете его в ru_RU и редактируете уже новый файл.

Небольшое отступление. Я всё время говорю про файлы с расширениями mo и po. Так вот файлы po, это обычные текстовые файлы и вы може посмотреть что и как в них. mo файлы, это уже скомпилированные базы и они имеют двоичный формат.

Но, наверняка, WordPress у вас взят с русского сайта и у вас уже отображается русский текст и в указанной мной директории уже лежит файл ru_RU.mo. Так что остаётся только руссифицировать понравившиеся темы. Нет, конечно, остаются вопросы правильного склонения падежов русских языка и выборов правильного суффикса и окончаниев. Но это уже нюансы и, при должном кропотливом отношении, это можно решить тем или иным способом.

Наконец-то возвращаемся к локализации тем. Долго подходили, но всё же дошли. Так вот. Если тема уже поддерживает описанную выше технологию, то вы в корневом каталоге темы найдёте файл *.po. Что с ним делать я уже рассказал. Полученный в итоге всех манипуляций ru_RU.mo копируете в этот же каталог и начинаете заниматься подчисткой огрехов перевода.

А если в каталоге нет ничего отдаленно напоминающего описанные мной файлы? И в документации на тему нет ни слова про локализацию? Это чуть хуже, но "мы не привыкли отступать" © киножурнал "хочу всё знать".

Ещё одно отступление. Причиной побудившей меня написать эту заметку стало то, что я не смог не смог найти в Инете способа как сделать то, что описано ниже. Даже на сайте WordPress'а. По-видимому плохо искал. Ибо других причин я не вижу. Ещё раз, прямолинейный перевод исходных текстов лично я считаю идеологически не верным. Но это вопрос личных пристрастий и у вас может быть совсем другое мнение.

Вариант 1. Смотрим в любой файл в корневой директории темы, например, в index.php. Если в нём вы видите строчки типа _e('read more...', 'ddd.en') или __('read more...', 'eee.de'), то не всё ещё потеряно. Эти строки говорят о том, что автор темы всё же включил код позволяющий её локализовать. Внимание! В тексте могут быть строчки типа _e('read more...') - это не то! Это кусочки локализации самого WordPress'а и нам они не помогут. Предположим что указанные мной строки всё же есть. В этом случае, в редакторе помогающем нам в переводе настраиваем ключевые слова на _e и __. После этого натравливаем (синхронизируем) его на директорию с исходниками темы. После синхронизации вы должны увидеть все выбранные из функций _e и __ слова и фразы для перевода. Радуемся, переводим, сохраняем с нужным нам именем (ru_RU), ну и так далее.

Перед рассмотрением второго варианта немного о функциях _e и __. Это те самые функции о которых я говорил в самом начале - функции обращающиеся к базе, осуществляющие в ней поиск и возвращающие либо перевод, либо оригинальное слово/фразу. Разница между ними в том что _e отображает перевод аналогично print, echo и пр. А __ - возращает перевод. Вот пример использования:

_e('English');
$m = __(USA);
echo "$m";

Вариант 2. В исходниках темы не нашлось функций указывающих на использование автором локализации. Что ж, в этом случае, набираемся терпения и приступаем к кропотливому труду по включению всех иностранных слов в означенные выше функции. Конечно, при этом у вас должны быть хотя бы начальные познания в программировании, HTML'е и языке PHP. Вы должны понимать в каком месте надо использовать _e, а в каком __. Вы должны знать как изменить HTML строку с переводимой фразой на строку содержащию вызов этих функций. Как изменить код php на использование этих функций.

Кстати, не надо заранее сильно пугаться предстоящей работы. Если тема не сильно навороченная, то вам прийдётся не так уж и долго истирать клавиши. Достаточно сказать, что в очень продвинутой теме Binary Blue мне пришлось переводить 143 фразы, а значит, если бы я сам локализовал эту тему, мне пришлось бы "внедрить" эти функции 143 раза. Поверте, это не так уж и много. А в более простой теме Arzel_XT2 мне реально пришлось проделать операцию по "внедрению" всего-то 46 раз.

Считаем, что все препятствия успешно преодолены, и соотвествующие фразы вписанны в нужные функции. Кстати, если всё сделано правильно, то изменённый вами код не должен повлиять на работу темы! Ни коим образом! Т.е. внешне всё должно остаться так как и было! Такое поведение говорит о том, что вы всё сделали правильно. Теперь, как и в первом варианте, настраиваем редактор на ключевые слова _e и __ и... Ох, не буду писать, прочитайте выше, что делать дальше. Я подожду.

Сделали? Получился файлик ru_RU.mo? Положили его в корневой каталог темы? И даже обновили страничку? И что? Ни чего? Нет русского текста в тех местах где он должен был быть после всех этих манипуляций? Вот! Вот и я был озадачен точно так же. На этой самой стадии я и попал в ситуацию описанную мной в ещё одном отступлении. Вот как раз, как сказать WordPress'у о том что у меня тут лежит руссификация и я переработал код, я и не нашёл в Инете. Пришлось рыть исходники. Не буду описывать процесс рытья - он конечно, интересный, но не о нём речь.

В директории wp-includes лежит файлик wp-l10n.php. Вот в нём и оказались все ответы.

Настало время поговорить и о втором аргументе ('ddd.en') функций _e и __. Этот аргумент может быть любой строкой. Вы можете назвать его, например, 'mysite.ru' или ещё как - не важно. Важно, чтобы он фигурировал в качестве параметра одной (или чуть больше) важной функции которую вы разместите в одном из файлов локализуемой темы. Это будет один из файлов который обязательно будет вызван при каждом обращении к страницам вашего блога. В моём случае это был index.php. В локализуемой вами теме это может быть и другой файл. Хотя, похоже, есть один признак по которому вы можете отыскать нужное вам место. Это наличие в самых первых строках файла следующего кода:

require('./wp-config.php');

Причём, вместо require может быть include. Главное чтоб присутствовал wp-config.php. Вот перед или после этой строки и надо вставить следующую функцию:

load_theme_textdomain('mysite.ru');

Естественно, все ваши функции _e и __ должны в качестве второго аргумента содержать то что вы вписываете аргументом в этой строке. Вот теперь, действительно всё. Локализация просто обязана заработать.

В файле wp-includes/wp-l10n.php есть ещё ряд функций типа load_*_textdomain. Но вряд ли вам прийдётся их использовать. Хотя я не вижу ни каких препятствия к их использованию. Конечно, по необходимости.

Надеюсь не сильно утомил? 🙂

Тогда ещё довесочек. Так, просто для информации. Вот заголовок моего po файла:


msgid ""
msgstr ""
"Project-Id-Version: WP My Theme\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2006-02-04 18:05+0300\n"
"Last-Translator: Michael Babakov\n"
"Language-Team: \n"
"MIME-Version: 1.0\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"
"X-Poedit-KeywordsList: __;_e\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-SearchPath-0: .\n"

Руссификация тем WordPress’а: 27 комментариев

  1. CountZero

    hi, if babelgish transtated this post correctly, you have managed to translate my Binary Blue theme into russian language. It would be great, if you'd contribute your translation to the growing Binary Blue community, so other russian bloggers could profit of it 😉

    Regards
    CountZero, designer of the Binary Blue theme

  2. Mike

    Gutten tag!

    Ich habe das Archiv mit ru_RU.po und ru_RU.mo auf Ihre Adresse abgeschickt.

    Entschuldigen Sie für meine schlechte deutsche Sprache! Ich verwende der automatische Dolmetscher. 🙂

  3. CountZero

    Hello Mike,

    thank you very much for submitting the localization archive to me. I have published the files including credit and a backlink to your page on my blog this evening.
    Thanx again.

    Kind regards
    CountZero

  4. beliy

    1. чем проще тем лучше, зачем эти тему нужны навороченные?

    2. в друпале перевод далеется экстремально просто, вордпрессу до него не угнаться.

  5. Danil

    Я тоже весьма намучался, доводя до ума WordPress и тему Regulus...
    Про ru_RU и всё такое прочитал на каком-то русском сайте; мне в общем-то понравился poEdit (http://www.poedit.org/).
    Бесила "локализация" темы.. Я не понимаю, люди что ли загоняют английские строки в электронные переводчики, а потом вставляют результат обратно?

    Как думаете, что такое "опции закрытия" в меню изображения? (это когда вы загружаете изображение в пост)
    Это значит "Close options" =)

    Прямо как в играх современных "русефицированных": я у друга-геймера увидел в меню игры "игра груза". Ни фига себе, подумал... Оказалось, "загрузить игру" =)))

    Пришлось поисправлять немало, включая явные опечатки.
    Что касается моих предпочтений, то рубрики я заменил разделами, ещё что-то там поменял для благозвучия.. Вот думаю, поделиться с общественностью или нет? 🙂 В смысле, интересно это кому-то?..

    Озадачился я также возможностью иметь блог на разных языках для разных посетителей. В подробности text-доменов не вдавался пока 🙂

    Скоро, надеюсь, свой блог размещу в инете, пока что просто пытаюсь наполнить его небезынтересной (хотя бы для кого-то) информацией...

  6. Mike

    Danil, вот как раз против такой "локализации" я и выступаю. Но, похоже, именно так народ и руссифицируется. Есть сложность, если автор темы не включил в неё поддержку локализации, то даже если ты вставишь функции в текущую версию темы, то с выходом новой версии тебе прийдётся всё делать снова. Так что, это надо либо автора пинать, либо просто вести уже свою ветку темы.

  7. Mike

    beliy
    1. Полностью согласен.
    2. А как там делается? И где на этот друпал посмотреть можно?

  8. Lalex

    beliy
    2) у каждого подхода есть свои достоинства и недостатки, от того, что "более удобный" не значит более производительный и т.д. и в конце концов конечный пользователь по идее не должен заниматься локализацией.
    обратной стороной медали в случае с друпал является количество запросов к базе. уверяю вас что использовать друпал в ближайшей перспективе будет крайне невыгодно для среднего блога из-за больших требований к сайту. а если переложить подход из drupal в WP то бардак получится еще круче - если сейчас установка пары плагинов или использование некоторых особо навороченных тем, типа К2 приводит к лавинообразному увеличению запросов к БД (вместо ~10 до 30-40) то что будет в случае если словарь для локализации вы разместите из БД? т.е. в данном случае использование gettext вполне оправдано.

  9. Regacaty

    Зачем так мучатся, скачал инглиш версию, перевел тему, поудалял функции перевода, если есть, дабы не грузить и пользуйся на здоровье. Или мы не ищем простых путей?

  10. selff

    Спасибо, Михаил.
    Вчера столкнулся с проблемой локализации темы и не смог ее победить, а сегодня вот наткнулся на ваш пост.

  11. Уведомление: Гостевой Пост. Что Означает Дизайн Для Блога?

  12. Уведомление: Что означает дизайн для блога? : Бизнес Дизайн

  13. Dmitrij

    Нет, как-то это всё мучительно. 🙂
    Тем более, что при установке новой версии темы, в которой локализация не предусмотрена автором, русификация по-любому слетает.
    На мой взгляд, проще непосредственно из админки открыть "Внешний вид" -- "Редактор тем" и там прямо в файлах всё перевести. Тем более, что во-первых для обычной средней темы объем перевода невелик, и во-вторых, вы же все равно будете править тему? Добавлять свои счетчики в подвал и т.д. Вот одновременно и русификацию провести. Быстрее и проще получается.
    А качество перевода, о чем писали выше, всякий бред типа "игра груза" и прочее, это вообще не из этой оперы. Каким способом перевода ни пользуйся, но если переводчик не понимает, чего он там переводит, итог будет плачевный.

  14. Уведомление: DELETE YOURSELF! » Blog Archive » Русский WordPress MU 1.0 (и 2.0.5)

  15. SS

    ---На мой взгляд, проще непосредственно из админки открыть “Внешний вид” — “Редактор тем” и там прямо в файлах всё перевести. Тем более, что во-первых для обычной средней темы объем перевода невелик, и во-вторых, вы же все равно будете править тему? Добавлять свои счетчики в подвал и т.д. Вот одновременно и русификацию провести. Быстрее и проще получается.---
    Что мне сделать, если если я начинаю писать по русски а на сайте все букві выводятся знаками вопроса...Подскажите !

  16. Noble Ossage

    Спасибо Вам, уважаемый. два дня бился, все перевел, а она как говорила по аглицки, так и говорит.

    Все мозги разбил на части, Гугл, думал, порву! Но вы их всех спасли.)))

    Отличная статья.

    PS А у Вас кнопочка "Submit Comment" называется.....((

  17. rendom

    У меня кстати такая же проблемма блок с отправкой комментария на английском. Как его на русский перевести?

  18. Балезин Дмитрий

    Кстати, на счет того, что остаются не переведенными слова "Комментариев нет" или т.п.

    Так как эти сообщения не заложены в теме, а реализуются самим вордпрессом, то и меняется это все в файле wp-config - В нем как раз указывается Русская или английская версия используется...

    /**
    * Язык WordPress. Если не указан никакой, то будет английский!
    *
    * По умолчанию для локализации предлагается такой вариант: define ('WPLANG', 'ru_RU');
    * но вы можете существенно снизить нагрузку на ваш блог, раскомментировав строку: if (strpos($_SERVER['REQUEST_URI'], 'wp-admin')) define ('WPLANG', 'ru_RU'); else define ('WPLANG', 'ru_RU_lite');
    * и закомментировав строку define ('WPLANG', 'ru_RU');
    * тогда в админке вы будете использовать полный файл перевода, а для лицевой части блога облегченный файл перевода.
    * в среднем это снижает потребление памяти на 3 мегабайта и ускоряется генерация страницы. Также может понадобиться для тех плагинов,
    * которые что-либо выводят на лицевую часть блога создать файлы с переводами по технологии: скопировать файл, например wptuner-ru_RU.mo в wptuner-ru_RU_lite.mo
    * тоже самое нужно сделать и если ваша Тема локализована через внешний файл перевода. Более подробно на http://lecactus.ru/2008/11/15/3110/
    */

  19. nik

    у меня не сработало
    1. ни в одном файле темы нет указания wp-config.php
    2. в директории includes - не лежит указанный файл
    3. добавление load_theme_textdomain(' '); в functions php ничего опять не сделало...

    буду благодарен за совет что не так

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *