В Битрикс можно реализовать многоязычность не создавая копий сайтов или копий шаблонов под каждый язык отдельно.
Для этого можно использовать urlrewrite.php от битрикс, задавая правила перенаправления для страниц /ru/* или /* , или /en/* на соответствующий index.php файл, единственный, находящийся внутри соответствующего каталога. Гуглите urlrewrite.php, дальше разбирайтесь с регулярными выражениями в нём.
Затем внутри шаблона сайта надо создать директорию /lang/ , а внутри неё /lang/ru/ и /lang/en/, можно и больше, смотря сколько языков. Внутри этих каталогов можно создавать файлы header.php и footer.php, с массивами $MESS['text1'] = 'Первая фраза', а в английской версии $MESS['text1'] = 'First text'. Свой каталог lang с переводами, отдельный, можно добавить внутри любого компонента или раздела, а затем, при помощи класса Loc выводить текст.
[CODE]use Bitrix\Main\Localization\Loc;
Loc::loadLanguageFile(__FILE__);
echo Loc::GetMessage('text1');[/CODE]Загуглите эти методы, думаю найдутся и более подробные инструкции.
Так же я создавал внутри директории /local/ рекомендуемой bitrix как приоритетную для написания шаблонов и компонентов свой подкаталог /php_interface/ , добавил туда init.php , который запускается раньше всех других скриптов, и внутри него написал:
[CODE] $lang = 'ru';
if (isset($_REQUEST['LANG'])) {
$lang = $_REQUEST['LANG'];
}
define('LANGUAGE', $lang);
// Задаём текущий язык для класса Loc
\Bitrix\Main\Localization\Loc::setCurrentLang( $lang );
[/CODE]У класса Loc так же есть статический метод getCurrentLanguage() , который вернёт заданный на старте язык. Его удобно использовать для проверки какой язык сейчас выбран. Я, например, вывожу язык дополнительным атрибутом к тэгу BODY, что бы на javaScript потом легко можно было понять какой язык используется, вот так:
[CODE]<body class="d-flex flex-column justify-content-between" lang="<?=Loc::getCurrentLang()?>">
[/CODE]А меню выбора языка вот так:[CODE] <ul class="nav navbar-nav top-menu-1">
<li class="root menu-language">
<?php
$page = $APPLICATION->GetCurPage();
$page = str_replace('/en/', '/', $page);
?>
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<img src="<?= SITE_TEMPLATE_PATH ?>/img/<?=Loc::getCurrentLang()?>.svg" class="language-image"> <?=Loc::getMessage( Loc::getCurrentLang() )?> <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li>
<a href="<?=$page?>"><img src="<?= SITE_TEMPLATE_PATH ?>/img/ru.svg" class="language-image"> <?=Loc::getMessage('ru')?></a>
</li>
<li>
<a href="/en<?=$page?>"><img src="<?= SITE_TEMPLATE_PATH ?>/img/en.svg" class="language-image"> <?=Loc::getMessage('en')?></a>
</li>
</ul>
</li>
</ul>
[/CODE]Надеюсь моё решение кому-нибудь поможет.
Для этого можно использовать urlrewrite.php от битрикс, задавая правила перенаправления для страниц /ru/* или /* , или /en/* на соответствующий index.php файл, единственный, находящийся внутри соответствующего каталога. Гуглите urlrewrite.php, дальше разбирайтесь с регулярными выражениями в нём.
Затем внутри шаблона сайта надо создать директорию /lang/ , а внутри неё /lang/ru/ и /lang/en/, можно и больше, смотря сколько языков. Внутри этих каталогов можно создавать файлы header.php и footer.php, с массивами $MESS['text1'] = 'Первая фраза', а в английской версии $MESS['text1'] = 'First text'. Свой каталог lang с переводами, отдельный, можно добавить внутри любого компонента или раздела, а затем, при помощи класса Loc выводить текст.
[CODE]use Bitrix\Main\Localization\Loc;
Loc::loadLanguageFile(__FILE__);
echo Loc::GetMessage('text1');[/CODE]Загуглите эти методы, думаю найдутся и более подробные инструкции.
Так же я создавал внутри директории /local/ рекомендуемой bitrix как приоритетную для написания шаблонов и компонентов свой подкаталог /php_interface/ , добавил туда init.php , который запускается раньше всех других скриптов, и внутри него написал:
[CODE] $lang = 'ru';
if (isset($_REQUEST['LANG'])) {
$lang = $_REQUEST['LANG'];
}
define('LANGUAGE', $lang);
// Задаём текущий язык для класса Loc
\Bitrix\Main\Localization\Loc::setCurrentLang( $lang );
[/CODE]У класса Loc так же есть статический метод getCurrentLanguage() , который вернёт заданный на старте язык. Его удобно использовать для проверки какой язык сейчас выбран. Я, например, вывожу язык дополнительным атрибутом к тэгу BODY, что бы на javaScript потом легко можно было понять какой язык используется, вот так:
[CODE]<body class="d-flex flex-column justify-content-between" lang="<?=Loc::getCurrentLang()?>">
[/CODE]А меню выбора языка вот так:[CODE] <ul class="nav navbar-nav top-menu-1">
<li class="root menu-language">
<?php
$page = $APPLICATION->GetCurPage();
$page = str_replace('/en/', '/', $page);
?>
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<img src="<?= SITE_TEMPLATE_PATH ?>/img/<?=Loc::getCurrentLang()?>.svg" class="language-image"> <?=Loc::getMessage( Loc::getCurrentLang() )?> <b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li>
<a href="<?=$page?>"><img src="<?= SITE_TEMPLATE_PATH ?>/img/ru.svg" class="language-image"> <?=Loc::getMessage('ru')?></a>
</li>
<li>
<a href="/en<?=$page?>"><img src="<?= SITE_TEMPLATE_PATH ?>/img/en.svg" class="language-image"> <?=Loc::getMessage('en')?></a>
</li>
</ul>
</li>
</ul>
[/CODE]Надеюсь моё решение кому-нибудь поможет.