Локализация Laravel с использованием сеанса, не применяемого глобально (локаль меняется в сеансе, но app()->getLocale() Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Локализация Laravel с использованием сеанса, не применяемого глобально (локаль меняется в сеансе, но app()->getLocale()

Сообщение Anonymous »

Я пытаюсь реализовать локализацию (английский/японский) в проекте Laravel 12, используя переключение языка на основе сеанса.
У меня есть маршрут для переключения языка:

Код: Выделить всё

Route::get('/lang/{locale}', function ($locale) {
if (!in_array($locale, ['en', 'ja'])) {
abort(400);
}

session()->put('locale', $locale);

return redirect()->back();
})->name('lang.switch');
Я создал промежуточное программное обеспечение:

Код: Выделить всё

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;

class SetLocale
{
public function handle($request, Closure $next)
{
$locale = session('locale', 'en');

App::setLocale($locale);

return $next($request);
}
}
И зарегистрировал его в Kernel.php внутри группы промежуточного ПО Web:

Код: Выделить всё

protected $middlewareGroups = [
'web' => [
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,

\App\Http\Middleware\SetLocale::class,

\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
В моем представлении Blade (

Код: Выделить всё

dashboard.blade.php
), я показываю:

Код: Выделить всё

SESSION: {{ session('locale') }}

APP: {{ app()->getLocale() }}

{{ __('messages.dashboard') }}
{{ __('messages.system_overview') }}
Файлы перевода:
resources/lang/en/messages.php

Код: Выделить всё

return [
'dashboard' => 'Dashboard',
'system_overview' => 'System Overview',
];
resources/lang/ja/messages.php

Код: Выделить всё

return [
'dashboard' => 'ダッシュボード',
'system_overview' => 'システム概要',
];
Проблема
  • Код: Выделить всё

    session('locale')
    изменяется правильно ( / ja)
  • Меню навигации переводит правильно
  • НО на приборной панели:

    Код: Выделить всё

    app()->getLocale()
    остается en
  • Переводы не обновляются


Что я пробовал
  • Очистка кэша:

    Код: Выделить всё

    php artisan optimize:clear
    php artisan view:clear
    
    
  • Проверенное промежуточное ПО зарегистрировано
  • Проверенные файлы перевода корректны
  • Удалены повторяющиеся ключи в языковых файлах
  • Промежуточное ПО выполняется правильно
Вопрос
Почему session('locale') обновляется правильно, но app()->getLocale() не отражает его в представлениях Blade?
Есть ли в Laravel 12 что-то особенное в отношении порядка выполнения промежуточного программного обеспечения или обработки локализации, что мне может не хватать?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»