В этой статье я расскажу о том, как сделать копию сайта на втором языке по отдельному пути, используя существующий сайт, встроенную локализацию и маршруты.
Дано: после почти полной готовности проекта на Laravel, заказчик хочет, чтобы локализация была реализована не просто переключением языка и отображением нужной версии сайта в соответствии с тем, что указано в сессии. Нужно было реализовать два сайта: русская и английская версия — которые лежали бы по разным путям. Для SЕО-продвижения не должно быть двух разных страниц по одному URL. И индексироваться русская и английская версия сайта должны отдельно. При этом в проекте были задействованы именованные маршруты и локализация, от которых не хотелось отказываться.
Решением было вынести все именованные маршруты, чтобы не дублировать, в отдельный файл и подключить этого файл внутри web.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()**:
function __route($name, $params = null)
{
if (App::getLocale() == 'en') {
$name = 'en.' . $name;
}
return route($name, $params);
}
Его функция — добавлять к имени маршрута приставку, если выбран английский язык. При этом дальше вызывается стандартный хелпер с параметрами.
Единственная проблема — пройтись по коду, найти все вызовы хелпера route() и заменить их на вызов хелпера _route().
Далее нужно создать middleware, тот самый locale из роутера. Он будет выбирать нужный язык: если через префикс указан отличающийся от установленного — менять язык.
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, будут также дублироваться для обеих версий сайта.
Комментарии (2)
Два пакета по теме:
Отличное дополнение) Хотя реализация чуть другая)
Жаль вовремя не нашлись нужные библиотеки.