35 lines
1.3 KiB
PHP
35 lines
1.3 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Middleware;
|
||
|
||
use App\Support\LotteryLocale;
|
||
use Closure;
|
||
use Illuminate\Http\Request;
|
||
use Symfony\Component\HttpFoundation\Response;
|
||
|
||
/**
|
||
* 【API 语言协商中间件】
|
||
*
|
||
* - 挂载位置:bootstrap/app.php 中对 api 分组 prepend,所有 /api/* 请求都会先执行本中间件。
|
||
* - 职责:解析客户端语言 → 写入 $request->attributes['lottery_locale'] → 调用 app()->setLocale(),
|
||
* 便于 trans()、LotteryMessage 及后续按 zh/en/ne 选库表文案列时使用。
|
||
*
|
||
* 【协商顺序】① 请求头 X-Locale(必须为 config 支持的 zh/en/ne 之一);② Accept-Language 首选项;③ fallback。
|
||
*
|
||
* 【与前端】浏览器或 App 可直接带 X-Locale,或仅靠 Accept-Language;无需前端维护文案 JSON。
|
||
*
|
||
* 【与异常 JSON】{@see LotteryLocale} 与 middleware 同源,在未命中路由、`lottery_locale` 未写入时仍可从 Header 推导。
|
||
*/
|
||
class NegotiateLotteryLocale
|
||
{
|
||
public function handle(Request $request, Closure $next): Response
|
||
{
|
||
$locale = LotteryLocale::resolve($request);
|
||
// attribute 名称固定为 lottery_locale,与 Request::lotteryLocale() 宏一致
|
||
$request->attributes->set('lottery_locale', $locale);
|
||
app()->setLocale($locale);
|
||
|
||
return $next($request);
|
||
}
|
||
}
|