localized front routes
set lang for localized routes redirect user to saved lang keep previous lang feature on Back Office
This commit is contained in:
parent
174d013eef
commit
2d30fde360
14 changed files with 135 additions and 50 deletions
|
|
@ -5,9 +5,12 @@ namespace App\Http\Middleware;
|
|||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cookie;
|
||||
use Illuminate\Support\Facades\View;
|
||||
|
||||
class LangCheck
|
||||
{
|
||||
|
||||
protected $langs = ['fr','en','es'];
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
|
|
@ -17,33 +20,92 @@ class LangCheck
|
|||
*/
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
//if lang provided un request then set it
|
||||
if($request->lang) {
|
||||
//Set cookie
|
||||
Cookie::queue(Cookie::forever('language', $request->lang));
|
||||
//set session
|
||||
$request->session()->put('lang',strtolower($request->lang));
|
||||
//bonus remove lang parameter from query
|
||||
return redirect()->to($request->fullUrlWithoutQuery('lang'));
|
||||
|
||||
$routName = $request->route()->getName();
|
||||
if (preg_match('/^bo\./', $routName)) {
|
||||
//Back office
|
||||
if ($request->lang) {
|
||||
//within bo we set lang with querystring param
|
||||
$this->saveUserLocale($request->lang, $request);
|
||||
//bonus remove lang parameter from query
|
||||
return redirect()->to($request->fullUrlWithoutQuery('lang'));
|
||||
} else {
|
||||
$this->checkFirstAccess($request);
|
||||
}
|
||||
} else {
|
||||
//do we have session ?
|
||||
if(!$request->session()->has('lang')) {
|
||||
$fromC = Cookie::get('language');
|
||||
if (is_null($fromC) || empty($fromC)) {
|
||||
//pas de cookie, recherche sur le navigateur
|
||||
$fromC = substr(Request::server('HTTP_ACCEPT_LANGUAGE'), 0, 2);
|
||||
if (!in_array($fromC, ['fr', 'en', 'es'])) {
|
||||
//default other languages to en
|
||||
$fromC = 'en';
|
||||
//FRONT
|
||||
if (preg_match('/^(en|es)\./', $routName)) {
|
||||
//from front use named routes
|
||||
$langset = $request->segment(1);
|
||||
|
||||
$this->saveUserLocale($langset, $request);
|
||||
} else {
|
||||
//not specified in route
|
||||
if ($this->checkFirstAccess($request)) {
|
||||
$routNameEN = 'en.' . $routName;
|
||||
$routNameES = 'es.' . $routName;
|
||||
$sess_lang = $request->session()->get('lang', config('app.locale'));
|
||||
switch ($sess_lang) {
|
||||
case 'en':
|
||||
return redirect()->route($routNameEN);
|
||||
case 'es':
|
||||
return redirect()->route($routNameES);
|
||||
}
|
||||
}
|
||||
//set session
|
||||
$request->session()->put('lang',strtolower($fromC));
|
||||
|
||||
$langset = 'fr';
|
||||
$this->saveUserLocale($langset, $request);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
$sess_lang = $request->session()->get('lang', config('app.locale'));
|
||||
app()->setLocale($sess_lang);
|
||||
$routePrefixer = "";
|
||||
if($sess_lang != 'fr') {
|
||||
$routePrefixer = $sess_lang . '.';
|
||||
}
|
||||
View::share('routeprefixer', $routePrefixer);
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private function saveUserLocale($lang, Request $request)
|
||||
{
|
||||
//Set cookie
|
||||
Cookie::queue(Cookie::forever('language', strtolower($lang)));
|
||||
//set session
|
||||
$request->session()->put('lang', strtolower($lang));
|
||||
}
|
||||
|
||||
/**
|
||||
* checks if we have saved locale info for current user
|
||||
* if not find then save that locale
|
||||
* @return boolean
|
||||
*/
|
||||
private function checkFirstAccess(Request $request)
|
||||
{
|
||||
//do we have session ?
|
||||
if (!$request->session()->has('lang')) {
|
||||
$fromC = Cookie::get('language');
|
||||
if (is_null($fromC) || empty($fromC)) {
|
||||
//pas de cookie, recherche sur le navigateur
|
||||
$fromC = substr($request->server('HTTP_ACCEPT_LANGUAGE'), 0, 2);
|
||||
if (!in_array($fromC, $this->langs)) {
|
||||
//default other languages to en
|
||||
$fromC = 'en';
|
||||
}
|
||||
}
|
||||
$this->saveUserLocale($fromC, $request);
|
||||
return true;
|
||||
}
|
||||
//we have lang session
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
<div class="container">
|
||||
<div class="wrapper">
|
||||
<div class="breadcrumb is-flex">
|
||||
<a href="{{ route('home') }}" class="link">{{ __('Accueil') }}</a>
|
||||
<a href="{{ route($routeprefixer . 'home') }}" class="link">{{ __('Accueil') }}</a>
|
||||
</div>
|
||||
<h2 class="sectiontitle align-center animate__animated fadeInUp animate__slow">{!! __('Une question ? Une idée ? Un conseil ?<br>
|
||||
Des informations sur nos produits ?') !!}</h2>
|
||||
|
|
@ -67,7 +67,7 @@
|
|||
@endif
|
||||
@endif
|
||||
|
||||
<form action="{{route('contact.submit')}}" method="post" class="form contact__form" enctype="multipart/form-data">
|
||||
<form action="{{route($routeprefixer . 'contact.submit')}}" method="post" class="form contact__form" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@if ($errors->any())
|
||||
@foreach ($errors->all() as $error)
|
||||
|
|
@ -183,7 +183,7 @@
|
|||
</div>
|
||||
</fieldset>
|
||||
<p class="is-small">{!! __('Les informations que vous nous communiquez sont collectées et traitées par la Société Bretonne de Volaille, responsable de traitement selon les finalités définies dans notre Charte de confidentialité. Ces informations sont destinées au personnel de la Société Bretonne de Volaille et peuvent être partagées avec ses sous-traitants.<br />
|
||||
A tout moment, vous pouvez retirer votre consentement. Pour toute information complémentaire concernant vos données personnelles et vos droits, merci de consulter notre <a href=":PRIVROUTE">Charte de confidentialité.</a>', ['PRIVROUTE' => route('policy')]) !!}</P>
|
||||
A tout moment, vous pouvez retirer votre consentement. Pour toute information complémentaire concernant vos données personnelles et vos droits, merci de consulter notre <a href=":PRIVROUTE">Charte de confidentialité.</a>', ['PRIVROUTE' => route($routeprefixer . 'policy')]) !!}</P>
|
||||
<div class="is-small">
|
||||
<input type="checkbox" name="rgpd" id="rgpd" required>
|
||||
<label for="rgpd">{{ __('J’accepte les conditions générales d’utilisation du site et autorise la Société Bretonne de Volaille à traiter mes données personnelles conformément à la Charte de confidentialité.') }}</label>
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
<div class="align-justify animate__animated fadeInRight animate__slow">
|
||||
{!! $encart_food->text !!}
|
||||
</div>
|
||||
<a href="{{ route('wasup') }}/#notre-histoire" class="cta">{{ __('En savoir plus') }}</a>
|
||||
<a href="{{ route($routeprefixer . 'wasup') }}/#notre-histoire" class="cta">{{ __('En savoir plus') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -74,7 +74,7 @@
|
|||
<div class="product-card align-center">
|
||||
<img src="{{ asset($product->picture) }}" alt="{{ $product->alt_text_picture}}">
|
||||
<h3 class="product-card__title">{{ $product->name}}</h3>
|
||||
<a href="{{ route('product.show', ['gammeSlug' => $product->gamme->slug , 'productSlug' => $product->slug]) }}"></a>
|
||||
<a href="{{ route($routeprefixer . 'product.show', ['gammeSlug' => $product->gamme->slug , 'productSlug' => $product->slug]) }}"></a>
|
||||
<span class="overlay">
|
||||
<span>{{ __('Découvrir') }}</span>
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@
|
|||
@foreach ($gammes as $gamme)
|
||||
<div class="gamme-card align-center">
|
||||
<img src="{{ asset($gamme->picture) }}" alt="{{ $gamme->alt_text_picture}}">
|
||||
<a href="{{ route('gammes.show', ['gammeSlug' => $gamme->slug]) }}"></a>
|
||||
<a href="{{ route($routeprefixer . 'gammes.show', ['gammeSlug' => $gamme->slug]) }}"></a>
|
||||
<span class="overlay" style="background-color: {{ $gamme->rgbaColor}};">
|
||||
<span>{{ $gamme->title}}</span>
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<div class="product-card align-center">
|
||||
<img src="{{ asset($product->picture) }}" alt="{{ $product->alt_text_picture }}">
|
||||
<h3 class="product-card__title">{{ $product->name }}</h3>
|
||||
<a href="{{ route('product.show', ['gammeSlug' => $product->gamme->slug , 'productSlug' => $product->slug]) }}"></a>
|
||||
<a href="{{ route($routeprefixer . 'product.show', ['gammeSlug' => $product->gamme->slug , 'productSlug' => $product->slug]) }}"></a>
|
||||
<span class="overlay" style="background-color: {{ $product->gamme->rgbaColor}};">
|
||||
<span>{{ __('Découvrir') }}</span>
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
<div class="wrapper">
|
||||
<div class="header-title align-center p-rel">
|
||||
<div class="breadcrumb is-flex">
|
||||
<a href="{{ route('gammes.index') }}" class="link">{{ __('Gammes') }}</a>
|
||||
<a href="{{ route($routeprefixer . 'gammes.index') }}" class="link">{{ __('Gammes') }}</a>
|
||||
</div>
|
||||
<h1 class="align-center animate__animated fadeInUp animate__slow"><i class="mascotte"></i>{{ $gamme->title }}</h1>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@
|
|||
{!! clean(nl2br($encart_home->text)) !!}
|
||||
</div>
|
||||
<p class="smrt-align-center">
|
||||
<a href="{{ route('wasup') }}/#notre-histoire" class="cta">{{ __('En savoir plus') }}</a>
|
||||
<a href="{{ route($routeprefixer . 'wasup') }}/#notre-histoire" class="cta">{{ __('En savoir plus') }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
{{ __('Découvrez tous nos produits à base de volaille.') }}
|
||||
</h3>
|
||||
<p class="align-left">{{ __('home.products.text')}}</p>
|
||||
<a href="{{ route('gammes.index') }}" class="cta">{{ __('Découvrir')}}</a>
|
||||
<a href="{{ route($routeprefixer . 'gammes.index') }}" class="cta">{{ __('Découvrir')}}</a>
|
||||
@if (isset($products_home))
|
||||
<div class="products-list is-flex">
|
||||
@foreach ($products_home as $product)
|
||||
|
|
@ -100,7 +100,7 @@
|
|||
<h3 class="h2 align-center">{{ $post_home->title}}</h3>
|
||||
<p class="align-justify">{!! clean(nl2br($post_home->text)) !!}</p>
|
||||
<p class="align-center">
|
||||
<a href="{{ route('news') }}" title="" class="cta">En savoir plus</a>
|
||||
<a href="{{ route($routeprefixer . 'news') }}" title="" class="cta">En savoir plus</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
<div class="wrapper">
|
||||
<div class="header-title align-center p-rel">
|
||||
<div class="breadcrumb is-flex">
|
||||
<a href="{{ route('home') }}" class="link">{{ __('Accueil')}}</a>
|
||||
<a href="{{ route($routeprefixer . 'home') }}" class="link">{{ __('Accueil')}}</a>
|
||||
</div>
|
||||
|
||||
<h1 class="animate__animated fadeInUp animate__slow"><i class="mascotte"></i>{{ $mentions_legales->title }}</h1>
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
<div class="wrapper">
|
||||
<div class="header-title align-center p-rel">
|
||||
<div class="breadcrumb is-flex">
|
||||
<a href="{{ route('home') }}" class="link">{{ __('Accueil')}}</a>
|
||||
<a href="{{ route($routeprefixer . 'home') }}" class="link">{{ __('Accueil')}}</a>
|
||||
</div>
|
||||
|
||||
<h1 class="animate__animated fadeInUp animate__slow"><i class="mascotte"></i>{{ $privacy_policy->title }}</h1>
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
<div class="wrapper">
|
||||
<div class="header-title align-center p-rel">
|
||||
<div class="breadcrumb is-flex">
|
||||
<a href="{{ route('gammes.index') }}" class="link">{{ __('Gammes') }}</a> - <a href="{{ route('gammes.show', ['gammeSlug' => $gamme->slug]) }}" class="link">{{ $gamme->title}}</a>
|
||||
<a href="{{ route($routeprefixer . 'gammes.index') }}" class="link">{{ __('Gammes') }}</a> - <a href="{{ route($routeprefixer . 'gammes.show', ['gammeSlug' => $gamme->slug]) }}" class="link">{{ $gamme->title}}</a>
|
||||
</div>
|
||||
|
||||
<h1 class="animate__animated fadeInUp animate__slow"><i class="mascotte"></i>{{ $product->name}}</h1>
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
<section class="container">
|
||||
<div class="wrapper">
|
||||
<div class="breadcrumb is-flex">
|
||||
<a href="{{ route('home') }}" class="link">{{ __('Accueil') }}</a>
|
||||
<a href="{{ route($routeprefixer . 'home') }}" class="link">{{ __('Accueil') }}</a>
|
||||
</div>
|
||||
<h2 class="align-center sectiontitle">{{ __('Résultats') }}</h2>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -59,10 +59,10 @@
|
|||
|
||||
<div class="container footer-content align-center @if (Route::current()->getName() == 'food') blue-bg @endif">
|
||||
<ul>
|
||||
<li><a href="{{ route('cgu') }}">{{ __('Mentions légales') }}</a></li>
|
||||
<li><a href="{{ route('policy') }}">{{ __('Charte de confidentialité') }}</a></li>
|
||||
{{--<li><a href="{{ route('site-map') }}">{{ __('Plan du site') }}</a></li>--}}
|
||||
<li><a href="{{ route('contact') }}">{{ __('Contact') }}</a></li>
|
||||
<li><a href="{{ route($routeprefixer . 'cgu') }}">{{ __('Mentions légales') }}</a></li>
|
||||
<li><a href="{{ route($routeprefixer . 'policy') }}">{{ __('Charte de confidentialité') }}</a></li>
|
||||
{{--<li><a href="{{ route($routeprefixer . 'site-map') }}">{{ __('Plan du site') }}</a></li>--}}
|
||||
<li><a href="{{ route($routeprefixer . 'contact') }}">{{ __('Contact') }}</a></li>
|
||||
<li><a href="#cookies" class="ldcweb-cn-cookie-link">{{ __('Gestion des cookies') }}</a></li>
|
||||
</ul>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
<button id="backtotop"><i class="arrow up"></i></button>
|
||||
<header class="site-header @if (Route::current()->getName() == 'food') blue-bg @endif">
|
||||
<header class="site-header @if (Route::current()->getName() == 'food' ||
|
||||
Route::current()->getName() == 'en.food' ||
|
||||
Route::current()->getName() == 'es.food' ||
|
||||
Route::current()->getName() == 'fr.food') blue-bg @endif">
|
||||
<div class="wrapper p-rel">
|
||||
<div class="logotype p-abs">
|
||||
<a href="{{ route('home') }}" title="accueil"><img src="{{ asset('assets/images/logo-doux.png') }}" alt="logo" /></a>
|
||||
<a href="{{ route($routeprefixer . 'home') }}" title="accueil"><img src="{{ asset('assets/images/logo-doux.png') }}" alt="logo" /></a>
|
||||
</div>
|
||||
|
||||
<nav class="menu p-rel">
|
||||
|
|
@ -11,7 +14,7 @@
|
|||
<div class="menu-overlay__icon"></div>
|
||||
</label>
|
||||
<ul class="menu__list">
|
||||
<a href="{{ route('wasup') }}" class="scroller menu__link">
|
||||
<a href="{{ route($routeprefixer . 'wasup') }}" class="scroller menu__link">
|
||||
<li class="menu__item menu__item--current">
|
||||
{{ __('Marque') }}
|
||||
</li>
|
||||
|
|
@ -31,7 +34,7 @@
|
|||
<path class="cnt" d="M.85,16.34,7.34,9.17.82,2.07C4.21.91,5.86,2.13,11,9.15,5.8,16.53,3.87,18,.85,16.34Z" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="{{ route('gammes.index') }}" class="scroller menu__link">
|
||||
<a href="{{ route($routeprefixer . 'gammes.index') }}" class="scroller menu__link">
|
||||
<li class="menu__item">
|
||||
{{ __('Produits') }}
|
||||
</li>
|
||||
|
|
@ -51,7 +54,7 @@
|
|||
<path class="cnt" d="M.85,16.34,7.34,9.17.82,2.07C4.21.91,5.86,2.13,11,9.15,5.8,16.53,3.87,18,.85,16.34Z" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="{{ route('news') }}" class="scroller menu__link">
|
||||
<a href="{{ route($routeprefixer . 'news') }}" class="scroller menu__link">
|
||||
<li class="menu__item">
|
||||
{{ __('Actualités') }}
|
||||
</li>
|
||||
|
|
@ -71,7 +74,7 @@
|
|||
<path class="cnt" d="M.85,16.34,7.34,9.17.82,2.07C4.21.91,5.86,2.13,11,9.15,5.8,16.53,3.87,18,.85,16.34Z" />
|
||||
</svg>
|
||||
</a>
|
||||
<a href="{{ route('food') }}" class="scroller menu__link">
|
||||
<a href="{{ route($routeprefixer . 'food') }}" class="scroller menu__link">
|
||||
<li class="menu__item only-smrt">
|
||||
Food service
|
||||
</li>
|
||||
|
|
@ -92,16 +95,28 @@
|
|||
</svg>
|
||||
</a>
|
||||
</ul>
|
||||
<a href="{{ route('food') }}" class="featured-link ttu align-center p-abs">Food<span>service</span></a>
|
||||
<a href="{{ route($routeprefixer . 'food') }}" class="featured-link ttu align-center p-abs">Food<span>service</span></a>
|
||||
</nav>
|
||||
|
||||
<span class="secondmenu">
|
||||
<ul class="traduction">
|
||||
<li class="@if(App::getLocale() == 'fr') current @endif"><a href="?lang=FR">fr</a></li>
|
||||
<li class="@if(App::getLocale() == 'en') current @endif"><a href="?lang=EN">en</a></li>
|
||||
<li class="@if(App::getLocale() == 'es') current @endif"><a href="?lang=ES">es</a></li>
|
||||
@php
|
||||
$currentUrl = Request::path();
|
||||
if (preg_match('/^(en|es)/', $currentUrl )) {
|
||||
$currentUrlFR = '/' . preg_replace('/^(en|es)/', '', $currentUrl,1);
|
||||
$currentUrlEN = '/' . preg_replace('/^(en|es)/', 'en', $currentUrl,1);
|
||||
$currentUrlES = '/' . preg_replace('/^(en|es)/', 'es', $currentUrl,1);
|
||||
} else {
|
||||
$currentUrlFR = preg_replace('/\/\//','/', '/' . $currentUrl);
|
||||
$currentUrlEN = preg_replace('/\/\//','/','/' . preg_replace('/^/', 'en/', $currentUrl,1));
|
||||
$currentUrlES = preg_replace('/\/\//','/','/' . preg_replace('/^/', 'es/', $currentUrl,1));
|
||||
}
|
||||
@endphp
|
||||
<li class="@if(App::getLocale() == 'fr') current @endif"><a href="{{ $currentUrlFR }}">fr</a></li>
|
||||
<li class="@if(App::getLocale() == 'en') current @endif"><a href="{{ $currentUrlEN }}">en</a></li>
|
||||
<li class="@if(App::getLocale() == 'es') current @endif"><a href="{{ $currentUrlES }}">es</a></li>
|
||||
</ul>
|
||||
<form class="form search-form" method="GET" action="{{ route('search') }}">
|
||||
<form class="form search-form" method="GET" action="{{ route($routeprefixer . 'search') }}">
|
||||
<input class="search-form__input" type="search"
|
||||
placeholder="{{ __("Recherchez un produit") }}"
|
||||
id="search_filter" name="filter"
|
||||
|
|
|
|||
|
|
@ -106,7 +106,12 @@ Route::prefix('bo')
|
|||
}
|
||||
);
|
||||
|
||||
Route::middleware(['init-vars','lang-check'])
|
||||
$langs = ['en','es',''];
|
||||
|
||||
foreach ($langs as $lang) {
|
||||
Route::middleware(['init-vars','lang-check'])
|
||||
->prefix($lang)
|
||||
->name($lang == '' ? '' : $lang .'.')
|
||||
->group(
|
||||
function () {
|
||||
Route::get('/', [ControllersHomeController::class, 'index'])->name('home');
|
||||
|
|
@ -128,3 +133,6 @@ Route::middleware(['init-vars','lang-check'])
|
|||
Route::post('/contact', [ControllersContactController::class, 'contactSubmit'])->name('contact.submit');
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue