Что делать, если
Разбор ситуаций, в которых модуль ведёт себя не так, как ожидали.
Если вы ищете конкретную фразу об ошибке, которую увидели на экране, — она на странице Все сообщения модуля: там полный список, и по тексту фразы он ищется поиском браузера.
Поправили фразу в словаре, а GetMessage на сайте прежний
Сначала экран Файловые фразы: поиск фраз вообще запускали, и перехват включён. Без этого GetMessage() читает файлы, как до модуля. Разбор — Фразы из языковых файлов.
Дальше по ситуации.
Файл в списке замены загрузчика. Устаревший вызов кладёт текст в $MESS раньше словаря. Пока строку не заменят, правка в словаре на этой странице не появится. Пустой список — норма, тогда причина не в этом.
Код есть в двух ваших файлах. Побеждает тот, который поиск фраз занёс первым. Текст второго файла берётся кнопкой «Взять текст этого файла».
Перевод на этом языке пустой. На витрине GetMessage() покажет базовый язык, чаще всего русский. В словаре поле при этом пустое — так и задумано, чтобы было видно, что перевода нет.
Язык страницы не в списке управляемых. Для него перехват молчит, в том числе для донора. Английские файлы неуправляемого en остаются как есть, пока английский не добавят в языки перевода и не запустят поиск фраз заново.
Два сайта на одном языке. Код один на оба. Развести можно только разными кодами в шаблонах.
Фраза вписана в шаблон текстом или живёт в JavaScript. Поиск фраз её не видит.
Страница отдана композитом. Правка попадает на витрину после сброса статики на экране Обслуживание, вкладка «Словарь фраз». Включение и выключение перехвата сбрасывают её сами. Пока на вкладке висит предупреждение «Словарь фраз правили после последнего сброса», часть страниц ещё старая, и в журнале событий об этом ничего нет.
Пропал файл состояния поиска фраз. Перехват на этом хите молчит и отдаёт файловые фразы. Флаг при этом не снимается сам: на странице службы будет видно, что манифеста нет. Лечится новым поиском фраз.
Вызов из init.php, агента, cron или REST без пролога. Обработчик модуля стоит на OnPageStart, а эти входы бывают раньше или без пролога вовсе. Там GetMessage() остаётся файловым.
Сняли или добавили язык, и перехват погас
Так и должно быть. Смена списка целевых языков стирает прогон: каталог снятого языка в кеше удаляется, флаг выключается. Вернули язык обратно — перехват сам не включится, нужен новый поиск фраз. Повторное сохранение того же списка прогон не трогает.
Перевод сделан, а на сайте по-прежнему русский
Проверяйте по порядку, не перескакивая.
- Перевод записан? Найдите запись в словаре или откройте элемент в админке и посмотрите языковое свойство. Если пусто — переводить и надо, а не искать причину в выводе.
- Шаблон читает перевод? Для фраз, заведённых модулем, — зовётся ли
LANG_VAR. Для старогоGetMessage()— включали ли перехват, см. раздел выше. Для инфоблоков — стоит ли вызов подстановки в том шаблоне, который реально подключён: на боевых сборках у компонента бывает несколько шаблонов. - Кеш сброшен? Подстановка происходит при сборке кеша компонента. До истечения кеша витрина показывает прежние значения.
- Язык страницы тот? Модуль берёт язык у Битрикса. Если языковые версии сделаны не языками платформы, он везде отдаёт один и тот же язык, см. Известные ограничения.
Не появляется кнопка «Обновить»
Битрикс показывает её, только когда версия в файлах больше записанной в базе. Совпали — кнопки нет, и это не поломка. Способы — Если кнопки «Обновить» нет.
Витрина переводит, а разовый перевод отвечает ошибкой
Характерная пара: на страницах сайта переводы подставляются, админка открывается, словарь редактируется — а очередь, разовый перевод и подсчёт использования фраз отвечают ошибкой или ничего не делают.
Почти всегда это версия PHP ниже требуемой модулем. Модуль в таком положении не выключается целиком: он снимает из автозагрузки только то, что на этой версии не может прочитать, и отказывает ровно в машинном переводе. Остальное продолжает работать, поэтому снаружи это выглядит как выборочная поломка.
Где посмотреть: экран Проверка стенда, вкладка «Обзор», строка О1.10. Там же написано, какая версия стоит и какая нужна. Вторая запись — в журнале событий Битрикса, тип TRANSLATE_PHP_VERSION; она появляется не чаще раза в сутки, чтобы не раздувать таблицу.
Лечится подъёмом версии PHP на сервере. После этого нажмите «Обновить» в списке модулей: на старом PHP обновление отказывалось, и схема базы могла остаться от прежней версии.
Возможность просто перестала работать, без ошибок
Очередь не наполняется, зеркало не появляется, меню осталось русским, кнопки перевода нет.
Почти всегда это пропавший обработчик события, и почти всегда причина одна: файлы заменили, а «Обновить» не нажали. Проверить — экран Проверка стенда, вкладка «Обзор».
Подсчёт использования висит или обрывается
Прогресс, замерший на несколько секунд, — норма: идёт очередная порция файлов.
Если оборвалась — просто запустите заново. Тяжёлое состояние хранится во временном файле, а не в сессии, поэтому повтор безопасен.
На кластере без общего хранилища сессий подсчёт запускайте с одной ноды.
Подсчёт использования показывает ноль у заведомо используемой фразы
Два варианта, оба ожидаемы:
- код собирается в программе из кусков, либо выводится через вашу обёртку, которую сканер не знает. Обёртку можно добавить, см. Своя обёртка;
- файл лежит в исключённом каталоге.
Удалять такие фразы нельзя. Именно поэтому список неиспользуемых фраз называется кандидатами.
В неиспользуемых фразах актуальные фразы
Запустите подсчёт использования — шаг 1 на вкладке «Неиспользуемые фразы» экрана Обслуживание, счётчики обновятся. Список показывает результат последнего подсчёта, а не считает на лету.
Если после подсчёта фразы всё равно в списке — см. пункт выше.
После добавления языка не появилось поле в словаре
Посмотрите на экране Проверка стенда, приходило ли событие о новом языке.
И помните: свойства инфоблоков модуль не создаёт сам. Поле в словаре появляется по событию, а свойства — только кнопкой синхронизации, осознанно. См. Добавить язык.
Сервис переводов недоступен
Экран не должен висеть: он покажет последний известный баланс. Прогон остановится с понятным текстом, кнопка запуска снова станет активной.
Проверьте исходящий доступ с сервера сайта до api.mrlexndr.com. На стендах с DEMO-лицензией используется отдельный идентификатор, и это нормально.
Сообщение на экране адреса и подробностей транспорта не называет — намеренно. Всё это в журнале событий, тип TRANSLATE_SAAS_NETWORK.
Что модуль делает с отказами сам — Сеть, таймауты и повторы.
Ответ сервиса не сошёлся по количеству
Модуль отказывается писать перевод целиком. Это защита: разложить ответы «по порядку» означало бы записать перевод названия в описание.
Если повторяется на одном и том же тексте — дело почти всегда в самом тексте. Посмотрите его глазами.
Ошибка без подробностей
Если перевод отвечает общей фразой про непредвиденную ошибку — подробности не потерялись, они в журнале событий Битрикса, тип TRANSLATE_ENDPOINT_FAILURE. Там имя класса, файл и строка.
Наружу они не отдаются намеренно: в таком тексте оказываются адрес сервиса, пути файлов и куски запросов к базе. См. Права и безопасность.
Очередь показала на перевод весь каталог
Не нажимайте «Перевести накопленное», пока не разберётесь.
Законные причины: включили очередь впервые, или полный пересчёт нашёл испорченные переводы.
Незаконная: разъехались хеши исходников после обновления. Это чинится ремонтом, а не оплатой, см. Хеш исходника.
Разметка вылезла текстом на странице
Почти наверняка фраза выведена без сырого режима в атрибуте тега, в заголовке страницы или в строке JavaScript, и у вас включён режим правки. См. Lang::get и LANG_VAR.
Список устаревших переводов не уменьшается после импорта
Так и работает: импорт отметку не снимает. Снимайте кнопкой «Перевод проверен». См. Импорт и экспорт CSV.
Подписи в оформлении заказа сбрасываются на русский
Проверьте, что сбрасываются они именно после смены способа доставки без перезагрузки. Тогда дело во втором обработчике события — он регистрируется, только если установлен модуль заказов. См. Страница заказа.
Если ничего из этого не подошло
Откройте Проверка стенда и приложите содержимое паспорта к обращению в поддержку: оно отвечает на половину уточняющих вопросов сразу.