Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
22 / 22 |
|
100.00% |
10 / 10 |
CRAP | |
100.00% |
1 / 1 |
Translator | |
100.00% |
22 / 22 |
|
100.00% |
10 / 10 |
14 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
translate | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
translatePlural | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
translateText | |
100.00% |
7 / 7 |
|
100.00% |
1 / 1 |
3 | |||
replaceText | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
getLocale | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setLocale | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
2 | |||
getLocales | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
hasLocale | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
setLocales | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | declare(strict_types=1); |
4 | |
5 | namespace Engelsystem\Helpers\Translation; |
6 | |
7 | class Translator |
8 | { |
9 | protected string $locale; |
10 | |
11 | /** @var callable */ |
12 | protected $getTranslatorCallback; |
13 | |
14 | /** @var callable */ |
15 | protected $localeChangeCallback; |
16 | |
17 | /** |
18 | * Translator constructor. |
19 | * |
20 | * @param string[] $locales |
21 | */ |
22 | public function __construct( |
23 | string $locale, |
24 | protected string $fallbackLocale, |
25 | callable $getTranslatorCallback, |
26 | protected array $locales = [], |
27 | callable $localeChangeCallback = null |
28 | ) { |
29 | $this->localeChangeCallback = $localeChangeCallback; |
30 | $this->getTranslatorCallback = $getTranslatorCallback; |
31 | |
32 | $this->setLocale($locale); |
33 | } |
34 | |
35 | /** |
36 | * Get the translation for a given key |
37 | */ |
38 | public function translate(string $key, array $replace = []): string |
39 | { |
40 | return $this->translateText('gettext', [$key], $replace); |
41 | } |
42 | |
43 | /** |
44 | * Get the translation for a given key |
45 | */ |
46 | public function translatePlural(string $key, string $pluralKey, int $number, array $replace = []): string |
47 | { |
48 | return $this->translateText('ngettext', [$key, $pluralKey, $number], $replace); |
49 | } |
50 | |
51 | protected function translateText(string $type, array $parameters, array $replace = []): mixed |
52 | { |
53 | $translated = $parameters[0]; |
54 | |
55 | foreach ([$this->locale, $this->fallbackLocale] as $lang) { |
56 | /** @var GettextTranslator $translator */ |
57 | $translator = call_user_func($this->getTranslatorCallback, $lang); |
58 | |
59 | try { |
60 | $translated = call_user_func_array([$translator, $type], $parameters); |
61 | break; |
62 | } catch (TranslationNotFound) { |
63 | } |
64 | } |
65 | |
66 | return $this->replaceText($translated, $replace); |
67 | } |
68 | |
69 | /** |
70 | * Replace placeholders |
71 | */ |
72 | protected function replaceText(string $key, array $replace = []): mixed |
73 | { |
74 | if (empty($replace)) { |
75 | return $key; |
76 | } |
77 | |
78 | return call_user_func_array('sprintf', array_merge([$key], array_values($replace))); |
79 | } |
80 | |
81 | public function getLocale(): string |
82 | { |
83 | return $this->locale; |
84 | } |
85 | |
86 | public function setLocale(string $locale): void |
87 | { |
88 | $this->locale = $locale; |
89 | |
90 | if (is_callable($this->localeChangeCallback)) { |
91 | call_user_func_array($this->localeChangeCallback, [$locale]); |
92 | } |
93 | } |
94 | |
95 | /** |
96 | * @return string[] |
97 | */ |
98 | public function getLocales(): array |
99 | { |
100 | return $this->locales; |
101 | } |
102 | |
103 | public function hasLocale(string $locale): bool |
104 | { |
105 | return isset($this->locales[$locale]); |
106 | } |
107 | |
108 | /** |
109 | * @param string[] $locales |
110 | */ |
111 | public function setLocales(array $locales): void |
112 | { |
113 | $this->locales = $locales; |
114 | } |
115 | } |