Посетите Дворцовую площадь

Мультиязычность на Битриксе


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

Какие вообще есть варианты работы с языками?

Есть три способа настройки мультиязычности с точки зрения сео:

  • Один домен
  • Отдельные сайты
  • Поддомены

Разберём каждый.

Один домен

Плюсы:

  • Цена
  • Поддержка

Минусы:

  • Неявное определение
  • Проблемы с индексацией

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

Сама технология заключается в простом вытаскивании фраз в ланг-массивы и идентификации выбранного языка, звучит довольно просто, хоть и трудоёмко. Как и до этого, остаётся всего один сайт на проект, код не будут зависеть от языка на сайте, поэтому весь функционал будет предоставляться и ошибки будут исправляться сразу на всех языковых версиях.

Но тут есть большой подводный камень в самом механизме определении какой язык нужно выдавать. Если с пользователями ещё всё не так плохо, они в любой момент могут снова переключить язык в случае ошибки, то поисковики - настоящая проблема. Робот не может сознательно выбрать язык и поэтому ему будет показан или язык по умолчанию или какой-то случайный набор из разных языков на разных страницах. Даже если он сможет полностью проиндексировать сайт на одном языке, второй ему уже не скормить, потому что урлы страниц будут одинаковые, и в поисковике вас никогда не найдут по запросу на втором языке, который у вас между прочим представлен и над которым вы так долго мучились с переводом.

Отдельные сайты

Плюсы:

  • Никаких проблем с индексацией

Минусы:

  • Цена
  • Поддержка

Тут решается проблема со "смешиванием" языков из предыдущего способа, языковые версии теперь вообще не связаны между собой: урлы, код и база данных абсолютно разные. Можно даже разделять логику работы для разных языков.

Но возникает проблема с поддержкой сайтов и общей ценой проекта. Вы знаете, что на одной лицензии можно сделать два сайта, но уже для третьего придётся покупать новую лицензию. Сколько стоит лицензия Битрикса вашей редакции? Да к тому же хостинг и домены будут стоить на порядок больше. Если это не такая уж и проблема (домены стоят чуть ли не по 100 рублей, у вашего хостера нет ограничения на количество сайтов, а Битриксов вам подарили на жизнь вперёд), то поддержка такого проекта превратится в настоящий ад.

Представьте, что вы решили добавить новую кнопку в шапку сайта, а у вас есть 5 языков, программистам придётся 5 раз править код вместо одного, а это человекочасы и возможность допустить ошибку. А если на сайте ошибка, то история повторяется, придётся отлавливать её на 5 разных сайтах. Мониторить проект и продвигать в поисковиках также придётся 5 сайтов, а для тестировщиков это в буквальном смысле в пять раз больше работы.

Поддомены

Плюсы:

  • Никаких проблем с индексацией
  • Цена
  • Поддержка

Минусы:

  • В сравнении с остальными - никаких

Этот способ можно назвать комбинированным из предыдущих двух: поддомены - не обязательно разные сайты, но для поисковиков - всегда разные. В зависимости от варианта исполнения мультиязычности на поддоменах можно добиться и сохранения единства кодовой базы, и не получить проблем с поисковиками, а также сохранить деньги и время на поддержке, мониторинге, тестировании.

Однажды я реализовал такой функционал на Битриксе и вынес его в модуль Регионы продаж. Поддомены в нём виртуальные, но выбор информации строго привязан к текущему поддомену и не может дать сбой.

Другие варианты

Конечно, можно придумать и другие, более эзотерические способы, например, продублировать страницы в папке /en/ или работать через $_GET-параметр, но мы их не рассматриваем из-за того, что они уступают каждому уже рассмотренному случаю.

Конкретные действия

Ниже представлена пошаговая инструкция по разделению сайта на языковые версии с помощью модуля "Регионы продаж".

Шаг 1. Настройка

Подразумевается, что модуль вы уже купили и поставили, если нет, дублирую ссылку. Теперь в инфоблоке регионов создаём новое строковое свойство, в котором будем хранить идентификатор языка ("ru", "en", "de", ...). Указываем это свойство в настройках модуля.

Свойство для хранения идентификатора языка Настройка свойства языка в модуле регионов продаж

Шаг 2. Перевод надписей, кнопок, статичного текста

В любом файле, в котором фразы для пользователей прописаны прямо в коде, например, header.php шаблона, вставьте в самое начало код подключения языковых фраз, на примере того же header.php это можно сделать так:

use Bitrix\Main\Localization\Loc;
Loc::loadMessages($_SERVER["DOCUMENT_ROOT"]."/bitrix/templates/".SITE_TEMPLATE_ID."/header.php");

Сам файл с ланг-массивом должен лежать по адресу /lang/{id языка}/{указанный путь}, для русского id языка - "ru". Он имеет вид:

<?
$MESS["Ключ массива"] = "Фраза";
$MESS["Другой ключ"] = "Другая фраза";
...
?>

А теперь заменяем нужную фразу на код:

<?=Loc::getMessage("Ключ массива");?>

Если вы это всё сейчас проделали, проверьте, ничего не должно измениться, что логично.

Теперь попробуйте другой язык, например, английский. Для этого в папке lang создайте папку en и продублируйте в ней структуру и файлы папки ru, оставьте ключи массивов в файлах такими же, но сами фразы переведите. Теперь на поддомене, который отвечает за английский на том же самом месте, должна быть фраза на английском.

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

Работу со свойствами страниц (мета, например) можно организовать также.

Шаг 3. Компоненты

С компонентами мы поступаем точно также, только там корнем для lang являются корень шаблона или корень компонента, вы можете увидеть пример в стандартных компонентах.

Шаг 4. Инфоблоки

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

"IBLOCK_ID" => $_SESSION["VREGIONS_REGION"]["LANG_ID"] == "en" ? "17" : "10"

Или если языков, больше двух, то можно хранить id инфоблока в инфоблоке регионов и выводить через сессию:

"IBLOCK_ID" => $_SESSION["VREGIONS_REGION"]["CATALOG_IBLOCK_ID"],

Другая идея состоит в том, чтобы создать для элементов доп. свойство(а), например, "Название на английском", и передавать идентификатор языка в $arParams и прописывать условия в template.php.


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

Если у вас нет штатного программиста, но перевести сайт хочется, напишите мне на aristov-92@mail.ru и я сам позабочусь о коде.



Аристов Василий
Разработчик всех модулей на проекте

Теги



Что-то осталось непонятным или вы нашли неточность? Напишите, пожалуйста об этом в комментариях.

Написать комментарий

Чтобы писать комментарии, вам нужно войти на сайт

Авторизоваться через соцсеть

Авторизоваться через vk.com Авторизоваться через facebook.com

Хотите такие же комментарии себе на сайт? Купите готовый к установке модуль