annotate vendor/symfony/translation/MessageCatalogue.php @ 19:fa3358dc1485 tip

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