Битрикс как подключить файл с переводом

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

Как в 1С-Битрикс подключить файл с переводом в компонентах и шаблонах

Для начала давайте разберемся где мы будем хранить переменную с языком. Вариантов довольно много – cookie, local storage или-же в дополнительных свойствах пользователя. Есть и другие способы. А вот еще дилемма – будет ли язык сам определяться при входе на сайт? 🙂 Как видите, вопросов на старте много и данную задачу можно решить несколькими способами.

Рассмотрим простой пример записи в куки:

<form id="form-lang" name="form-lang" action="" method="POST">
	<select name="lang" id="lang">
		<option<?if ($_COOKIE['LANG'] != 'ru'){ echo ' selected';}?> value="en">en</option>
		<option<?if ($_COOKIE['LANG'] == 'ru'){ echo ' selected';}?> value="ru">ru</option>
	</select>
</form>
<?if ($_POST['lang'] != false) {?>
	<?setcookie("LANG", $_POST['lang'], time()+86400, "/");?>
	<?LocalRedirect($_SERVER['HTTP_REFERER']);?>
<?}?>

Если мы применим этот код, у нас появится обычный селект с выбором языка. При отправке формы, записываем выбранный язык в куки-переменную LANG. После отправки делаем редирект чтобы избежать вопросов “почему я нажимаю F5 а у меня в браузере …”. К сожалению, 1С-Битрикс не решит все ваши траблы.

В файле header.php нашего шаблона объявляем константу:

if ($_COOKIE['LANG'] === 'ru') {
	define("MY_LANG", $_COOKIE['LANG']);
} else {
	define("MY_LANG", 'en');
}

Для подключения языка используются несколько способов, причем нужно внимательно смотреть что и где работает, а что нет:

<?IncludeTemplateLangFile(__FILE__);?>

<?__IncludeLang($_SERVER["DOCUMENT_ROOT"].'/contacts/lang/'.MY_LANG.'/index.php');?>

<?__IncludeLang($_SERVER["DOCUMENT_ROOT"].$templateFolder.'/lang/'.MY_LANG.'/template.php');?>

<?__IncludeLang($_SERVER["DOCUMENT_ROOT"].$templateFolder.'/lang/'.$_COOKIE['LANG'].'/template.php');?>

<?IncludeTemplateLangFile($_SERVER["DOCUMENT_ROOT"]."/bitrix/templates/".SITE_TEMPLATE_ID."/header.php", MY_LANG);?>

Для компонентов обычно используются первые 4 варианта, для шаблона соответственно последний. $templateFolder – папка шаблона. Кстати говоря, теперь вы понимаете почему в константе (и в куках) записывается язык явно, а не его ID :).

Не забывайте что все языковые файлы имеют вид:

<?
$MESS["TITLE"] = "Контакты";
?>

Хранятся такие файлы в соответствующей папке шаблона или компонента, и путь их лежит от шаблона:
lang/ru/component.php
где, ru соответствующий язык, а component.php соответствует имени файла, в котором используется вывод.

Для отображения воспользуемся битрикс методом GetMessage():

<?=GetMessage("TITLE")?>

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

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

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

автор: Dmitriy

З 2011 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

6 коментаря

  1. Как и ожидалось, в документации битрикса нет функции __IncludeLang(). Зато она есть в движке и она работает. Я целый день потратила в муках, пытаясь подключить языковой файл с английскими фразами для шапки и подвала. Наконец-то мои мучения с этим окончены. Спасибо за статью. Хоть она и стара, но все еще актуальна.

  2. Я что-то не совсем понимаю, как все работает…
    Мне дали сайт, на нем уже реализованы русская и английская версия, и мне нужно поставить французский и немецкий языки – для статичных статей и для динамичных компонентов. Компоненты там и через админку, и через апи идут. Там, где через апи вызов – там достаточно поменять id компонента. Забыла сказать, русская версия лежит в корне просто, для английской – вся публичная часть сайта скопирована в папку eng/ . Я сделала аналогично папки fr/ и de/ . Тут все работает.

    И тут я столкнулась с переводом без апи, простых компонентов, из шаблона.
    Я имею в виду перевод из /lang/fr/template.php и т.п.
    Изначально я задала аналогично уже существующим настройки – региональные и языки интерфейса (по интерфейсу везде русский, админка нужна везде русская). И это уже проверено, в зависимости от выбранного языка в LANG_ID добавляется папка eng/fr/de/ .
    Но почему в шаблоне обычных новостей не показывает французский хотя бы язык.. не понимаю… и никак там файлы языковые не подключаются, само ведь работает с английским..

    Буду рада любой подсказке)

    1. Здравствуйте) Как правило нужно смотреть в:
      1. настройки сайта и выставленного языка там
      2. наличие папок /lang/ – в компонентах, модулях, шаблонах
      3. наличия подключения языка по API – в компонентах, модулях, шаблонах
      4. привязка к сайту в инфоблоках
      5. правильная привязка к соотв. инфоблоку в папках типа /fr/news/ и т.д.

Залишити коментар до Dmitriy Скасувати коментар