1<?php
2
3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0.
4// See the LICENCE file in the repository root for full licence text.
5
6namespace App\Http\Middleware;
7
8use App;
9use App\Libraries\AcceptHttpLanguage\Parser;
10use Auth;
11use Carbon\Carbon;
12use Closure;
13use Illuminate\Http\Request;
14
15class SetLocale
16{
17 /**
18 * Handle an incoming request.
19 *
20 * @param \Illuminate\Http\Request $request
21 * @param \Closure $next
22 *
23 * @return mixed
24 */
25 public function handle(Request $request, Closure $next)
26 {
27 $this->setLocale(
28 Auth::user()?->user_lang ?? presence($request->cookie('locale')),
29 $request,
30 );
31
32 return $next($request);
33 }
34
35 protected function setLocale(?string $locale, Request $request): void
36 {
37 if ($locale !== null) {
38 $locale = get_valid_locale($locale);
39 }
40 $locale ??= $this->localeFromHeader($request);
41
42 App::setLocale($locale);
43 // Carbon setLocale normalizes the locale
44 Carbon::setLocale($locale === 'sr' ? 'sr_Cyrl' : $locale);
45 }
46
47 private function localeFromHeader(Request $request): string
48 {
49 return (new Parser())->languageRegionCompatibleFor($request->server('HTTP_ACCEPT_LANGUAGE'))
50 ?? $GLOBALS['cfg']['app']['fallback_locale'];
51 }
52}