73 lines
2 KiB
PHP
73 lines
2 KiB
PHP
|
<?php
|
||
|
// AcceptLanguageHeader.php
|
||
|
// Created: 2022-02-14
|
||
|
// Updated: 2022-02-27
|
||
|
|
||
|
namespace Index\Http\Headers;
|
||
|
|
||
|
use stdClass;
|
||
|
use InvalidArgumentException;
|
||
|
use Index\Http\HttpHeader;
|
||
|
|
||
|
class AcceptLanguageHeader {
|
||
|
private array $langs;
|
||
|
private array $rejects;
|
||
|
|
||
|
public function __construct(array $langs, array $rejects) {
|
||
|
$this->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, floatval(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);
|
||
|
}
|
||
|
}
|