还有一个类似的问题,其中有人询问如何更改未经身份验证的消息(如何更改 laravel sainttum return "message": "Unauthenticated.")。
但是,我想使用我的 lang/en/auth.php、lang/de/auth.php 文件对其进行本地化。 两者都包含以下记录:
lang/en/auth.php:
'unauthenticated' => 'english unauthenticated.'
lang/de/auth.php:
'unauthenticated' => 'deutsch unauthenticated.'
登录用户的当前语言存储在会话中,如下所示:
"locale";s:2:"de";
(因此当前语言应该是德语)
我尝试修改app/Exceptions/Handler.php中的register方法:
public function register()
{
$this->reportable(function (Throwable $e) {
//
});
$this->renderable(function (AuthenticationException $e, $request) {
return response()->json([
'status_code' => 401,
'success' => false,
'message' => __('auth.unauthenticated')
], 401);
});
}
但是,似乎会话未知/此处未设置区域设置,因为返回的消息始终是默认(en)消息(english unauthenticated.),即使我使用德语(de)语言登录。
自从提交问题以来,我已经参与了多个 Laravel 项目,因此我正在更新答案,为有需要的人提供一些额外的信息:
使用
__
方法来翻译按键本身不足以处理 Laravel 中的本地化。可以更好地跨多个级别处理区域设置管理,确保经过身份验证和未经身份验证的用户都能看到正确的本地化内容。
存储和维护区域设置:
Session:将区域设置存储在会话中以处理未经身份验证的用户:
session()->put('locale', $locale);
用户(可选):如果您希望区域设置在登录用户的会话中持续存在,请将其存储在数据库中并根据需要检索它。
关键步骤:中间件
要在应用程序中正确应用区域设置,您需要在每个请求上设置区域设置。这就是中间件发挥作用的地方。如果没有此步骤,Laravel 将默认使用应用程序的基本语言环境(通常为英语),这可能可以解释为什么您的语言环境没有一致应用。
这是一个根据会话设置应用程序区域设置的中间件示例:
public function handle(Request $request, Closure $next): Response
{
if (session()->has('locale')) {
app()->setLocale(session()->get('locale'));
}
return $next($request);
}
为什么中间件很重要: 由于 HTTP 是无状态的,因此您需要为每个请求设置正确的区域设置。此外,用户可以更改他们的区域设置,因此我们需要为每个请求设置语言。