Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
1 / 1
LocaleResolver
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
4 / 4
8
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 run
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 setLocaleViaAcceptLanguage
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 setLocaleViaParameter
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace Dynart\Micro\Middleware;
4
5use Dynart\Micro\Middleware;
6use Dynart\Micro\Request;
7use Dynart\Micro\Router;
8use Dynart\Micro\Translation;
9
10class LocaleResolver implements Middleware {
11
12    protected Request $request;
13    protected Router $router;
14    protected Translation $translation;
15    protected int $localeRouteSegment;
16
17    public function __construct(Request $request, Router $router, Translation $translation) {
18        $this->request = $request;
19        $this->router = $router;
20        $this->translation = $translation;
21    }
22
23    public function run(): void {
24        if (!$this->translation->hasMultiLocales()) {
25            return;
26        }
27        $this->localeRouteSegment = $this->router->addPrefixVariable([$this->translation, 'locale']);
28        $this->setLocaleViaAcceptLanguage();
29        $this->setLocaleViaParameter();
30    }
31
32    protected function setLocaleViaAcceptLanguage(): void {
33        $acceptLanguage = $this->request->server('HTTP_ACCEPT_LANGUAGE');
34        if ($acceptLanguage) {
35            $acceptLocale = strtolower(substr($acceptLanguage, 0, 2)); // we use only neutral locale for now
36            if (in_array($acceptLocale, $this->translation->allLocales())) {
37                $this->translation->setLocale($acceptLocale);
38            }
39        }
40    }
41
42    protected function setLocaleViaParameter(): void {
43        $locale = $this->router->currentSegment($this->localeRouteSegment);
44        if (in_array($locale, $this->translation->allLocales())) {
45            $this->translation->setLocale($locale);
46        }
47    }
48
49}