MessageCachingService::getLocales()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 1
1
<?php
2
namespace JsLocalization\Caching;
3
4
use Cache;
5
use Config;
6
use Event;
7
use Lang;
8
use JsLocalization\Facades\JsLocalizationHelper;
9
10
/**
11
 * Class MessageCachingService
12
 * @package JsLocalization\Caching
13
 */
14
class MessageCachingService extends AbstractCachingService
15
{
16
17
    /**
18
     * The key used to cache the JSON encoded messages.
19
     *
20
     * @var string
21
     */
22
    const CACHE_KEY = 'js-localization-messages-json';
23
24
    /**
25
     * The key used to cache the timestamp of the last
26
     * refreshCache() call.
27
     *
28
     * @var string
29
     */
30
    const CACHE_TIMESTAMP_KEY = 'js-localization-messages-last-modified';
31
32
    
33 8
    public function __construct()
34
    {
35 8
        parent::__construct(self::CACHE_KEY, self::CACHE_TIMESTAMP_KEY);
36 8
    }
37
38
    /**
39
     * Returns the messages (already JSON encoded).
40
     * Refreshes the cache if necessary.
41
     *
42
     * @param bool $noCache (optional) Defines if cache should be ignored.
43
     * @return string JSON encoded messages object.
44
     */
45 3
    public function getMessagesJson($noCache = false)
46
    {
47 3
        if ($noCache) {
48
            return $this->createMessagesJson();
49
        } else {
50 3
            return $this->getData();
51
        }
52
    }
53
54
    /**
55
     * Refreshes the cache item containing the JSON encoded
56
     * messages object.
57
     * Fires the 'JsLocalization.registerMessages' event.
58
     *
59
     * @return void
60
     */
61 7
    public function refreshCache()
62
    {
63 7
        Event::fire('JsLocalization.registerMessages');
64
65 7
        $messagesJSON = $this->createMessagesJson();
66 7
        $this->refreshCacheUsing($messagesJSON);
67 7
    }
68
69
    /**
70
     * @return string
71
     */
72 7
    protected function createMessagesJson()
73
    {
74 7
        $locales = $this->getLocales();
75 7
        $messageKeys = $this->getMessageKeys();
76 7
        $translatedMessages = $this->getTranslatedMessagesForLocales($messageKeys, $locales);
77
78 7
        return json_encode($translatedMessages);
79
    }
80
81
    /**
82
     * Returns the locales we need to consider.
83
     *
84
     * @return array Locales.
85
     */
86 7
    protected function getLocales()
87
    {
88 7
        return Config::get('js-localization.locales');
89
    }
90
91
    /**
92
     * Returns the translated messages for the given keys and locales.
93
     *
94
     * @param array $messageKeys
95
     * @param array $locales
96
     * @return array The translated messages as [<locale> => [ <message id> => <translation>, ... ], ...]
97
     */
98 7
    protected function getTranslatedMessagesForLocales(array $messageKeys, array $locales)
99
    {
100 7
        $translatedMessages = [];
101
102 7
        foreach ($locales as $locale) {
103 7
            if (!isset($translatedMessages[$locale])) {
104 7
                $translatedMessages[$locale] = [];
105 7
            }
106
107 7
            $translatedMessages[$locale] = $this->getTranslatedMessages($messageKeys, $locale);
108 7
        }
109
110 7
        return $translatedMessages;
111
    }
112
113
    /**
114
     * Returns the translated messages for the given keys.
115
     * 
116
     * @param array $messageKeys
117
     * @param $locale
118
     * @return array The translated messages as [ <message id> => <translation>, ... ]
119
     */
120 7
    protected function getTranslatedMessages(array $messageKeys, $locale)
121
    {
122 7
        $translatedMessages = [];
123
124 7
        foreach ($messageKeys as $key) {
125 6
            $translation = Lang::get($key, [], $locale);
126
127 6
            if (is_array($translation)) {
128 6
                $flattened = $this->flattenTranslations($translation, $key.'.');
129 6
                $translatedMessages = array_merge($translatedMessages, $flattened);
130 6
            } else {
131 6
                $translatedMessages[$key] = $translation;
132
            }
133 7
        }
134
135 7
        return $translatedMessages;
136
    }
137
138
    /**
139
     * Transforms an array of nested translation messages into a "flat" (not nested) array.
140
     *
141
     * @param array $nestedMessages
142
     * @param string $keyPrefix
143
     * @return array Flattened translations array.
144
     */
145 6
    protected function flattenTranslations(array $nestedMessages, $keyPrefix='')
146
    {
147 6
        $flattened = [];
148
149 6
        foreach ($nestedMessages as $key => $message) {
150 6
            if (is_array($message)) {
151 6
                $flattenedMessages = $this->flattenTranslations($message, $keyPrefix . $key . '.');
152 6
                $flattened = array_merge($flattened, $flattenedMessages);
153 6
            } else {
154 6
                $flattened[$keyPrefix.$key] = $message;
155
            }
156 6
        }
157
158 6
        return $flattened;
159
    }
160
161
    /**
162
     * Returns the message keys of all messages
163
     * that are supposed to be sent to the browser.
164
     *
165
     * @return array Array of message keys.
166
     */
167 7
    protected function getMessageKeys()
168
    {
169 7
        $messageKeys = Config::get('js-localization.messages');
170 7
        $messageKeys = JsLocalizationHelper::resolveMessageKeyArray($messageKeys);
171
172 7
        $messageKeys = array_unique(
173 7
            array_merge($messageKeys, JsLocalizationHelper::getAdditionalMessages())
174 7
        );
175
176 7
        return $messageKeys;
177
    }
178
}
179