MaxSite CMS - бесплатный «движок» вашего сайта! Легкая, мощная и надежная CMS - система управления сайтом. Никаких тормозов!

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

3 марта 2006 г. Просмотров: 12302 RSS 27
WordPress » Статьи о WordPress

(Обновление файлов см. http://maxsite.org/wp-rus/instruktsiya-po-russifikatsii-wordpress/)


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

Принцип следующий. Почти все текстовые сообщения 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'а уверяют, что это «де-факто стандарт», мы пойдем немного другим путем smile. Попроще smile

Суть его заключается в том, чтобы при выводе текста проверять его наличие в массиве перевода. Если он есть, то функция возвращает уже готовый перевод. Нечто подобное применяется например, для локализации форума 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).


twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru friendfeed.com google.com yandex.ru
Комментариев: 27
  1. Чувак ты просто молодец, спасибо тебе большое

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

  3. 2006-10-16 в 21:43:21 | Владимир#3

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

  4. 2006-11-16 в 17:06:50 | Владимир#4

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

  5. 2006-11-16 в 17:19:47 | Владимир#5

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

  6. 2006-11-16 в 23:20:00 | Максим#6

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

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

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

  7. 2006-11-18 в 19:10:03 | Владимир#7

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

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

  9. 2006-12-21 в 17:18:19 | Максим#9

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

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

  11. 2007-02-22 в 00:36:52 | Максим#11

    Вот так:

    <?php _e('E-Mail:'); ?>
  12. т.е. просто править текст плагина + добавлять нужные фразы в wp_language доп. фразы? Не проще ли тогда мне сразу в тексте плагина написать фразы на нужном мне языке?

  13. 2007-02-22 в 00:56:34 | Максим#13

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

  14. 2007-03-20 в 16:55:29 | Горные лыжи#14

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

  15. 2007-03-24 в 03:31:09 | allmoney.ws#15

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

  16. 2007-03-24 в 11:51:35 | Максим#16

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

  17. 2007-03-25 в 14:03:06 | allmoney.ws#17

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

  18. 2007-04-02 в 15:34:16 | земельные участки#18

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

  19. 2007-06-07 в 17:04:08 | Снять дом#19

    Да, у меня тоже не переводится...

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

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

  21. 2007-09-12 в 22:11:34 | Максим#21

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

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

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

    и

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

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

  23. 2007-09-13 в 13:03:53 | Максим#23

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

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

  25. 2007-09-13 в 14:47:26 | Максим#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. Сделал так, нечего вообще не выводит, пустая страница...

  27. Clayton, получилось у вас?

    У меня такая же проблема: при попытке заменить translate на tolang в строках

    return translate($text, $domain);

    и

    echo translate($text, $domain);

    WP начинает ругаться.

    Максим, может стоит переписать инструкцию? Вернее привести ее в порядок в соответствии с новыми переменными...Было бы здорово!

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена

Имя и сайт используются только при регистрации

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

Авторизация Войти через loginza

(обязательно)