Completed
Push — master ( 572f95...1f2c43 )
by Valentyn
03:47
created

TranslatedResponseTrait::getUserPreferredLocale()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 20
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4.016

Importance

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