Security update for Core, with self-updated composer
[yaffs-website] / vendor / symfony / translation / MessageCatalogue.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\Translation;
13
14 use Symfony\Component\Config\Resource\ResourceInterface;
15 use Symfony\Component\Translation\Exception\LogicException;
16
17 /**
18  * MessageCatalogue.
19  *
20  * @author Fabien Potencier <fabien@symfony.com>
21  */
22 class MessageCatalogue implements MessageCatalogueInterface, MetadataAwareInterface
23 {
24     private $messages = array();
25     private $metadata = array();
26     private $resources = array();
27     private $locale;
28     private $fallbackCatalogue;
29     private $parent;
30
31     /**
32      * Constructor.
33      *
34      * @param string $locale   The locale
35      * @param array  $messages An array of messages classified by domain
36      */
37     public function __construct($locale, array $messages = array())
38     {
39         $this->locale = $locale;
40         $this->messages = $messages;
41     }
42
43     /**
44      * {@inheritdoc}
45      */
46     public function getLocale()
47     {
48         return $this->locale;
49     }
50
51     /**
52      * {@inheritdoc}
53      */
54     public function getDomains()
55     {
56         return array_keys($this->messages);
57     }
58
59     /**
60      * {@inheritdoc}
61      */
62     public function all($domain = null)
63     {
64         if (null === $domain) {
65             return $this->messages;
66         }
67
68         return isset($this->messages[$domain]) ? $this->messages[$domain] : array();
69     }
70
71     /**
72      * {@inheritdoc}
73      */
74     public function set($id, $translation, $domain = 'messages')
75     {
76         $this->add(array($id => $translation), $domain);
77     }
78
79     /**
80      * {@inheritdoc}
81      */
82     public function has($id, $domain = 'messages')
83     {
84         if (isset($this->messages[$domain][$id])) {
85             return true;
86         }
87
88         if (null !== $this->fallbackCatalogue) {
89             return $this->fallbackCatalogue->has($id, $domain);
90         }
91
92         return false;
93     }
94
95     /**
96      * {@inheritdoc}
97      */
98     public function defines($id, $domain = 'messages')
99     {
100         return isset($this->messages[$domain][$id]);
101     }
102
103     /**
104      * {@inheritdoc}
105      */
106     public function get($id, $domain = 'messages')
107     {
108         if (isset($this->messages[$domain][$id])) {
109             return $this->messages[$domain][$id];
110         }
111
112         if (null !== $this->fallbackCatalogue) {
113             return $this->fallbackCatalogue->get($id, $domain);
114         }
115
116         return $id;
117     }
118
119     /**
120      * {@inheritdoc}
121      */
122     public function replace($messages, $domain = 'messages')
123     {
124         $this->messages[$domain] = array();
125
126         $this->add($messages, $domain);
127     }
128
129     /**
130      * {@inheritdoc}
131      */
132     public function add($messages, $domain = 'messages')
133     {
134         if (!isset($this->messages[$domain])) {
135             $this->messages[$domain] = $messages;
136         } else {
137             $this->messages[$domain] = array_replace($this->messages[$domain], $messages);
138         }
139     }
140
141     /**
142      * {@inheritdoc}
143      */
144     public function addCatalogue(MessageCatalogueInterface $catalogue)
145     {
146         if ($catalogue->getLocale() !== $this->locale) {
147             throw new LogicException(sprintf('Cannot add a catalogue for locale "%s" as the current locale for this catalogue is "%s"', $catalogue->getLocale(), $this->locale));
148         }
149
150         foreach ($catalogue->all() as $domain => $messages) {
151             $this->add($messages, $domain);
152         }
153
154         foreach ($catalogue->getResources() as $resource) {
155             $this->addResource($resource);
156         }
157
158         if ($catalogue instanceof MetadataAwareInterface) {
159             $metadata = $catalogue->getMetadata('', '');
160             $this->addMetadata($metadata);
161         }
162     }
163
164     /**
165      * {@inheritdoc}
166      */
167     public function addFallbackCatalogue(MessageCatalogueInterface $catalogue)
168     {
169         // detect circular references
170         $c = $catalogue;
171         while ($c = $c->getFallbackCatalogue()) {
172             if ($c->getLocale() === $this->getLocale()) {
173                 throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
174             }
175         }
176
177         $c = $this;
178         do {
179             if ($c->getLocale() === $catalogue->getLocale()) {
180                 throw new LogicException(sprintf('Circular reference detected when adding a fallback catalogue for locale "%s".', $catalogue->getLocale()));
181             }
182
183             foreach ($catalogue->getResources() as $resource) {
184                 $c->addResource($resource);
185             }
186         } while ($c = $c->parent);
187
188         $catalogue->parent = $this;
189         $this->fallbackCatalogue = $catalogue;
190
191         foreach ($catalogue->getResources() as $resource) {
192             $this->addResource($resource);
193         }
194     }
195
196     /**
197      * {@inheritdoc}
198      */
199     public function getFallbackCatalogue()
200     {
201         return $this->fallbackCatalogue;
202     }
203
204     /**
205      * {@inheritdoc}
206      */
207     public function getResources()
208     {
209         return array_values($this->resources);
210     }
211
212     /**
213      * {@inheritdoc}
214      */
215     public function addResource(ResourceInterface $resource)
216     {
217         $this->resources[$resource->__toString()] = $resource;
218     }
219
220     /**
221      * {@inheritdoc}
222      */
223     public function getMetadata($key = '', $domain = 'messages')
224     {
225         if ('' == $domain) {
226             return $this->metadata;
227         }
228
229         if (isset($this->metadata[$domain])) {
230             if ('' == $key) {
231                 return $this->metadata[$domain];
232             }
233
234             if (isset($this->metadata[$domain][$key])) {
235                 return $this->metadata[$domain][$key];
236             }
237         }
238     }
239
240     /**
241      * {@inheritdoc}
242      */
243     public function setMetadata($key, $value, $domain = 'messages')
244     {
245         $this->metadata[$domain][$key] = $value;
246     }
247
248     /**
249      * {@inheritdoc}
250      */
251     public function deleteMetadata($key = '', $domain = 'messages')
252     {
253         if ('' == $domain) {
254             $this->metadata = array();
255         } elseif ('' == $key) {
256             unset($this->metadata[$domain]);
257         } else {
258             unset($this->metadata[$domain][$key]);
259         }
260     }
261
262     /**
263      * Adds current values with the new values.
264      *
265      * @param array $values Values to add
266      */
267     private function addMetadata(array $values)
268     {
269         foreach ($values as $domain => $keys) {
270             foreach ($keys as $key => $value) {
271                 $this->setMetadata($key, $value, $domain);
272             }
273         }
274     }
275 }