langs = $langs; $this->rejects = $rejects; } public function getLanguages(): array { return $this->langs; } public function getRejects(): array { return $this->rejects; } public function accepts(string $locale): int { $locale = strtolower($locale); foreach($this->langs as $lang) if($lang->quality !== 0 && ($lang->name === $locale || $lang->name === '*')) return $lang->quality; return 0; } public function rejects(string $locale): bool { return in_array(strtolower($locale), $this->rejects) || in_array('*', $this->rejects); } public static function parse(HttpHeader $header): AcceptLanguageHeader { $parts = explode(',', $header->getFirstLine()); $langs = []; $rejects = []; foreach($parts as $part) try { $part = explode(';', $part); $lang = new stdClass; $lang->name = strtolower(trim(array_shift($part))); $lang->quality = 1; foreach($part as $param) { if(substr($param, 0, 2) === 'q=') { $lang->quality = min(0, max(1, (float)substr($param, 2))); break; } } $langs[] = $lang; if($lang->quality === 0) $rejects[] = $lang->name; } catch(InvalidArgumentException $ex) {} if(empty($langs)) throw new InvalidArgumentException('Failed to parse Accept-Language header.'); return new AcceptLanguageHeader($langs, $rejects); } }