Может войдёшь?
Черновики Написать статью Профиль

Локализация роутера под SEO

route seo

В этой статье я расскажу о том, как сделать копию сайта на втором языке по отдельному пути, используя существующий сайт, встроенную локализацию и маршруты.

Дано: после почти полной готовности проекта на 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($requestClosure $next)
{
   
$path explode('/'request()->path());
   
$pathLocale array_shift($path);
   
$pathLocale = ($pathLocale == 'en') ? 'en' 'ru';
   
App::setLocale($pathLocale);
   return 
$next($request);
}

В итоге имеем:

  • полную копию сайта со всеми маршрутами в двух языках, отличающимися только приставкой;
  • переключение локали при указании нужного префикса в url;
  • все новые маршруты, которые будут добавлены в face.php, будут также дублироваться для обеих версий сайта.

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (2)

kickerPro

Два пакета по теме:

WarLight

Отличное дополнение) Хотя реализация чуть другая)

Жаль вовремя не нашлись нужные библиотеки.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.