В этой статье я расскажу о том, как сделать копию сайта на втором языке по отдельному пути, используя существующий сайт, встроенную локализацию и маршруты. Дано: после почти полной готовности проекта на Laravel, заказчик хочет, чтобы локализация была реализована не просто переключением языка и отображением нужной версии сайта в соответствии с тем, что указано в сессии. Нужно было реализовать два сайта: русская и английская версия — которые лежали бы по разным путям. Для SЕО-продвижения не должно быть двух разных страниц по одному URL. И индексироваться русская и английская версия сайта должны отдельно. При этом в проекте были задействованы именованные маршруты и локализация, от которых не хотелось отказываться. Решением было вынести все именованные маршруты, чтобы не дублировать, в отдельный файл и подключить этого файл внутри **web.php**. При этом файл подключался файл дважды: %%(php) Route::group(['middleware' => 'locale'], function() { include ('face.php'); Route::group(['prefix' => 'en', 'as' => 'en.'], function() { include ('face.php'); }); }); %% В итоге имеем 2 набора маршрутов. Один состоит из тех маршрутов, которые указаны в face.php. Другой набор — это те же маршруты, с префиксом “en.” (основными языком должен был быть русский) и такими же названиями, но с префиксом “en.” После этого нужно было каким-то образом в соответствии с выбранным языком отображать ссылки на нужный маршрут при формировании маршрута по его имени. Для этого был добавлен дополнительно хелпер **__route()**: %%(php) function __route($name, $params = null) { if (App::getLocale() == 'en') { $name = 'en.' . $name; } return route($name, $params); } %% Его функция — добавлять к имени маршрута приставку, если выбран английский язык. При этом дальше вызывается стандартный хелпер с параметрами. Единственная проблема — пройтись по коду, найти все вызовы хелпера route() и заменить их на вызов хелпера _route(). Далее нужно создать middleware, тот самый **locale** из роутера. Он будет выбирать нужный язык: если через префикс указан отличающийся от установленного — менять язык. %%(php) public function handle($request, Closure $next) { $path = explode('/', request()->path()); $pathLocale = array_shift($path); $pathLocale = ($pathLocale == 'en') ? 'en' : 'ru'; App::setLocale($pathLocale); return $next($request); } %% В итоге имеем: - полную копию сайта со всеми маршрутами в двух языках, отличающимися только приставкой; - переключение локали при указании нужного префикса в url; - все новые маршруты, которые будут добавлены в **face.php**, будут также дублироваться для обеих версий сайта.