LocaleTranslationProvider::translate()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 2
dl 0
loc 12
ccs 6
cts 6
cp 1
crap 3
rs 9.8666
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chubbyphp\Translation;
6
7
final class LocaleTranslationProvider implements LocaleTranslationProviderInterface
8
{
9
    /**
10
     * @var string
11
     */
12
    private $locale;
13
14
    /**
15
     * @var string[]|array
16
     */
17
    private $translations;
18
19
    /**
20
     * @param array|string[] $translations
21
     */
22 4
    public function __construct(string $locale, array $translations)
23
    {
24 4
        $this->locale = $locale;
25 4
        $this->translations = $translations;
26 4
    }
27
28
    /**
29
     * @return string
30
     */
31 1
    public function getLocale(): string
32
    {
33 1
        return $this->locale;
34
    }
35
36
    /**
37
     * @param string $key
38
     * @param array  $arguments
39
     *
40
     * @return string|null
41
     */
42 3
    public function translate(string $key, array $arguments = [])
43
    {
44 3
        if (!isset($this->translations[$key])) {
45 3
            return null;
46
        }
47
48 3
        if (!$this->hasNamedArguments($arguments)) {
49 2
            return $this->translateWithoutNamedArguments($key, $arguments);
50
        }
51
52 1
        return $this->translateWithNamedArguments($key, $arguments);
53
    }
54
55
    /**
56
     * @param array $arguments
57
     *
58
     * @return bool
59
     */
60 3
    private function hasNamedArguments(array $arguments): bool
61
    {
62 3
        foreach (array_keys($arguments) as $name) {
63 2
            if (!is_numeric($name)) {
64 2
                return true;
65
            }
66
        }
67
68 2
        return false;
69
    }
70
71
    /**
72
     * @param string $key
73
     * @param array  $arguments
74
     *
75
     * @return string
76
     */
77 2
    private function translateWithoutNamedArguments(string $key, array $arguments = []): string
78
    {
79 2
        return sprintf($this->translations[$key], ...$arguments);
80
    }
81
82
    /**
83
     * @param string $key
84
     * @param array  $arguments
85
     *
86
     * @return string
87
     */
88 1
    private function translateWithNamedArguments(string $key, array $arguments = []): string
89
    {
90 1
        $translation = $this->translations[$key];
91 1
        foreach ($arguments as $name => $value) {
92 1
            $translation = str_replace('{{'.$name.'}}', $value, $translation);
93
        }
94
95 1
        return $translation;
96
    }
97
}
98