Completed
Push — master ( 2b6913...e398e8 )
by Dominik
02:35
created

LocaleTranslationProvider::hasNamedArguments()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 5
nc 3
nop 1
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
    public function __construct(string $locale, array $translations)
23
    {
24
        $this->locale = $locale;
25
        $this->translations = $translations;
26
    }
27
28
    /**
29
     * @return string
30
     */
31
    public function getLocale(): string
32
    {
33
        return $this->locale;
34
    }
35
36
    /**
37
     * @param string $key
38
     * @param array  $arguments
39
     *
40
     * @return string|null
41
     */
42
    public function translate(string $key, array $arguments = [])
43
    {
44
        if (!isset($this->translations[$key])) {
45
            return null;
46
        }
47
48
        if (!$this->hasNamedArguments($arguments)) {
49
            return $this->translateWithoutNamedArguments($key, $arguments);
50
        }
51
52
        return $this->translateWithNamedArguments($key, $arguments);
53
    }
54
55
    /**
56
     * @param array $arguments
57
     * @return bool
58
     */
59
    private function hasNamedArguments(array $arguments): bool
60
    {
61
        foreach (array_keys($arguments) as $name) {
62
            if (!is_numeric($name)) {
63
                return true;
64
            }
65
        }
66
67
        return false;
68
    }
69
70
    /**
71
     * @param string $key
72
     * @param array $arguments
73
     * @return string
74
     */
75
    private function translateWithoutNamedArguments(string $key, array $arguments = []): string
76
    {
77
        return sprintf($this->translations[$key], ...$arguments);
78
    }
79
80
    /**
81
     * @param string $key
82
     * @param array $arguments
83
     * @return string
84
     */
85
    private function translateWithNamedArguments(string $key, array $arguments = []): string
86
    {
87
        $translation = $this->translations[$key];
88
        foreach ($arguments as $name => $value) {
89
            $translation = str_replace('{{' . $name . '}}', $value, $translation);
90
        }
91
92
        return $translation;
93
    }
94
}
95