Руссификация 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; //< - нам нужна эта строчка
...
Заменяем эту строчку на:
return tolang($text);
Чуть ниже ищем:
function _e($text, $domain = 'default') {
...
echo $text; //< - нам нужна эта строчка
...
И заменяем на:
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='Submit Comment' />
А правильно так:
<input name='submit' type='submit' id='submit' tabindex=5
value='<?php _e('Submit Comment'); ?>' />
Дальше в файле 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).
Постоянная ссылка: http://maxsite.org/?p=8
Версия для печати
