Completed
Push — master ( c024d2...9f52f6 )
by Valentyn
03:19
created

TranslatedResponseTrait::getUserPreferredLocale()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 6.1666

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 10
cts 12
cp 0.8333
rs 8.9137
c 0
b 0
f 0
cc 6
nc 5
nop 1
crap 6.1666
1
<?php
2
3
declare(strict_types=1);
4
5
namespace App\Translation;
6
7
use Symfony\Component\HttpFoundation\RequestStack;
8
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
9
use Symfony\Component\Serializer\Serializer;
10
11
/**
12
 * Trait TranslatedResponseTrait.
13
 *
14
 * @method get($id)
15
 * @method has($id):bool
16
 */
17
trait TranslatedResponseTrait
18
{
19 33
    public function translateResponse($response, array $context): array
20
    {
21
        /** @var $normalizer Serializer */
22 33
        $normalizer = $this->get('serializer');
23 33
        $response = $normalizer->normalize($response, null, $context);
24 33
        $response = $this->translateEntities(is_array($response) ? $response : [$response]);
25
26 33
        return $response;
27
    }
28
29 33
    protected function translateEntities(array $data, $recursive = true): array
30
    {
31 33
        $translatedData = [];
32
33 33
        foreach ($data as $key => $value) {
34 33
            if ($key === 'translations') {
35 21
                $translatedData = array_merge($translatedData, $this->getEntityTranslation($value));
36
37 21
                if ($recursive === true) {
38 21
                    continue;
39
                }
40
                break;
41
            }
42
43 33
            if (is_array($value)) {
44 33
                $data[$key] = $this->translateEntities($value, $recursive);
45
            }
46
        }
47
48 33
        unset($data['translations']);
49 33
        $data = array_merge($data, $translatedData);
50
51 33
        return $data;
52
    }
53
54 21
    private function getEntityTranslation(array $translations)
55
    {
56 21
        $userLocale = $this->getUserPreferredLocale(array_keys($translations));
57
58 21
        return $translations[$userLocale];
59
    }
60
61
    /**
62
     * @param array $locales
63
     *
64
     * @return null|string
65
     */
66 21
    private function getUserPreferredLocale(array $locales = [])
67
    {
68 21
        if (!isset($locales[0])) {
69
            // there's no translations for this entity
70
            throw new NotFoundHttpException();
71
        }
72
73
        /** @var $requestStack RequestStack */
74 21
        $requestStack = $this->get('request_stack');
75 21
        $request = $requestStack->getCurrentRequest();
76
77 21
        $preferredLocale = $request->getPreferredLanguage($locales);
78
79 21
        $locale = $request->getLocale(); // can be set by query param (?language=ru) or by symfony
80 21
        if ($locale !== $request->getDefaultLocale() && in_array($locale, $locales, true) === true) {
81 4
            $preferredLocale = $locale;
82
        }
83
84 21
        if ($request->query->get('language') !== null && $locale === $request->getDefaultLocale()) {
85
            $preferredLocale = $locale;
86
        }
87
88 21
        return $preferredLocale;
89
    }
90
}
91