Select Git revision
FileRefsContentShow.php
Forked from
Stud.IP / Stud.IP
Source project has a limited visibility.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Language.php 2.69 KiB
<?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;
// Set language if detected
if ($language) {
$language_before = $_SESSION['_language'];
$_SESSION['_language'] = $language;
setTempLanguage(false, $language);
}
$response = $handler->handle($request);
if ($language) {
$_SESSION['_language'] = $language_before;
restoreLanguage();
}
return $response;
}
/**
* 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]);
}
}