50 lines
1.6 KiB
PHP
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');
|
|
}
|
|
}
|