annotate vendor/symfony/translation/MessageCatalogue.php @ 8:50b0d041100e

Further files for download
author Chris Cannam
date Mon, 05 Feb 2018 10:56:40 +0000
parents 4c8ae668cc8c
children 1fec387a4317
rev   line source
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 }