Как я сделал сайт на Joomla двуязычным и наконец понял, как это работает

2languagesКогда мне понадобилась английская страница BSL‑Timer, задача казалась элементарной: создать копию русского материала, перевести текст и выбрать для него английский язык.

Но Joomla быстро дала понять, что одного переведённого материала недостаточно.

Мне хотелось не просто опубликовать где-то английский текст, а получить нормальную структуру:

  • русская страница BSL‑Timer должна оставаться по адресу /soft/bsl-timer;
  • английская — открываться по адресу /en/software/bsl-timer;
  • переключатель языка должен переводить посетителя с одной версии страницы на другую;
  • остальные материалы сайта, которые пока существуют только на русском, не должны внезапно исчезнуть или потребовать немедленного дублирования.

Поначалу устройство мультиязычности Joomla казалось мне архитектурным бредом. Особенно раздражала необходимость создавать отдельные домашние страницы и пункты меню. Возникал закономерный вопрос: неужели теперь для каждого англоязычного материала придётся создавать собственный пункт меню?

Нет, не придётся.

Проблема заключалась не в Joomla, а в том, что я пытался воспринимать переключатель языка как кнопку автоматического перевода. На самом деле Joomla работает иначе.

Она создаёт несколько языковых ветвей сайта.

У каждой ветви могут быть:

  • свой язык контента;
  • своё меню;
  • своя домашняя страница;
  • свои категории;
  • свои материалы;
  • собственная структура адресов.

А компонент Associations связывает соответствующие элементы этих ветвей между собой.

Язык выбирает не браузер

Браузер не смотрит на две соседние статьи и не решает, какая из них русская, а какая английская. И Joomla не переводит содержимое автоматически.

Когда посетитель открывает адрес /soft/bsl-timer, Joomla получает маршрут русской страницы. Когда он переходит на /en/software/bsl-timer, маршрутизатор ведёт его по английской ветви сайта.

Плагин Language Filter учитывает выбранный язык, а связанные пункты меню, категории и материалы помогают Joomla построить правильный маршрут.

Иными словами, адрес страницы возникает не из языка текста как такового. Он складывается из языкового префикса, структуры меню, категории и алиаса материала.

Что понадобилось настроить

Сначала были опубликованы два языка контента:

  • Russian — ru-RU;
  • English (UK) — en-GB.

Затем был включён плагин Language Filter и опубликован модуль Language Switcher.

Для каждого языка потребовалась собственная домашняя страница. Они нужны не потому, что к каждому материалу обязательно должен вести отдельный пункт меню, а потому, что Joomla должна понимать, где начинается каждая языковая ветвь сайта.

Это принципиальная разница.

Отдельная домашняя страница нужна языку. Отдельный пункт меню не требуется каждому материалу.

Для английской части была создана категория:

  • Title: Software;
  • Alias: software;
  • Language: English.

В неё поместилась английская версия материала BSL‑Timer. Благодаря этому получился ожидаемый адрес:

/en/software/bsl-timer

Русская версия осталась в категории «Софт» по адресу:

/soft/bsl-timer

После этого русская и английская категории, пункты меню и материалы были связаны через Associations.

Что делает Associations

Associations не объединяет два текста в один и не синхронизирует их содержимое.

Это просто явная связь:

  • данный русский материал соответствует вот этому английскому;
  • данная русская категория соответствует вот этой английской;
  • данный русский пункт меню соответствует вот этому английскому.

Когда посетитель нажимает переключатель языка, Joomla смотрит, существует ли связанный объект на другом языке. Если существует, открывает именно его.

Поэтому с русской страницы BSL‑Timer посетитель попадает не на абстрактную английскую главную, а непосредственно на английскую страницу той же программы.

Что делать со старыми материалами с языком All

До начала этой работы все категории и материалы сайта были опубликованы с языком All.

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

Этого делать не нужно.

Материалы с языком All остаются общими и продолжают отображаться. Переводить весь сайт за один день никто не заставляет.

Явно назначать русский или английский язык имеет смысл тем элементам, которые уже получили полноценную языковую пару. Поэтому двуязычность можно вводить постепенно: сначала для одного раздела или продукта, затем для следующего.

Именно так сейчас устроен BSL‑World. Двуязычная архитектура уже работает, но английская версия сайта будет наполняться постепенно.

Где отображается переключатель

Модуль Language Switcher размещён в позиции toolbar-left и использует язык All.

При этом я решил показывать его только там, где действительно существуют языковые версии материалов — в разделах «Софт» и Software.

Так посетитель не получает переключатель, который обещает английскую страницу там, где перевода пока нет.

В списке отображаются Russian и English (UK), вместе с флагами. Насчёт English (UK) у меня сначала возникли почти этические сомнения: не обидятся ли американцы?

Надеюсь, переживут. Американского флага и так уже слишком много. В конце концов, именно британский языковой пакет уже используется в Joomla, а флаг делает переключатель заметнее. 😉

Итоговая схема

В результате получились две связанные ветви:

ЭлементРусская версияАнглийская версия
Язык ru-RU en-GB
Категория Софт Software
Адрес категории /soft /en/software
Материал BSL‑Timer на русском BSL‑Timer на английском
Адрес материала /soft/bsl-timer /en/software/bsl-timer

После этого устройство мультиязычного сайта наконец перестало выглядеть нагромождением лишних сущностей.

Язык определяет ветвь. Меню формирует маршрут. Категория задаёт структуру. Материал содержит текст. Associations связывает эквиваленты. Language Switcher переводит посетителя между ними.

Когда понимаешь эту схему, всё становится довольно логично.

Но до этого момента Joomla успевает несколько раз убедить тебя, что специальность веб-разработчика придумали люди, которым было мало обычных способов страдать. 😉

Добавить комментарий