Files
moonwell-web/app/Http/Middleware/SetLocale.php
T

50 lines
1.6 KiB
PHP

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\AcceptHeader;
use Symfony\Component\HttpFoundation\Response;
class SetLocale
{
public function handle(Request $request, Closure $next): Response
{
app()->setLocale($this->resolve($request));
$response = $next($request);
$response->headers->set('Content-Language', app()->getLocale());
$response->setVary(array_filter(['Accept-Language', 'Cookie', config('localization.country_header')]), false);
return $response;
}
private function resolve(Request $request): string
{
$supported = config('localization.supported');
$choice = $request->cookie('moonwell_locale');
if (in_array($choice, $supported, true)) {
return $choice;
}
$languages = AcceptHeader::fromString($request->header('Accept-Language', ''));
foreach ($languages->all() as $language) {
if ($language->getQuality() <= 0) {
continue;
}
$locale = strtolower(explode('-', str_replace('_', '-', $language->getValue()))[0]);
if (in_array($locale, $supported, true)) {
return $locale;
}
}
$header = config('localization.country_header');
$country = $header ? strtoupper((string) $request->header($header, '')) : '';
if (preg_match('/^[A-Z]{2}$/D', $country)) {
return in_array($country, config('localization.russian_countries'), true) ? 'ru' : 'en';
}
return $languages->all() ? 'en' : config('localization.fallback');
}
}