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