Перевод темы для Wordpress

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

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

Начнем с рассмотрения уже существующих источников о переводе. На русском языке есть хороший рассказ у Делитанта, там же приведены еще две хороших ссылки. Тем не менее, полного руководства, насколько я знаю, нет.

В качестве примера возьмем тему Default из стандартной поставки — она, как ни странно, совершенно не пригодна к интернационализации. Папка темы в дистрибутиве Wordpress располагается по пути wp-content\themes\default. Создайте отдельную папку для проекта перевода и скопируйте в нее указанную папку default полностью.

Первичная подготовка

Тема совершенно не подготовлена — весь смысловой текст просто прописан в исходных текстах. Первой стадией подготовки будет оформление такого текста в специальные функции библиотеки интернационализации gettext. Функция __(’строка‘, ‘домен’) возвращает переведенную строку для модуля, уникально обозначенного словом домен, а функция _e(’строка‘, ‘домен’) делает то же самое, только не возвращает, а сама печатает перевод.

Домен — специальное слово, которым необходимо помечать отдельные от основного модуля (которым в нашем случае выступает сам Wordpress) модули программы (в нашем случае это тема). Предлагаю выбрать “default-theme” в качестве домена.

В нашем случае весь «простой» текст для перевода мы будем заключать в тег <?php _e(’<строка>‘, ‘default-theme’); ?>, а текст в функциях (по сути тот, который уже заключен в теги <?php … ?>) в функцию __(’<строка>’, ‘default-theme’). Работы будет много, все зависит от объема темы и текста в ней. Будьте внимательны — если не уверены, лучше не трогать текст сразу, чем сломать тему и потом долго искать ошибку. Если текст содержит символ его нужно экранировать при помещении в вышеуказанные тег или функцию. Для этого просто замените его на \’.

Таким образом, вам необходимо будет проработать все *.php файлы в каталоге темы и сделать в них изменения. Советую делать это с помощью какого-нибудь редактора для программистов типа Scintilla или Notepad++ — он вам значительно облегчит работу, а подсвеченный код не даст запутаться.

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


Первоначальный вариант


После изменений

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

Для того, чтобы Wordpress начал использовать наш перевод необходимо в начало файла functions.php, на следующей строке после строки содержащей текст «<?php» (она 99,9% первая) добавить следующий текст:

load_theme_textdomain(’default-theme’);

Получение шаблона перевода

Для дальнейшей работы нам понадобиться программа Poedit, поэтому скачайте ее и установите на компьютер. Работу с программой приведу по шагам с помощью скриншотов и кратких комментариев.

1. Создаем новый каталог перевода

2. Вводим основную информацию о переводе

3. Задаем информацию о путях. Путь к базе — полный путь к папке, в которую вы поместили папку с темой. В список добавляем название папки с файлами темы, она называется default

4. Задаем ключевые слова — названия функций отвечающих за интернализацию

5. Нажимаем ОК. Программа предложит сохранить .po файл. Сохраняйте его в папке, заданной на шаге 3 как путь к базе. В результате вы должны увидеть список найденных программой фраз к переводу. Список будет пустым или возникнут ошибки, если вы что-то сделали неправильно, в таком случае начните снова с шага 1

После того, как файл с фразами для перевода создан, можно воспользоваться руководством Делитанта начиная с пункта 2.

Удачной вам интернационализации и будьте здоровы! :)

Еще по теме локализации:
Codex: Internationalizing Your Plugin
Codex: Translating WordPress
Ryan Boren: Localizing Plugins and Themes

Рубрика: Wordpress | Метки: , , ,

33 отзывов на “Перевод темы для Wordpress”

  1. Делитант

    Расписал всё здорово. Именно так по уму и нужно переводить темы. Получается долго, зато результат качественный. А то уж очень много в сети мусора.

  2. TANK

    Уважаемые, как загрузить po file не используя msgfmt -o filename.mo filename.po?

  3. TANK

    Заработало :]
    просто положил в папку с темой.
    другой вопрос, можно ли ru_RU.po держать не в папке с темой?

  4. Anton Titov

    TANK, файл перевода темы ru_RU.mo (именно .mo!) можно положить в другую папку.

    Но нужно изменить код загрузки этого файла темой. Для этого строку вида
    load_theme_textdomain(’default-theme’);
    нужно изменить на
    load_theme_textdomain(’default-theme’, 'путь к файлу .mo для темы');.

  5. ioni

    Отлично, так и сделал :)
    в functions.php у меня есть код:

    if (!empty( $locale)) {

    $mofile = TEMPLATEPATH.’/lang/’.$locale.’.mo’;
    load_theme_textdomain(’ioni2′,$mofile);
    };

    Однако не загружается…
    Может быть, адрес нужен в другом виде..? Относительный пойдет?

  6. ioni

    Вопрос по прежнему в силе…

  7. ioni

    Не работает относительный адрес.
    Не работает абсолютный адрес.
    Не работает base адрес

  8. Anton Titov

    Вот этот код:
    if (!empty( $locale)) {
    $mofile = TEMPLATEPATH.’/lang/’.$locale.’.mo’;
    load_theme_textdomain(’ioni2?,$mofile);
    }

    Может его просто заменить на load_theme_textdomain('ioni2');, чтобы Wordpress сам разобрался откуда загружать.

    Или как вариант проверить, может переменная $locale пустая.

  9. ioni

    Антон….

    У меня же стоит проверка - есть $locale или нету :)
    И кроме того, мне кажется весьма семантичным убирать файлы перевода из корня темы в lang

    Но тем не менее, я разобрался :) Секрет, как всегда в деталях - передается не адрес файла, а путь к нему. и voila!

  10. Anton Titov

    И кроме того, мне кажется весьма семантичным убирать файлы перевода из корня темы в lang

    В каком-то роде да, семантично, но тут каждый решает для себя :). Если переводов много, то ясно что нужна отдельная папка, но обычно сайт представлен не более чем на трех языках, и проще использовать load_theme_textdomain().

    передается не адрес файла, а путь к нему.

    Передается локальный путь файловой системы. Адрес может работать, но это ошибка и так делать нельзя :).

    Функция загрузки локали для темы выглядит следующим образом:

    function load_theme_textdomain($domain) {
        $locale = get_locale();
        $mofile = get_template_directory() . "/$locale.mo";
        load_textdomain($domain, $mofile);
    }

    Т.е. для вашего случая можно в functions.php написать что-то вроде:

    if (!empty($locale)) {
        load_textdomain($domain, get_template_directory() . "/lang/$locale.mo");
    }
  11. Wordpress | Как перевести тему для Wordpress ( Три взгляда ) | Lectio

    [...] по этой теме статья Антона Титова Wordpress, Превод темы Wordpress, русские для [...]

  12. Николай Сидорюк

    Совершил все действия которые описывались в этом посте и в посте Делитанта…

    На локальном компьютере тема отображается на русском, а на реальном сервере ни в какую не хочет становится руссифицированной…

    В чем может быть косяк?

  13. Anton Titov

    Николай, проверяли, значение константы WPLANG в файле wp-config.php определено правильно? Должно быть ru_RU.

  14. Николай Сидорюк

    Я использую движок с переводом от Lekaktus так что там это в обяз включено…

  15. Anton Titov

    А на сервере установлен модуль PHP gettext?

  16. Дмитрий

    ПОМОГИТЕ ПЕРЕВЕСТИ вот эту тему http://www.web2feel.com/mintozine/ я пробовал, делал как написан ово всех статьях, но русский текст появляется, а затем исчезает

  17. Anton Titov

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

  18. art

    Антон, скажите пожалуйста, почему нельзя менять английский на русский в php файлах, без всяких функций. “Error 404″ например, меняешь на “Ошибка 404″, все же работает?

  19. Anton Titov

    art, почему же, это тоже можно. Просто заменять текст - это самый простой способ, но он сродни забиванию шурупов молотком :) .
    Если Вам нужно просто за 10 минут перевести тему, то можно это сделать заменяя слова без функций gettext, если же тема будет использоваться и меняться, то в будущем вы сэкономите массу времени, и не только своего, вынеся перевод отдельно.
    Кроме того для многоязычных сайтов мой способ, по сути, единственный верный.

  20. Shal

    День добрый! Нужная информация!!! Вот только не получается создать .mo файл! Добавил “__” и “_e” где надо. в Poedit указываю путь “C:\my-theme” Добавляю ключевые слова и выдает ошибку! Мол “не найдены файлы в сканируемых папках” Что это может быть?

  21. Shal

    Прошу извенить! Я понял в чем была моя ошибка! Не верно ввел путь к теме! но появился другой вопрос! Я хочу создать двуязычный сайт - Русский и казахский языки! Я сделал перевод русскийх слов на казахский в файле .mo и теперь слова указываются на казахском языке, что впрочем логично! При смене языка на сайте не происходит таковое изменение, то есть все по прежнему на казахском! Я использую плагин WPML 1.1.0! Кто нибуть с такой ситуацией сталкивался?

  22. Anton Titov

    Shal, отлично что разобрались с первым вопросом :) .
    По второму — как у Вас называются файлы перевода .mo для русского и казахского языков? Может дело в том, что Вы их неправильно назвали?

  23. WPface

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

  24. Anton Titov

    WPface, это руководство было написано больше для освещения технических моментов перевода. Хотя согласен — лингвистические тоже достойны внимания. Тем более в программе Poedit для работы с множественным числом есть удобные инструменты.

    Переменные это также особенности движка Gettext. Возможно появится дополнение к этому руководству, а пока попробуйте разобраться используя руководство к Gettext и Poedit.

  25. Luda

    Антон, сразу порошу прощения, если мои вопросы покажутся Вам глупыми. Я в вопросах локализации и web дизайна полнейший профан.

    Есть Wordpress, есть работающие руссифицированные плагины (e-commerce например), есть тема, требующая локализации… Сделала перевод в программе Poedit, залила на сервер (заменила оригинальные файлы темы mo и po и добавила в названии -ru_RU.). Прописала load_theme_textdomain(’express_store’); в functions.php. Получилось так: <?php
    load_theme_textdomain(’express_store’);
    /*

    FRAMEWORK INITIALIZATION

    This file loads the core framework which handles everything.

    DO NOT EDIT THIS FILE.

    */

    require_once(TEMPLATEPATH . “/core/core.init.php”);

    add_action(’admin_menu’,'my_admin_menu’);
    function my_admin_menu() {
    rename_admin_menu_section(’Ecart’,'Shopping Cart’);
    }

    Полключила модуль gettext на хостинге… В config.php прописан ru_RU…

    Не работает - русский текст не отображается.

    Скажите, пожалуйста, что я делаю не так? Если все правильно, можно сделать вывод, что тема “не пригодна к интернационализации”? Определить где у нее прописан весь смысловой текст мне не под силу :-)

    Помогите, пожалуйста, а?

  26. Лев

    Здравствуйте.
    Такой вопрос: все понятно, но что делать, если нужно перевести ту часть, где в комментариях идет часть
    ‘0 comments’, ‘1 comment’, ‘% comments’
    Надо писать так? -
    comments_number(_( ‘No Comments’, ‘One Comment’, ‘% Comments’ ), ‘mytheme’);

  27. Anton Titov

    Luda, насколько я понял тема называется Express Store. В её возможностях заявленна поддержка локализации, т.е. внутри уже должны быть прописаны все нужные функции и вам остаётся лишь перевести файлы po с помощью Poedit и положить файл mo в нужную папку.
    Попробуйте убрать строку
    load_theme_textdomain(’express_store’);
    из файла functions.php и всё должно заработать — эта строка уже должна быть прописана где-то внутри.

  28. Anton Titov

    Лев, в ответе на ваш вопрос должны помочь ссылки:
    gettext — Википедия
    Plural forms - GNU `gettext’ utilities

    При этом в Wordpress необходимо использовать функцию _n() вместо __(). Она берет первым аргументом единственное число, вторым множественное, третьим само число, четвертым домен перевода.

    А перевод для функции comments_number() выполняется по другому, так как она сама подставляет в одну из строк число. И вариантов не много — это 0, 1 или > 1 комментариев. Так что тут возможности Gettext особо не помогут, зато могут помочь в другом месте :) .

  29. Андрей

    А как выкинуть рекламные ссылки со страницы?

  30. Anton Titov

    Андрей, не понял какие конкретно ссылки.

  31. Дмитрий

    Здравствуйте!

    Сделал много попыток перевести тему http://bokeh.photocrati.com/, руководствуясь Вашей статьей и некоторыми другими, используя программу Poedit. Пока безрезультатно.
    Тема к переводу подготовлена, в коде файлов присутствуют символы “__” и “_e”. Но англоязычных файлов en_EN.po, .mo нет. Делаю всё поэтапно как описано в ваших инструкциях. Создаю новый каталог, ввожу название (содержание его важно? Оно должно соответствовать названиям папки или названиям темы?), язык.

    В вкладке пути вводил два варианта:
    1. c:\WPserver\home\localhost\www\dimastrahov\wp-content\themes\photocrati-theme\ когда тема расположена на локальном хосте
    2. c:\photocrati-theme\ просто для пробы и простоты.
    Каталог и файлы темы и там, и там.
    При это не совсем понятно, нужно ли самому вводить путь в графу начинающуюся с “.”? И нужно ли вводить за точкой или вместо точки или вообще не вводить? Пробовал всеми возможными способами. Думаю, проблема где-то здесь.

    В ключевых словал вводил __ _e, оставляя уже имеющиеся _, gettext, gettext_noop и убирая последние три.

    При создании каталога выдаётся 2 ошибки:

    в первом случае:

    Poedit не нашёл никаких файлов в просканированных папках.
    Элементы каталога, возможно, неверны.
    Обновление каталога завершилось неудачей…

    во втором случае:

    xgettext: Non-ASCII string at c:\WPserver\home\localhost\www\dimastrahov\wp-content\themes\photocrati-theme/index.php:82
    я так понимаю, что проблемы с кодировкой символов в этой строчке <a href=”" title=”" rel=”bookmark”> Хотя это странно.
    Элементы каталога, возможно, неверны.
    Обновление каталога завершилось неудачей…

    Строчка load_theme_textdomain( ‘photocrati-framework’, TEMPLATEPATH . ‘/languages’ ); находится в папке themes\photocrati-theme\functions\misc-functions.php
    Файлы ru_RU.po, .mo сохраняю в каталог themes\photocrati-theme\languages

    В wp-config.php константа WPLANG определена ru_RU.

    Подобное, видимо, происходило у 20. Shal, но решение он не описал, только сказал, что проблема была в пути.

    Я использую WordPress 3.3 русский.

  32. Дмитрий

    Долго разбирался, пришёл к следующему:

    Сделал перевод с помощью редактора Poedit, скомпелировал файлы ru_RU.po и ru_RU.mo. Согласно коду в файле misc-functions.php, раположенному в директории \themes\photocrati-theme\functions\

    Код:
    load_theme_textdomain( ‘photocrati-framework’, TEMPLATEPATH . ‘/languages’ );

    $locale = get_locale();
    $locale_file = TEMPLATEPATH . “/languages/$locale.php”;
    if ( is_readable($locale_file) )
    require_once($locale_file);

    помещал файл ru_RU.mo и в папку темы, и в подпапку /languages. Тема не переводится. В wp-config.php константа WPLANG определена ru_RU.

    Тема на локальном хостинге. Win 7 x64

    Очень важны толковые советы! Спасибо!

  33. Artem

    Спасибо за подробное объяснение.


Оставить отзыв



Изображения должны быть включены!

Наверх