Laravel - использовать язык навсегда после входа в систему

У меня есть приложение в Laravel, и теперь мне нужно поместить его на нескольких языках.

В пользовательскую таблицу добавляю столбец lang это говорит мне язык по умолчанию для каждого пользователя. Поэтому после входа я создаю session переменная для хранения этого значения:

protected function authenticated(Request $request, $user)
{
  session(['locale' => $user->lang]);
}

Далее я создаю и регистрирую middleware установить язык для каждого маршрута:

public function handle($request, Closure $next)
{
  if(session()->has('locale'))
  {
    app()->setLocale(session('locale'));
  }
  else
  {
    app()->setLocale(config('app.locale'));
  }

  return $next($request);
}

Если я повторяю сеанс, он дает мне правильный язык, основанный на зарегистрированном пользователе.

Но это не работает, всегда устанавливает язык по умолчанию, установленный в конфигурационном файле laravel.

Как я могу решить это?

Спасибо

2 ответа

Вы перезаписываете язык:

// Check if session has locale
if(session()->has('locale'))
    // set session locale 
    app()->setLocale(session('locale'));

// this is outside the condition block
// so it will run everytime
app()->setLocale(config('app.locale'));

Вы можете использовать фигурные скобки, чтобы избежать этого, например так:

if(session()->has('locale')) {
    app()->setLocale(session('locale'));
} else {
    app()->setLocale(config('app.locale'));    
}

Или, если вам не нравятся фигурные скобки, начните с локали по умолчанию, а затем измените ее в зависимости от того, доступна ли она в сеансах, например:

app()->setLocale(config('app.locale')); 
if(session()->has('locale'))
    app()->setLocale(session('locale'));

Я сделал это следующим образом:

Вот мое промежуточное программное обеспечение (setLocale):

      class SetLocale
{

    public function handle(Request $request, Closure $next)
    {
        if( isset(auth()->user()->language) && auth()->user()->language ) {
            App::setLocale('fa');
        }else{
            App::setLocale('en');
        }
        return $next($request);
    }
}

Языкконтроллер:

публичная функцияchangeLanguage(int $lang_code): RedirectResponse{

      App::setLocale($lang_code);

$user = auth()->user();
$user->language = $lang_code;
$user->save();

return redirect()->back();

}


nav.blade.php (для этого вам понадобится загрузочная версия 4):

              <div class="dropdown">
            <button class="btn btn-secondary btn-sm dropdown-toggle" type="button" id="languageMenuBtn" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                {{ isset(auth()->user()->language) && !auth()->user()->language ? 'Persian': 'English' }}
            </button>
            <div class="dropdown-menu" aria-labelledby="languageMenuBtn">
                <a class="dropdown-item" href="{{ isset(auth()->user()->language) && !auth()->user()->language ? route('change_language', 1) : route('change_language', 0) }}">
                    {{ isset(auth()->user()->language) && !auth()->user()->language ?  'English' : 'Persian' }}
                </a>
            </div>
        </div>

Маршрут (web.php):

      Route::get('change_language/{lang}', [App\Http\Controllers\LanguageController::class, 'changeLanguage'])->name('change_language');
Другие вопросы по тегам