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');