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 推导。 */ final 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); } }