0

我在 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 配置文件中。

我该如何解决这个问题?

谢谢

4

1 回答 1

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'));
于 2018-10-26T17:10:39.243 回答