Функция changeLanguage
должна отвечать за фактическое изменение языка, а не только за перенаправление
Вот пример того, как я это делаю
routes/web.php
Route::get('lang/{locale}', 'LocaleController@update')
->name('locale')
->where('locale', '(en|fr|ar)');
// Further filter in route regex (accepts only English, French and Arabic)
LocaleController.php
<?php
namespace Caddy\Http\Controllers;
class LocaleController extends Controller
{
public function update($locale)
{
// Check if the $locale passed is in the array config/app.php => locales
if (in_array($locale, config('app.locales'))) {
// Put the $locale in session with the same name as key
session(['locale' => $locale]);
}
// redirect back
return back();
}
}
Locale.php
связующее ПО
<?php
namespace Caddy\Http\Middleware;
use Closure;
class Locale
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$session_locale = session('locale');
if (in_array($session_locale, config('app.locales'))) {
// Keep the locale if already in session
$locale = $session_locale;
} else {
// Fallback to English if not defined
$locale = config('app.locale');
}
app()->setLocale($locale);
return $next($request);
}
}
Применение промежуточного ПО в глобальном масштабе
Http\Kernel.php
protected $middlewareGroups = [
'web' => [
\Caddy\Http\Middleware\Locale::class,
],
Вотmy config/app.php
'locale' => 'en',
'locales' => ['en', 'fr', 'ar'],
Тестирование
- Перейти к домену.tld / about Страница на английском языке
- Изменить URL-адрес на domain.tld / lang /fr Вы перенаправлены обратно в / о, и страница на французском языке
Надеюсь, это поможет