У меня есть приложение на 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.
Как я могу решить это?
Спасибо
Вы перезаписываете язык:
// 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'));
Других решений пока нет …