Руссификация WordPress
Пятница, 3 марта 2006 г.
Просмотров: 5672
Подписаться на комментарии по RSS
(Обновление файлов см. 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).



Комментариев: 27
Чувак ты просто молодец, спасибо тебе большое
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 начинает ругаться.
Максим, может стоит переписать инструкцию? Вернее привести ее в порядок в соответствии с новыми переменными...Было бы здорово!