Куда класть модуль
Два законных места: /local/modules/mrlexndr.translate/ и /bitrix/modules/mrlexndr.translate/. Работает модуль одинаково из обоих, но последствия у выбора разные.
Кладите в /local/modules/
Это рекомендация, и вот почему.
Обновление ядра не трогает /local/. Каталог /bitrix/ принадлежит платформе, и обновление Битрикса вправе делать с ним что угодно. Модуль там переживёт большинство обновлений, но это везение, а не гарантия.
/local/ обычно под системой контроля версий, а /bitrix/ — нет. На проекте, где код едет через git, модуль в /bitrix/ выпадает из истории целиком.
Когда всё-таки /bitrix/modules/
Когда /local/ на проекте не используется вовсе — такое встречается на старых сборках. Тогда положить модуль рядом с остальными в /bitrix/modules/ честнее, чем заводить /local/ ради одного каталога.
Две копии — источник тихих ошибок
Битрикс ищет модуль сначала в /local/modules/, потом в /bitrix/modules/, и берёт первый найденный. Если каталог остался в обоих местах, работает тот, что в /local/, а правки вы, возможно, льёте во второй.
Выглядит это так: файлы изменены, а поведение прежнее. Или наоборот — обновили через админку, а на сайте старый код.
Проверить, откуда модуль работает на самом деле, можно прямо из консоли сайта:
php -r 'require "bitrix/modules/main/include/prolog_before.php";
echo (new ReflectionClass("mrLexndr\Translate\Lang"))->getFileName(), PHP_EOL;'
Путь в ответе — и есть рабочая копия. Вторую надо удалить, а не оставлять «на всякий случай».
После переезда
Если модуль переехал из одного каталога в другой, нажмите Обновить в Маркетплейсе. Установщик раскладывает файлы вне своего каталога — стили, скрипты, заглушки страниц админки и эндпоинт, — и после переезда эти копии указывают в прежнее место. Подробнее — Обновление на бою.