Мой сайт о WordPress и PHP С Днем победы!
3 марта 2006

Руссификация WordPress

Читали 7418 раз
Рубрика: Мои статьи о WordPress
Навигация: Главная » WordPress » Мои статьи о 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).

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

26 комментариев к “Руссификация WordPress”

  1. romver.ru:

    Чувак ты просто молодец, спасибо тебе большое

  2. Serjio:

    Respect и уважуха!!!

  3. Владимир:

    Большое спасибо за информацию в этой записи и за WP в кодировке win1251 c набором полезных скриптов (не хватает фотогалереи). Например ANIga 0.26 (0.30 почему то у меня некорректно работает с mysql)

  4. Владимир:

    Можно ли сделать так, что б поддавались переводу тэги вида: Leave a comment

  5. Владимир:

    В скрипте для WP есть такой тэг$fim .= "Leave a comment";. В файл Wp-languages.php дописал такую строку 'Leave a comment'=>'Ваш комментарий',. Но перевода не последовало

  6. Максим:

    Как минимум вы должны изменить строчку так:

    $fim .= __("Leave a comment");

    Только в этом случае будет выполнен автоматический перевод.

  7. Владимир:

    Максим: cпасибо

  8. Van:

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

  9. Максим:

    Тогда переводите прямо в файлах темы, либо подключите wp-language.php, который описан здесь.

  10. shade33:

    А как быть в случае, когда в функции вывода сообщений используются домены, например, <?php _e('E-Mail:', 'subscribe-to-comments'); ?>

  11. Максим:

    Вот так:


    <?php _e('E-Mail:'); ?>

  12. shade33:

    т.е. просто править текст плагина + добавлять нужные фразы в wp_language доп. фразы? Не проще ли тогда мне сразу в тексте плагина написать фразы на нужном мне языке?

  13. Максим:

    Ну это самый лучший вариант ;) .

  14. Горные лыжи:

    To Максим, спасибо за подсказку

  15. allmoney.ws:

    "если не считать перевод календаря (файл locale.php)" - а мне как раз надо перевести только названия месяцев - но меняю английские написания на русские в файле locale.php и ничего не происходит... Подскажите, что делаю не так?

  16. Максим:

    Должно переводиться.

  17. allmoney.ws:

    Но не переводится :( (( Можете попробовать и сказать что я делаю не так?

  18. земельные участки:

    Полезная штука, пасиба

  19. Снять дом:

    Да, у меня тоже не переводится...
    А пошагово можете привести, что делать?

  20. Clayton:

    А для вордпресса мультиблогда такой способ пойдет?

  21. Максим:

    Должен подойти. Принцип там такой-же.

  22. Clayton:

    К сожелению перевести так и не получилось, внося настройки в файлы, заметил следующие изменения в файле, который нынче уже называется l10n.php в следующих строках:

    function __($text, $domain = 'default') {
    return translate($text, $domain);
    }

    и

    function _e($text, $domain = 'default') {
    echo translate($text, $domain);
    }

    В других строках изменений незаметил, в этих заменил значения translate на tolang, далее по описанному способу, однако перевода так и не появилось...

  23. Максим:

    Неправильно. Нужно сделать исправления только в функции translate.

  24. Clayton:

    Возможно я выразился как-то неверно, но именно это я и сделал, исправил только translate... ничего не вышло...

  25. Максим:

    Функции __() и _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);
    }
    
  26. Clayton:

    Сделал так, нечего вообще не выводит, пустая страница...


Оставьте комментарий! (Вы согласны с правилами)

 

:mrgreen: :neutral: :twisted: :arrow: :shock: :smile: :???: :cool: :evil: :grin: :idea: :oops: :razz: :roll: :wink: :cry: :eek: :lol: :mad: :sad: :!: :?:

При добавлении кода (html, php) заменяйте < на &lt; и > на &gt;.
Внимание: антиспам - зверь! Копируйте своё сообщение перед отправкой. На всякий случай.