1 | <?php |
||
29 | class WebUIController extends Controller |
||
30 | { |
||
31 | /** |
||
32 | * Show a dashboard for the configuration. |
||
33 | * |
||
34 | * @param string|null $configName |
||
35 | * |
||
36 | * @return Response |
||
37 | */ |
||
38 | 1 | public function indexAction($configName = null) |
|
39 | { |
||
40 | 1 | if (!$this->getParameter('php_translation.webui.enabled')) { |
|
41 | return new Response('You are not allowed here. Check you config. ', 400); |
||
42 | } |
||
43 | |||
44 | 1 | $configManager = $this->get('php_translation.configuration_manager'); |
|
45 | 1 | $config = $configManager->getConfiguration($configName); |
|
46 | 1 | $localeMap = $this->getLocale2LanguageMap(); |
|
47 | 1 | $catalogues = $this->get('php_translation.catalogue_fetcher')->getCatalogues($config); |
|
48 | |||
49 | 1 | $catalogueSize = []; |
|
50 | 1 | $maxDomainSize = []; |
|
51 | 1 | $maxCatalogueSize = 1; |
|
52 | |||
53 | // For each catalogue (or locale) |
||
54 | /** @var MessageCatalogue $catalogue */ |
||
55 | 1 | foreach ($catalogues as $catalogue) { |
|
56 | 1 | $locale = $catalogue->getLocale(); |
|
57 | 1 | $domains = $catalogue->all(); |
|
58 | 1 | ksort($domains); |
|
59 | 1 | $catalogueSize[$locale] = 0; |
|
60 | 1 | foreach ($domains as $domain => $messages) { |
|
61 | 1 | $count = count($messages); |
|
62 | 1 | $catalogueSize[$locale] += $count; |
|
63 | 1 | if (!isset($maxDomainSize[$domain]) || $count > $maxDomainSize[$domain]) { |
|
64 | 1 | $maxDomainSize[$domain] = $count; |
|
65 | } |
||
66 | } |
||
67 | |||
68 | 1 | if ($catalogueSize[$locale] > $maxCatalogueSize) { |
|
69 | 1 | $maxCatalogueSize = $catalogueSize[$locale]; |
|
70 | } |
||
71 | } |
||
72 | |||
73 | 1 | return $this->render('@Translation/WebUI/index.html.twig', [ |
|
74 | 1 | 'catalogues' => $catalogues, |
|
75 | 1 | 'catalogueSize' => $catalogueSize, |
|
76 | 1 | 'maxDomainSize' => $maxDomainSize, |
|
77 | 1 | 'maxCatalogueSize' => $maxCatalogueSize, |
|
78 | 1 | 'localeMap' => $localeMap, |
|
79 | 1 | 'configName' => $config->getName(), |
|
80 | 1 | 'configNames' => $configManager->getNames(), |
|
81 | ]); |
||
82 | } |
||
83 | |||
84 | /** |
||
85 | * Show a catalogue. |
||
86 | * |
||
87 | * @param string $configName |
||
88 | * @param string $locale |
||
89 | * @param string $domain |
||
90 | * |
||
91 | * @return Response |
||
92 | */ |
||
93 | 1 | public function showAction($configName, $locale, $domain) |
|
124 | |||
125 | /** |
||
126 | * @param Request $request |
||
127 | * @param string $configName |
||
128 | * @param string $locale |
||
129 | * @param string $domain |
||
130 | * |
||
131 | * @return Response |
||
132 | */ |
||
133 | 1 | public function createAction(Request $request, $configName, $locale, $domain) |
|
134 | { |
||
135 | 1 | if (!$this->getParameter('php_translation.webui.enabled') || !$this->getParameter('php_translation.webui.allow_create')) { |
|
136 | return new Response('You are not allowed to create. Check you config. ', 400); |
||
137 | } |
||
138 | |||
139 | /** @var StorageService $storage */ |
||
140 | 1 | $storage = $this->get('php_translation.storage.'.$configName); |
|
141 | |||
142 | try { |
||
143 | 1 | $message = $this->getMessageFromRequest($request); |
|
144 | 1 | $message->setDomain($domain); |
|
145 | 1 | $message->setLocale($locale); |
|
146 | 1 | $this->validateMessage($message, ['Create']); |
|
147 | 1 | } catch (MessageValidationException $e) { |
|
148 | 1 | return new Response($e->getMessage(), 400); |
|
149 | } |
||
150 | |||
151 | try { |
||
152 | 1 | $storage->create($message); |
|
153 | } catch (StorageException $e) { |
||
154 | throw new BadRequestHttpException(sprintf( |
||
155 | 'Key "%s" does already exist for "%s" on domain "%s".', |
||
156 | $message->getKey(), |
||
157 | $locale, |
||
158 | $domain |
||
159 | ), $e); |
||
160 | } |
||
161 | |||
162 | 1 | return $this->render('@Translation/WebUI/create.html.twig', [ |
|
163 | 1 | 'message' => $message, |
|
164 | ]); |
||
165 | } |
||
166 | |||
167 | /** |
||
168 | * @param Request $request |
||
169 | * @param string $configName |
||
170 | * @param string $locale |
||
171 | * @param string $domain |
||
172 | * |
||
173 | * @return Response |
||
174 | */ |
||
175 | 1 | public function editAction(Request $request, $configName, $locale, $domain) |
|
176 | { |
||
177 | 1 | if (!$this->getParameter('php_translation.webui.enabled')) { |
|
178 | return new Response('You are not allowed here. Check you config. ', 400); |
||
179 | } |
||
180 | |||
181 | try { |
||
182 | 1 | $message = $this->getMessageFromRequest($request); |
|
183 | 1 | $message->setDomain($domain); |
|
184 | 1 | $message->setLocale($locale); |
|
185 | 1 | $this->validateMessage($message, ['Edit']); |
|
186 | 1 | } catch (MessageValidationException $e) { |
|
187 | 1 | return new Response($e->getMessage(), 400); |
|
188 | } |
||
189 | |||
190 | /** @var StorageService $storage */ |
||
191 | 1 | $storage = $this->get('php_translation.storage.'.$configName); |
|
192 | 1 | $storage->update($message); |
|
193 | |||
194 | 1 | return new Response('Translation updated'); |
|
195 | } |
||
196 | |||
197 | /** |
||
198 | * @param Request $request |
||
199 | * @param string $configName |
||
200 | * @param string $locale |
||
201 | * @param string $domain |
||
202 | * |
||
203 | * @return Response |
||
204 | */ |
||
205 | 1 | public function deleteAction(Request $request, $configName, $locale, $domain) |
|
206 | { |
||
207 | 1 | if (!$this->getParameter('php_translation.webui.enabled') || !$this->getParameter('php_translation.webui.allow_delete')) { |
|
208 | return new Response('You are not allowed to create. Check you config. ', 400); |
||
209 | } |
||
210 | |||
211 | try { |
||
212 | 1 | $message = $this->getMessageFromRequest($request); |
|
213 | 1 | $message->setLocale($locale); |
|
214 | 1 | $message->setDomain($domain); |
|
215 | 1 | $this->validateMessage($message, ['Delete']); |
|
216 | } catch (MessageValidationException $e) { |
||
217 | return new Response($e->getMessage(), 400); |
||
218 | } |
||
219 | |||
220 | /** @var StorageService $storage */ |
||
221 | 1 | $storage = $this->get('php_translation.storage.'.$configName); |
|
222 | 1 | $storage->delete($locale, $domain, $message->getKey()); |
|
223 | |||
224 | 1 | return new Response('Message was deleted'); |
|
225 | } |
||
226 | |||
227 | /** |
||
228 | * @param Request $request |
||
229 | * |
||
230 | * @return Message |
||
231 | */ |
||
232 | 3 | private function getMessageFromRequest(Request $request) |
|
233 | { |
||
234 | 3 | $json = $request->getContent(); |
|
235 | 3 | $data = json_decode($json, true); |
|
236 | 3 | $message = new Message(); |
|
237 | 3 | if (isset($data['key'])) { |
|
238 | 3 | $message->setKey($data['key']); |
|
239 | } |
||
240 | 3 | if (isset($data['message'])) { |
|
241 | 2 | $message->setTranslation($data['message']); |
|
242 | } |
||
243 | |||
244 | 3 | return $message; |
|
245 | } |
||
246 | |||
247 | /** |
||
248 | * This will return a map of our configured locales and their language name. |
||
249 | * |
||
250 | * @return array locale => language |
||
251 | */ |
||
252 | 1 | private function getLocale2LanguageMap() |
|
263 | |||
264 | /** |
||
265 | * @param Message $message |
||
266 | * @param array $validationGroups |
||
267 | * |
||
268 | * @throws MessageValidationException |
||
269 | */ |
||
270 | 3 | private function validateMessage(Message $message, array $validationGroups) |
|
277 | } |
||
278 |