Фразы из языковых файлов
Сайт, собранный до модуля, выводит подписи через GetMessage('КОД'). Текст при этом лежит в lang/<язык>/*.php рядом с шаблоном. Менять такие вызовы по всему дереву не нужно: после поиска фраз тот же GetMessage() на языках перевода отдаёт значение из словаря. Правка фразы в словаре меняет текст на сайте.
Вызовы в шаблонах модуль не переписывает и языковые файлы не удаляет. Файлы нужно оставить: без них не с чем сверять расхождения, и откат к прежнему поведению остаётся возможным.
Экран — пункт меню Файловые фразы.
Что попадёт в словарь, а что нет
Поиск фраз читает языковые файлы отмеченных каталогов. По умолчанию это /local/templates, /local/components, /local/php_interface и /bitrix/php_interface. Каталог /local/modules выключен: там обычно чужие модули, и их фразы перезапишет обновление.
Не попадают:
- текст, вписанный в шаблон прямо, без
GetMessage(); - фразы в JavaScript (
BX.message); - описания параметров компонентов (
.parameters.php,.description.phpи соседние файлы формы настройки) — они живут в админке, не на витрине; - фразы ядра и готовых решений, пока их каталог не отмечен;
- файлы, где язык подключают устаревшим вызовом и этот вызов реально срабатывает. Список таких файлов даёт сам поиск фраз, и он бывает пустым. Это нормально: пустой список значит, что заменять строки загрузчика не нужно.
Два сайта с одним и тем же языком и одним и тем же кодом фразы делят одну запись словаря. Развести их переименованием кода в одном из шаблонов.
Как включить
- Отметьте каталоги. Снятая галочка значит «не забирать фразы отсюда», а не «этих кодов не существует»: неотмеченный шаблон всё равно считается чужим, если его код совпал с вашим.
- В разделе «Поиск фраз» нажмите «Запустить поиск». Он идёт шагами и переживает закрытую вкладку. Второй человек в это время получит отказ: словарь один. Если процесс оборвался, замок отпустится сам через пять минут, и поиск продолжается с места остановки, а не с начала.
- Разберите отчёты. Пока совпадение не разобрано, эта фраза работает как раньше и включению не мешает.
- Перехват включается сам, когда поиск фраз нашёл хотя бы одну фразу, которую можно перехватить, и ядро Битрикса не ниже 23.0.0. На ядре ниже обновление модуля не прерывается, но перехват не включается.
Покрытие считается по кодам и по языкам отдельно. Файл, у которого часть кодов ещё не разобрана, не бывает ни целиком покрыт, ни пуст.
Четыре строки
Поиск фраз относит каждый файл на каждом языке к одной из четырёх строк. От строки зависит, увидит ли витрина правку в словаре.
| Строка | Что это | Правка в словаре |
|---|---|---|
| 1 | Языкового файла загрузчик не находит | видна |
| 2 | Файл подключится само, когда фразу спросят | видна |
| 3 | Файл подключается сразу, современным вызовом | видна |
| 4 | Файл пишет фразы устаревшим вызовом, и вызов на этом пути работает | не видна, пока не заменят одну строку |
Строка 4 — это IncludeTemplateLangFile() в шаблоне сайта и родственные вызовы, которые кладут текст в общий массив $MESS. GetMessage() читает его раньше словаря, и обойти это из модуля нельзя. На экране у такого файла готова замена одной строки:
- IncludeTemplateLangFile(__FILE__);
+ \Bitrix\Main\Localization\Loc::loadMessages(__FILE__);
Модуль сам её не вставляет: это чужой шаблон. Замена не предлагается, если после неё часть фраз стала бы пустой, если вызов и так ничего не делает, или если шаблон читает $MESS['КОД'] напрямую: тогда замена оставила бы пустой вывод.
Вызов в /local/components/ часто выглядит так же, но там он ничего не пишет. Поиск фраз не рисует для него строку 4 и не предлагает замену, которая начала бы грузить файл.
Совпадения, дубли, расхождения
Совпадение с чужим кодом. Тот же код есть и у вас, и в чужом файле. Пока решения нет, фраза остаётся как сегодня.
- Принять — ваш текст победит и там, где используется чужой файл. Кнопки нет, если чужой файл приезжает в
$MESS: принять такой код нельзя, победа была бы только на страницах, где чужой файл не подключался. - Переименован — вы уже сменили код в шаблоне и в словаре. Модуль файлы за вас не правит.
- Скопированный к себе шаблон штатного компонента конфликтом не считается: это та же фраза, и на одной странице оригинал и копия не встречаются.
Один код в двух ваших файлах. Раньше побеждал файл, загруженный последним. Теперь побеждает первый, кого поиск фраз занёс в словарь. У второго файла есть кнопка «Взять текст этого файла»: она подставляет его текст в ту же запись. Если запись в словаре уже изменилась с момента отчёта, кнопка откажется и попросит обновить страницу.
Текст файла разошёлся со словарём. После включения побеждает словарь. Кнопка «Взять текст этого файла» забирает текст с диска в словарь, с той же проверкой, что запись не изменилась, пока отчёт был открыт.
Столкновение с рукописной фразой. Код уже заведён через LANG_VAR, и тот же код нашёлся в файле. Импорт такую запись не трогает: иначе текст из файла молча поменял бы её везде, где стоит LANG_VAR. Код надо переименовать в шаблоне или в словаре.
Донор языка
У китайского языка Битрикса донор — английский: ядро сначала читает lang/en/, потом поверх кладёт lang/zh/. Если английский не в списке языков перевода, фразы из его файлов остаются как есть. Свой lang/en рядом с вашим lang/zh конфликтом не считается.
Добавили английский в языки перевода — эти фразы начинают жить в словаре, но только после нового поиска фраз. Сняли язык — перехват выключается, пока поиск не запустят снова. Повторное сохранение того же списка языков результат поиска не стирает.
Незаполненный перевод на витрине через GetMessage() выглядит как текст языка сайта. В словаре при этом поле пустое: так видно, что перевода ещё нет. LANG_VAR пустое поле от «перевод совпал с русским» по-прежнему отличает сам.
После включения
Новые языковые файлы в отмеченных каталогах лучше не заводить: поиск фраз их заметит, но до следующего запуска витрина о них не знает.
Правка фразы на сайте в режиме правки по-прежнему работает только у LANG_VAR. GetMessage() возвращает строку, и обернуть её в кликабельную рамку нельзя: та же строка стоит в атрибутах, письмах и заголовке страницы.
Если включён композит, правка фразы не появляется на уже сохранённых страницах сразу. На экране Обслуживание, вкладка «Словарь фраз», загорается отметка, что статика устарела. Кнопка «Сбросить» сносит её один раз. Включение и выключение перехвата сбрасывают статику сами.
Вкладка «Где используется» после перехвата начнёт считать старые GetMessage() живыми использованиями словаря. Счётчик вырастет без новых LANG_VAR. Это ожидаемо, удалять такие фразы из неиспользуемых нельзя.