Completed
Push — master ( 9f513c...408a9b )
by Valentyn
04:02
created

TranslatedResponseTrait   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 91.18%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 4
dl 0
loc 75
ccs 31
cts 34
cp 0.9118
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A translateResponse() 0 9 2
A translateEntities() 0 24 5
A getEntityTranslation() 0 7 1
B getUserPreferredLocale() 0 24 6
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 44
    public function translateResponse($response, array $context): array
20
    {
21
        /** @var $normalizer Serializer */
22 44
        $normalizer = $this->get('serializer');
23 44
        $response = $normalizer->normalize($response, null, $context);
24 44
        $response = $this->translateEntities(is_array($response) ? $response : [$response]);
25
26 44
        return $response;
27
    }
28
29 44
    protected function translateEntities(array $data, $recursive = true): array
30
    {
31 44
        $translatedData = [];
32
33 44
        foreach ($data as $key => $value) {
34 44
            if ($key === 'translations') {
35 31
                $translatedData = array_merge($translatedData, $this->getEntityTranslation($value));
36
37 31
                if ($recursive === true) {
38 31
                    continue;
39
                }
40
                break;
41
            }
42
43 44
            if (is_array($value)) {
44 44
                $data[$key] = $this->translateEntities($value, $recursive);
45
            }
46
        }
47
48 44
        unset($data['translations']);
49 44
        $data = array_merge($data, $translatedData);
50
51 44
        return $data;
52
    }
53
54 31
    private function getEntityTranslation(array $translations)
55
    {
56 31
        $userLocale = $this->getUserPreferredLocale(array_keys($translations));
57
58 31
        unset($translations[$userLocale]['id']);
59 31
        return $translations[$userLocale];
60
    }
61
62
    /**
63
     * @param array $locales
64
     *
65
     * @return null|string
66
     */
67 31
    private function getUserPreferredLocale(array $locales = [])
68
    {
69 31
        if (!isset($locales[0])) {
70
            // there's no translations for this entity
71
            throw new NotFoundHttpException();
72
        }
73
74
        /** @var $requestStack RequestStack */
75 31
        $requestStack = $this->get('request_stack');
76 31
        $request = $requestStack->getCurrentRequest();
77
78 31
        $preferredLocale = $request->getPreferredLanguage($locales);
79
80 31
        $locale = $request->getLocale(); // can be set by query param (?language=ru) or by symfony
81 31
        if ($locale !== $request->getDefaultLocale() && in_array($locale, $locales, true) === true) {
82 4
            $preferredLocale = $locale;
83
        }
84
85 31
        if ($request->query->get('language') !== null && $locale === $request->getDefaultLocale()) {
86
            $preferredLocale = $locale;
87
        }
88
89 31
        return $preferredLocale;
90
    }
91
}
92