Второй язык сайта - языки и сайты, тексты шаблона, переключатель
Делаем вторую языковую версию сайта: отдельная витрина со своим языком, тексты шаблона в языковых файлах, переключатель и письма на нужном языке.
Что нужно знать заранее
Языковая версия сайта делается отдельным сайтом внутри той же установки. У него свой язык интерфейса, свой шаблон, свой каталог адресов и свои почтовые шаблоны, а ядро и база остаются общими.
Язык интерфейса и язык содержимого сайта - это две разные вещи. Первый отвечает за надписи административной части и служебные сообщения, второй - за тексты, которые пишет контент-менеджер.
Надписи шаблона выносят в языковые файлы рядом с самим шаблоном. Иначе вторая версия наследует первую дословно, и переводить приходится правкой вёрстки в двух местах сразу.
Шаги
- Завести второй сайт с нужным языком, каталогом адресов и своим шаблоном.
- Вынести все надписи шаблона в языковые файлы и подключить их вызовом.
- Поставить переключатель, ведущий на ту же самую страницу другой языковой версии.
- Завести почтовые шаблоны для второго сайта и проверить отправку тестовым письмом.
- Пройти обе витрины по одинаковому чек-листу и сверить результат построчно.
Решение
Смотрим сайты и их языки:
$rs = \Bitrix\Main\SiteTable::getList(['select' => ['LID', 'LANGUAGE_ID', 'DIR', 'SERVER_NAME', 'ACTIVE'], 'order' => ['SORT' => 'ASC']]);foreach ($rs as $site) { printf("%s язык=%s папка=%s домен=%s\n", $site['LID'], $site['LANGUAGE_ID'], $site['DIR'], $site['SERVER_NAME']);}Каталог адресов и домен решают, как выглядит вторая версия. Отдельный домен удобнее для продвижения, каталог внутри домена - дешевле в обслуживании и сертификатах.
Выносим надписи шаблона в языковой файл:
$MESS['HEADER_CART'] = 'Корзина';// /local/templates/main/lang/en/header.php$MESS['HEADER_CART'] = 'Cart';Подключаем перевод в шаблоне:
use Bitrix\Main\Localization\Loc;Loc::loadMessages(__FILE__); // подключает файл языка текущего сайта?><a href="/personal/cart/"><?= Loc::getMessage('HEADER_CART') ?></a>Файл языка ищется по языку текущего сайта. Поэтому одна и та же строка шаблона на русской витрине даёт «Корзина», а на английской - «Cart», и второй шаблон заводить не нужно.
Ставим переключатель версий:
$path = $APPLICATION->GetCurPage(); // текущая страница без параметров$en = str_starts_with($path, '/en/') ? $path : '/en' . $path;$ru = str_starts_with($path, '/en/') ? substr($path, 3) : $path;printf('<a href="%s">RU</a> <a href="%s">EN</a>', $ru, $en);Переключатель обязан вести на ту же самую страницу другой версии. Ссылка на главную вместо текущей страницы - самая частая претензия посетителей к языковым версиям.
Заводим письма для второго сайта:
$rs = \Bitrix\Main\Mail\Internal\EventMessageTable::getList(['filter' => [ '=EVENT_NAME' => 'SALE_NEW_ORDER'], 'select' => ['ID', 'LID', 'SUBJECT']]);print_r($rs->fetchAll()); // шаблона для второй витрины может не оказатьсяПроверяем обе витрины одинаково:
curl -s https://example.com/catalog/ | grep -o '<title>[^<]*'curl -s https://example.com/en/catalog/ | grep -o '<title>[^<]*'# разные заголовки означают, что вторая версия действительно свояТипичные проблемы
На английской витрине половина надписей по-русски.
Надписи записаны прямо в вёрстке шаблона, а не в языковых файлах. Все строки шаблона выносят в файлы языка и подключают их вызовом перевода.
Письма приходят на языке основной витрины.
Почтовый шаблон заведён только для первого сайта и берётся как единственный. Для каждой витрины заводят свой шаблон письма с её кодом сайта.
Переключатель всегда ведёт на главную страницу.
Ссылка переключателя собрана статически, без учёта текущего адреса открытой страницы. Адрес другой версии собирают из текущего пути, подставляя каталог нужной витрины.
Товары второй витрины совпадают с первой дословно.
Каталог у витрин общий, а переводы названий и описаний не заведены вовсе. Переводы хранят отдельными свойствами товара или отдельным инфоблоком под вторую витрину.
Поиск на второй витрине находит русские страницы.
Поиск ищет по общему индексу площадки без отбора по текущему сайту. Компоненту поиска задают отбор по текущей витрине, иначе выдача смешивает обе версии.
Частые вопросы
Обязательно ли заводить второй сайт?
Для полноценной языковой версии - да: язык задаётся у сайта. Пара переведённых страниц может жить и на одном сайте, но дальше это становится дороже.
Каталог адресов или отдельный домен?
Каталог внутри домена дешевле: один сертификат и одна настройка веб-сервера. Отдельный домен выбирают ради продвижения в другой стране.
Как переводить содержимое каталога?
Отдельными свойствами перевода или отдельным инфоблоком под вторую витрину. Выбор зависит от того, кто ведёт переводы и как часто они меняются.
Что с административной частью?
Её язык задаётся у сотрудника в профиле и не зависит от языка витрины. Менеджер второй версии может работать в привычном ему интерфейсе.
Нужны ли отдельные обработчики для второй версии?
Обычно нет: код общий, а различия сводятся к текущему сайту в условиях. Отдельные обработчики появляются, только когда логика версий действительно разная.
Смежное
- Настройки и мультисайт - оглавление подтемы
- Второй сайт на одном ядре: домен, папка, шаблон, общие данные - как заводят вторую витрину
- Данные на двух сайтах: каталог, цены, заказы, письма - что делить между версиями
- Код для двух сайтов: текущий сайт, настройки, общие данные - условия по текущему сайту в коде
- Многоязычный каталог: второй сайт, переводы товаров и корзина - переводы содержимого каталога
- Языковые файлы: сообщения, подстановки, второй язык - устройство языковых файлов
- Своё письмо с сайта: тип события, шаблон, поля и отправка - письма для каждой витрины
- Ядро D7 - устройство ядра целиком