Генерация ссылок на многоязычном сайте

У меня многоязычный сайт. Для локализации веб-сайта я использую промежуточное программное обеспечение, которое выглядит следующим образом:

public function handle($request, Closure $next)
{
App::setlocale('pl');
Cookie::queue(Cookie::make('lang', 'pl'), true, 1440);
return $next($request);
}

Мои имена root выглядят так: «pl.articles» или «en.acritcles», поэтому я использую cookie для генерации ссылок в поле зрения. Например:

@if(Cookie::get('lang') == 'pl')
<li><a href="{{ route('pl.allwomens') }}">@lang('category.womens')</a></li>
@else
<li><a href="{{ route('en.allwomens') }}">@lang('category.womens')</a></li>
@endif

Это работает, но у меня есть небольшая проблема. На самом деле, когда я меняю язык, ссылки ведут на предыдущую версию. Поэтому я должен перезагрузить сайт, чтобы изменить ссылки на. Иногда я нажимаю на какую-то ссылку, и язык моего сайта меняется. Я нажимаю снова, и язык возвращается к предыдущей версии. В чем проблема?
Я использую промежуточное программное обеспечение в группе

Route::group(['prefix' => 'pl', 'middleware' => ['PLLanguage', 'globalStats']], function(){

1

Решение

Создать Middleware под названием «Язык»

<?php namespace App\Http\Middleware;

use Closure, Session, Auth;

class SetLanguage {


protected $languages = ['en','pl'];

public function handle($request, Closure $next)
{
if(isset($request->applocale)){

if(in_array($request->applocale, $this->languages)){
if(!Session::has('locale'))
{
Session::put('locale', $request->applocale);

} else if( Session::get('locale') != $request->applocale ){
Session::put('locale', $request->applocale);
app()->setLocale(Session::get('locale'));
}
}

else abort(500, 'Bad request, requested language not found');

}

app()->setLocale(Session::get('locale'));

return $next($request);
}
}

поместите это промежуточное ПО в вашу веб-группу в файл Kernel.php

protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\App\Http\Middleware\SetLanguage::class,
],

'api' => [
'throttle:60,1',
'bindings',
],
];

создать форму смены языка

<a href="#" onclick="setLanguage(event, 'en')">English</a>
<a href="#" onclick="setLanguage(event, 'pl')">ქართული</a>
<form action="/setlanguage" method="POST" style="display: none" id="languageForm">
@csrf
<input id="applocale" type="text" name="applocale" >
</form>
<script>
function setLanguage(e, lang){
e.preventDefault();
$('#applocale').val(lang);
$('#languageForm').submit();
}
</script>

поэтому язык будет установлен при каждой отправке формы

тогда в ваших взглядах вы можете использовать

@php $lang = app()->getLocale(); @endphp
<li><a href="{{ route($lang.'.allwomens') }}">@lang('category.womens')</a></li>
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector