3 回答
TA贡献1757条经验 获得超8个赞
您必须有某种中间件,因为会话(语言)不是持久的。您可以尝试这样的事情(语言中间件):
public function handle($request, Closure $next)
{
if (auth()->check()) {
$language = auth()->user()->language;
if (empty($language)) {
$language = config('app.fallback_locale');
}
app()->setLocale($language);
Session::put('applocale', $language);
auth()->user()->language = $language;
auth()->user()->save();
return $next($request);
}
if (Session::has('applocale')) {
app()->setLocale(Session::get('applocale'));
} else {
app()->setLocale(config('app.fallback_locale'));
Session::put('applocale', config('app.fallback_locale'));
}
return $next($request);
}
如您所见,我将每个用户的语言存储在数据库中。在控制器中你可以有这样的东西:
if (auth()->check()) {
auth()->user()->language = $language;
auth()->user()->save();
return back();
}
Session::put('applocale', $language);
return back();
}
尝试考虑这样的事情
TA贡献1802条经验 获得超6个赞
您没有描述任何错误,但您可能不熟悉语言环境在 Laravel 中的工作方式。区域设置是根据请求设置的。因此,如果您在访问站点时在此控制器方法中设置语言环境(假设它工作正常),那么语言环境将再次与配置文件中的设置相同。
要在方法中解决此 AppServiceProvider,boot
您可以添加如下代码:
if ($user = auth()->user()) { App::setLocale($user->language);}
这样,当用户登录并且每次访问站点(假设他已登录)时将区域设置保存在他的配置文件中时,他将在有效区域设置中看到站点。当然,当用户未登录时,它并不能解决问题。对于这种情况,您可能希望为用户创建额外的 cookie 以从 cookie 设置区域设置,以防用户未登录。
TA贡献1802条经验 获得超5个赞
您需要中间件来保持本地化
class Language
{
protected $app;
public function __construct(Application $app, Request $request) {
$this->app = $app;
}
public function handle($request, Closure $next)
{
$this->app->setLocale(session('user_locale', config('app.locale')));
return $next($request);
}
}
这个中间件应该适用于每条路线:
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\Language::class,
]
];
- 3 回答
- 0 关注
- 115 浏览
添加回答
举报