Как фраза попадает на страницу
Эта часть — для того, кто пишет шаблоны и компоненты.
Короткий ответ
Шаблон зовёт функцию с кодом фразы. Модуль смотрит в словарь, берёт значение на языке текущей страницы и возвращает его. Если значения на этом языке нет — отдаёт базовый язык. Если записи нет вовсе — создаёт её с текстом-заглушкой, который вы передали, и сразу же отдаёт.
<?= LANG_VAR('SUBMIT_BTN', 'Отправить') ?>
Второй аргумент — не «значение по умолчанию на случай сбоя», а первичный текст фразы. Он попадёт в словарь и станет тем, что контент-менеджер увидит и поправит.
Путь значения
- По коду ищется запись в словаре.
- Берётся поле текущего языка.
- Пусто — берётся поле базового языка.
- Записи нет — она заводится с переданной заглушкой и тут же перечитывается.
- Подставляются переменные, если вы их передали.
- В режиме правки результат оборачивается в разметку, чтобы по нему можно было кликнуть.
Последний пункт — причина большинства неожиданностей. Подробнее и что с этим делать — Lang::get и LANG_VAR.
Откуда берётся язык
Из языка текущей страницы Битрикса. Модуль не заводит своего понятия «текущий язык» и не читает его из адреса: он доверяет платформе.
Отсюда следствие: если на сайте языковые версии сделаны не языками Битрикса, а как-то иначе — папками, доменами без привязки языка, параметром в адресе, — модуль будет отдавать один и тот же язык везде. Это не поломка, а условие работы.
Два разных механизма
Фразы интерфейса и контент инфоблоков живут по-разному, и путь у них разный.
Фразы идут через словарь, как описано выше.
Контент инфоблоков подставляется при выборке: вы получаете элемент, а в его полях уже лежит перевод. Шаблон при этом обычно не меняется вовсе. См. Выборка с учётом языка.
Спутать их легко, и симптом одинаковый — «перевод не показывается». Первый вопрос при разборе: это фраза из словаря или поле элемента?
Что читать дальше
| Основной способ вывести фразу | Lang::get и LANG_VAR |
| Прочитать фразу, не создавая её | Lang::get и LANG_VAR |
| Получить много фраз разом | Словарь целиком |
| Спрятать модуль за своим фасадом | Своя обёртка для переводов |
| Вывести дату на языке страницы | Даты и периоды |
| Подставить перевод в штатный компонент | Штатные компоненты |