Newer
Older

Jan-Hendrik Willms
committed
<?php
namespace JsonApi\Middlewares;
use Negotiation\LanguageNegotiator;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
/**
* This class defines a middleware that tries to set the language for Stud.IP
* by analyzing the HTTP header "Accept-Language".
*
* @author Jan-Hendrik Willms <tleilax+studip@gmail.com>
*/
class Language
{
/**
* @param Request $request das Request-Objekt
* @param RequestHandler $handler der PSR-15 Request Handler
*
* @return ResponseInterface das neue Response-Objekt
*/
public function __invoke(Request $request, RequestHandler $handler)
{
$language = $this->detectValidLanguageFromRequest($request);
$language_before = false;

Jan-Hendrik Willms
committed
// Set language if detected
if ($language) {
$language_before = $_SESSION['_language'];

Jan-Hendrik Willms
committed
$_SESSION['_language'] = $language;
setTempLanguage(false, $language);
}
$response = $handler->handle($request);
if ($language) {
$_SESSION['_language'] = $language_before;
restoreLanguage();
}
return $response;

Jan-Hendrik Willms
committed
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
}
/**
* Tries to detect a valid installed language from the request.
*
* @param Request $request
* @return string|null The detected language (if any)
*/
private function detectValidLanguageFromRequest(Request $request): ?string
{
if (!$request->hasHeader('Accept-Language')) {
return null;
}
$negotiator = new LanguageNegotiator();
$best_language = $negotiator->getBest(
$request->getHeaderLine('Accept-Language'),
$this->getStudIPLanguagePriorities()
);
if (!$best_language) {
return null;
}
return $this->normalizeLanguageForStudIP($best_language->getType());
}
/**
* Returns a list of the normalized installed languages for the Stud.IP
* system.
*
* @return array
*/
private function getStudIPLanguagePriorities(): array
{
return array_map(
function ($language) {
return str_replace('_', '-', $language);
},
array_keys($GLOBALS['INSTALLED_LANGUAGES'])
);
}
/**
* Normalizes the given language string (<language>-<variety>, e.g. de-de)
* for Stud.IP (e.g. de_DE).
*
* @param string $language
* @return string
*/
private function normalizeLanguageForStudIP(string $language): string
{
$tags = explode('-', $language);
return $tags[0] . '_' . strtoupper($tags[1]);
}
}