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'); } }