multilanguage wordpress + jLanguage hacking
Jan 07 2008Все должны понимать, что многоязычный контент это труъ. Кто не понимает, то ошибается. Я беру более-менее общие случаи, когда материал может быть интересен людям, не владеющим его языком. Да и согласитесь, большинству из нас приятнее читать статьи в той же Википедии на своём родном языке. Мне вот приятнее читать статьи на русском или беларуском языке, это помогает абстрагироваться от процесса перевода и читать, а не читать и переводить одновременно.
Свой блог я сделал многоязычным чуть ли не по религиозным причинам. Большинство моих читателей живет за территорией Беларуси, мало того, для абсолютного большинства беларуский язык не является не то что основным, родным не является. RSS ленту беларускоязычной версии читает 2 человека по соображениям feedburner. Что же, читают не только через ленту, а тем, у кого в браузере стандартным стоит беларуский, в большинстве случаев и покажет соответствующий контент. Эдакий мой персональный культурный резистанс :-) Но все это вступление.
А теперь к сути. Все эти переводы реализуются с помощью плагина, т.к. сам по себе WordPress не предоставляет по умолчанию средств к локализации. О WPLANG я расскажу далее. Плагин этот – jLanguage, на данный момент версии 2.2. В общем и целом суть проста – определяем язык пользователя полуавтоматом (по настройкам браузера или по данным URL), ищем контент на нужном языке и выдаём, если не находим – выдаём стандартное. Все предельно просто, не правда ли? Сам контент переводится в следующем стиле:
[russian]текст на русском[/russian]
[belarusian]тэкст па-беларуску[/belarusian]
[english]text in english[/english]
Идея не нова, так или иначе её реализовывало много плагинов, просто большинство из них либо довольно плохо работают, либо в новых версиях WordPress вообще не работают.
Теперь перейдем к недостаткам. Плагин реализует только перевод заголовков и самих текстов. Остальное все ручками надо доделывать :-)
Для начала забудем о неполном функционале и заметим баг. Суть в том, что плагин при переключении на альтернативный язык javascript скриптом после загрузки страницы добавляет ко всем ссылкам атрибут lan=язык. Баг найден камрадом Serzh, исправлен мной. JavaScript я не знал, к документации не обращался, но оно удивительным образом работает. Патч можно скачать отсюда.
Снова вернемся к нашим баранам, а точнее к расширению функционала.
К переводу информации на нашем сайте неплохо было бы добавить и перевод всего сопутствующего функционала, как то даты, фразы “Добавить комментарий” и прочая. В WordPress за это отвечает Gettext, но он берет информацию о текущем языке из константы WPLANG. Кроме того есть фильтр locale. Остаётся только установить соответствие между текущим языком, определенным плагином jLanguage и языком WordPress. Что ж, дорогой читать, и это я сделал за тебя :-) Плагин можно скачать отсюда: wplang_changer-0.1c.tar.gz.
Замечания: для настройки придется немного подправить текст плагина, если хотите использовать языки, отличные от русского, беларуского и английского. Вам придется найти в файле следующую строку
$languages = array(‘russian’ => ‘ru_RU’, ‘belarusian’ => ‘be_BY’, ‘english’ => ‘en’);
И добавить в массив необходимые языки и их коды. Плагин использует класс jLanguage2, который держит с собой. Функционала jLanguage он не предоставляет равно как и возможностей настройки. Используйте только на пару с jLanguage. Также не забудьте поместить в директорию wp-includes/languages используемые файлы перевода на нужные языки (например ru_RU.mo, be_BY.mo), их найдете в локализованных пакетах WordPress.
Двигаемся далее в направлении совершенства :-) На очереди категории. Для начала стоит указать, что в WordPress длина названий категорий ограничено 55 знаками и для расширения нам придется выполнить следующий запрос в базе данных (например через phpMyAdmin):
ALTER TABLE префикс_таблицterms MODIFY name VARCHAR(255) NOT NULL
Префикс таблиц указывается в wp-config.php как $table_prefix.
Теперь длины названий должно хватить даже с учетом написания на паре языков с их полными названиями. Категории переводятся абсолютно аналогично другому контенту и названиям (см. выше). Далее нам нужно добавить фильтры для категорий в плагин jLanguage, добавляем следующие строки:
// Перевод категорий
add_filter(‘the_category’, ‘jLanguage_processTitle’);
add_filter(’single_cat_title’, ‘jLanguage_processTitle’);
add_filter(‘list_cats’, ‘jLanguage_processTitle’);
Подобные фильтры можно дописать и к другому контенту, например к ссылкам. Напоследок добавлю, что можно использовать функционал jLanguage в теме и своих плагинах, например при собственной выборке из базы данных.
Я пытался наиболее понятно показать возможности применения сторонних разработок для собственных нужд, рассказал возможности расширения. Как всегда, на абсолютную полноту материал не рассчитывает, он просто собирает то, что мне было полезно для собственной разработки, надеюсь будет кому-нибудь полезно. Комментарии приветствуются :-)




ooh maan
I wish you would have that hack in english too.
I’ve been trying to find a writing that teaches me how to handle categories and other page elements with jlanguage
If you have seen any sites with some english info ot’d be more than appreciated
thanks
petimi
I don’t know, but i can make patched jLanguage version to make handling more elements with translation possible. If you really need it :)
This hack is for any language