Руссификация WordPress
(Обновление файлов см. http://maxsite.org/wp-rus/instruktsiya-po-russifikatsii-wordpress/)
Начнем с того, что WordPress не имеет каких-то простых средств для локализации, если не считать перевод календаря (файл locale.php). Поэтому мы просто пойдем на маленькую хитрость. ![]()
Принцип следующий. Почти все текстовые сообщения WP выводит через функции:
function __($text, $domain = 'default')
function _e($text, $domain = 'default')
которые находятся в файле wp-l10n.php (каталог «wp-includes»).
Разница между этим функциями в том, что первая просто возвращает значение через return, а вторая выводит через echo.
Некоторые технические подробности того, как в WordPress'е происходит «стандартная» локализация.
По-идее, весь вывод должен происходить через описываемые функции. В этом случае появляется возможность использовать т.н. «модульный перевод». Принцип его в том, что исходные файлы WordPress'а обрабатываются специальными программами и создаются три файла, в которых хранятся «положения» выводящих функций (объектный шаблон - Portable Object Template), список сообщений (Portable Object) и скомпилированный файл (Machine Object). То есть создается некий шаблон-каркас через который «пропускаются» выводимые сообщения. В теории это все красиво, но на практике для того, чтобы поменять перевод нужно заново компилировать po- и mo-файлы, что не совсем удобно. Кроме этого файлы локализации получаются «привязанными» к конкретной версии WordPress'а, что опять же не желательно. Ну и последний недостаток это то, что файлы локализации получаются достаточно объемными. Например, русская локализация занимает примерно 250 Кб, что может серьезно сказаться на скорости выполнения PHP-скриптов. Во всяком случае на localhost'е WordPress работает с вполне заметным притормаживанием.
И хотя, разработчики WordPress'а уверяют, что это «де-факто стандарт», мы пойдем немного другим путем
. Попроще ![]()
Суть его заключается в том, чтобы при выводе текста проверять его наличие в массиве перевода. Если он есть, то функция возвращает уже готовый перевод. Нечто подобное применяется например, для локализации форума InvisionBoard. Плюс такого подхода в том, что вы сможете самостоятельно изменять файл перевода и он не будет зависеть ни от версии WordPress'а, ни любых других изменений в php-файлах.
Сам хакинг займет всего 3-5 минут (не считая, есно, перевода) и не потребует от вас особых знаний.
Хакинг
Приступаем. Открываем wp-l10n.php и ищем строки:
function __($text, $domain = 'default') {
...
return $text; <font color="navy">//< - нам нужна эта строчка</font>
...
Заменяем эту строчку на:
return tolang($text);
Чуть ниже ищем:
function _e($text, $domain = 'default') {
...
echo $text; <font color="navy">//< - нам нужна эта строчка</font>
...
И заменяем на:
echo tolang($text);
Далее. Перед функцией function __($text, $domain = 'default') пишем свою:
function tolang($t) {
global $to_languages;
$at=trim($t);
$akey=array_keys($to_languages);
if (in_array( $at, $akey )) {
$tr=$to_languages[$at];
} else
{
$at=strtolower(trim($t));
if (in_array( $at, $akey )) {
$tr=$to_languages[$at];
} else
{
$tr=$t;
}
}
return $tr;
}
Открываем файл wp-config.php и в нем ПЕРЕД строчкой:
require_once(ABSPATH.'wp-settings.php');
добавляем:
require_once(ABSPATH.'wp-language.php');
Файл-словарь wp-language.php (вы его скачиваете у меня) скопируйте туда же где и wp-config.php (то есть в главный каталог).
Всё! Ничего нигде включать не нужно! Все начнет работать сразу же!
Перевод
Теперь о нюансах перевода. (Дальше идут только примеры, вам не нужно их прописывать - я просто показываю возможные варианты, которые могут возникнуть при использовании различных плагинов и шаблонов.)
Во-первых я не ставил цели переводить абсолютно все, поскольку у вас появляется возможность самостоятельно добавить или изменить перевод. В целом у меня получилось перевести почти всю админ-панель, некоторые плагины, а также часто встречающиеся слова в шаблонах.
Второе. Переводиться будет только текст, выводящийся через функции __() и _e(). Во многих шаблонах, дизайнеры упрощают себе жизнь и не используют эти функции. Вот пример из «стандартного» Kubrick'а:
Исходный текст из шаблона:
<input name='submit' type='submit' id='submit' tabindex=5
value='<font color="red">Submit Comment</font>' />
А правильно так:
<input name='submit' type='submit' id='submit' tabindex=5
value='<font color="red"><?php _e('Submit Comment'); ?></font>' />
Дальше в файле wp-language.php прописываем:
'Submit Comment' => 'Отправить',
Думаю идея понятна.
Третье. Некоторые сообщения содержат HTML-тэги, спецсимволы или элементы форматирования. В этом случае на странице вы их не увидите и как бы вы не добавляли их в файл, перевода не последует. Вот примеры:
'<strong>Order</strong> by:' => '<strong>Сортировать</strong> по:', 'view all posts in %s' => 'Смотреть все сообщения в %s',
В этом случае вам нужно будет найти в php-файле вывод этого текста (английского!) и скопировать его целиком в файл wp-language.php.
Не забывайте о запятых между элементами, а также о кавычках!
И последнее. Руссификатор вначале ищет английские слова С УЧЕТОМ регистра, а если не нашел, то смотрит уже без учета регистра (в нижнем). Это сделано для того, чтобы исключить лишнее дублирование одного и того же английского слова, но набранное разным регистром - такое частенько встречается в шаблонах.
Поэтому, если не хотите лишних проблем, то лучше сразу английский текст (в файле wp-language.php) писать в нижнем регистре. В специальных случаях, как например в функциях вывода календаря, регистр наоборот, не меняйте. В английских фразах удаляйте ведущие и конечные пробелы (функция их автоматически отсекает).
Скачать руссификацию: http://maxsite.org/wp-files/wp-language.zip
ps Обратите внимание, что языковой модуль рассчитан на кодировку Windows-1251. Если у вас другая кодировка, вам нужно переконвертировать файл-словарь (wp-language.php).
- Отображение виджетов в сайдбарах при разных условиях
- Что такое ping и traсkbaсk?
- К вопросу о кодировке WordPress
- Делаем выбор RSS-подписок сайта для браузера
- Форма обратной связи
- Исправляем кодировку Ping в WordPress’е
- Проблемы русского WordPress’а
- Возвращаясь к вопросу кодировки
- “Ускоряем” WordPress за счет постоянных страниц
- Деление страниц в WordPress’е
- FAQ по WordPress
- Пишем в блог с помощью Google
- Как публиковать свои посты, чтобы читать их было удобно
- Проблемы кодировки trackback и ее решение
- Для чего подходит и не подходит WordPress






Чувак ты просто молодец, спасибо тебе большое
Respect и уважуха!!!
Большое спасибо за информацию в этой записи и за WP в кодировке win1251 c набором полезных скриптов (не хватает фотогалереи). Например ANIga 0.26 (0.30 почему то у меня некорректно работает с mysql)
Можно ли сделать так, что б поддавались переводу тэги вида: Leave a comment
В скрипте для WP есть такой тэг
$fim .= "Leave a comment";. В файл Wp-languages.php дописал такую строку'Leave a comment'=>'Ваш комментарий',. Но перевода не последовалоКак минимум вы должны изменить строчку так:
$fim .= __("Leave a comment");Только в этом случае будет выполнен автоматический перевод.
Максим: cпасибо
Вот лично для меня админка на английском гораздо удобнее, но вот хотелось бы перевести все остальное для юзеров
Тогда переводите прямо в файлах темы, либо подключите wp-language.php, который описан здесь.
А как быть в случае, когда в функции вывода сообщений используются домены, например, <?php _e('E-Mail:', 'subscribe-to-comments'); ?>
Вот так:
<?php _e('E-Mail:'); ?>т.е. просто править текст плагина + добавлять нужные фразы в wp_language доп. фразы? Не проще ли тогда мне сразу в тексте плагина написать фразы на нужном мне языке?
Ну это самый лучший вариант ;).
To Максим, спасибо за подсказку
"если не считать перевод календаря (файл locale.php)" - а мне как раз надо перевести только названия месяцев - но меняю английские написания на русские в файле locale.php и ничего не происходит... Подскажите, что делаю не так?
Должно переводиться.
Но не переводится :((( Можете попробовать и сказать что я делаю не так?
Полезная штука, пасиба
Да, у меня тоже не переводится...
А пошагово можете привести, что делать?
А для вордпресса мультиблогда такой способ пойдет?
Должен подойти. Принцип там такой-же.
К сожелению перевести так и не получилось, внося настройки в файлы, заметил следующие изменения в файле, который нынче уже называется l10n.php в следующих строках:
и
В других строках изменений незаметил, в этих заменил значения translate на tolang, далее по описанному способу, однако перевода так и не появилось...
Неправильно. Нужно сделать исправления только в функции translate.
Возможно я выразился как-то неверно, но именно это я и сделал, исправил только translate... ничего не вышло...
Функции __() и _e() трогать не нужно вообще. Меняется только translate:
function translate($text, $domain) { global $l10n; if (isset($l10n[$domain])) return apply_filters('gettext', $l10n[$domain]->translate($text), $text); else return tolang($text); }Сделал так, нечего вообще не выводит, пустая страница...
Clayton, получилось у вас?
У меня такая же проблема: при попытке заменить translate на tolang в строках
и
WP начинает ругаться.
Максим, может стоит переписать инструкцию? Вернее привести ее в порядок в соответствии с новыми переменными...Было бы здорово!