Перевод темы для 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 | Метки: Wordpress, перевод, руссификация, темы
сентября 28, 2008 at 9:33
Расписал всё здорово. Именно так по уму и нужно переводить темы. Получается долго, зато результат качественный. А то уж очень много в сети мусора.
января 9, 2009 at 11:41
Уважаемые, как загрузить po file не используя msgfmt -o filename.mo filename.po?
января 9, 2009 at 11:50
Заработало :]
просто положил в папку с темой.
другой вопрос, можно ли ru_RU.po держать не в папке с темой?
января 9, 2009 at 16:12
TANK, файл перевода темы ru_RU.mo (именно .mo!) можно положить в другую папку.
Но нужно изменить код загрузки этого файла темой. Для этого строку вида
load_theme_textdomain(’default-theme’);нужно изменить на
load_theme_textdomain(’default-theme’, 'путь к файлу .mo для темы');.мая 20, 2009 at 19:44
Отлично, так и сделал
в functions.php у меня есть код:
if (!empty( $locale)) {
$mofile = TEMPLATEPATH.’/lang/’.$locale.’.mo’;
load_theme_textdomain(’ioni2′,$mofile);
};
Однако не загружается…
Может быть, адрес нужен в другом виде..? Относительный пойдет?
мая 21, 2009 at 10:07
Вопрос по прежнему в силе…
мая 21, 2009 at 13:30
Не работает относительный адрес.
Не работает абсолютный адрес.
Не работает base адрес
мая 21, 2009 at 13:55
Вот этот код:
if (!empty( $locale)) {$mofile = TEMPLATEPATH.’/lang/’.$locale.’.mo’;
load_theme_textdomain(’ioni2′,$mofile);
}
Может его просто заменить на
load_theme_textdomain('ioni2');, чтобы Wordpress сам разобрался откуда загружать.Или как вариант проверить, может переменная $locale пустая.
мая 21, 2009 at 15:12
Антон….
У меня же стоит проверка - есть $locale или нету
И кроме того, мне кажется весьма семантичным убирать файлы перевода из корня темы в lang
Но тем не менее, я разобрался
Секрет, как всегда в деталях - передается не адрес файла, а путь к нему. и voila!
мая 21, 2009 at 19:17
В каком-то роде да, семантично, но тут каждый решает для себя :). Если переводов много, то ясно что нужна отдельная папка, но обычно сайт представлен не более чем на трех языках, и проще использовать 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"); }сентября 12, 2009 at 21:44
[...] по этой теме статья Антона Титова Wordpress, Превод темы Wordpress, русские для [...]
декабря 25, 2009 at 15:59
Совершил все действия которые описывались в этом посте и в посте Делитанта…
На локальном компьютере тема отображается на русском, а на реальном сервере ни в какую не хочет становится руссифицированной…
В чем может быть косяк?
декабря 26, 2009 at 16:47
Николай, проверяли, значение константы WPLANG в файле wp-config.php определено правильно? Должно быть ru_RU.
декабря 31, 2009 at 17:53
Я использую движок с переводом от Lekaktus так что там это в обяз включено…
января 3, 2010 at 12:07
А на сервере установлен модуль PHP gettext?
февраля 5, 2010 at 16:27
ПОМОГИТЕ ПЕРЕВЕСТИ вот эту тему http://www.web2feel.com/mintozine/ я пробовал, делал как написан ово всех статьях, но русский текст появляется, а затем исчезает
февраля 5, 2010 at 17:01
Дмитрий, пришлите вашу попытку перевода, постараюсь помочь найти проблему.
февраля 26, 2010 at 12:52
Антон, скажите пожалуйста, почему нельзя менять английский на русский в php файлах, без всяких функций. “Error 404″ например, меняешь на “Ошибка 404″, все же работает?
февраля 26, 2010 at 16:50
art, почему же, это тоже можно. Просто заменять текст - это самый простой способ, но он сродни забиванию шурупов молотком
.
Если Вам нужно просто за 10 минут перевести тему, то можно это сделать заменяя слова без функций gettext, если же тема будет использоваться и меняться, то в будущем вы сэкономите массу времени, и не только своего, вынеся перевод отдельно.
Кроме того для многоязычных сайтов мой способ, по сути, единственный верный.
марта 5, 2010 at 18:04
День добрый! Нужная информация!!! Вот только не получается создать .mo файл! Добавил “__” и “_e” где надо. в Poedit указываю путь “C:\my-theme” Добавляю ключевые слова и выдает ошибку! Мол “не найдены файлы в сканируемых папках” Что это может быть?
марта 5, 2010 at 18:29
Прошу извенить! Я понял в чем была моя ошибка! Не верно ввел путь к теме! но появился другой вопрос! Я хочу создать двуязычный сайт - Русский и казахский языки! Я сделал перевод русскийх слов на казахский в файле .mo и теперь слова указываются на казахском языке, что впрочем логично! При смене языка на сайте не происходит таковое изменение, то есть все по прежнему на казахском! Я использую плагин WPML 1.1.0! Кто нибуть с такой ситуацией сталкивался?
марта 8, 2010 at 2:22
Shal, отлично что разобрались с первым вопросом
.
По второму — как у Вас называются файлы перевода .mo для русского и казахского языков? Может дело в том, что Вы их неправильно назвали?