123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Translation\Catalogue;
- use Symfony\Component\Translation\Exception\InvalidArgumentException;
- use Symfony\Component\Translation\Exception\LogicException;
- use Symfony\Component\Translation\MessageCatalogue;
- use Symfony\Component\Translation\MessageCatalogueInterface;
- /**
- * Base catalogues binary operation class.
- *
- * A catalogue binary operation performs operation on
- * source (the left argument) and target (the right argument) catalogues.
- *
- * @author Jean-François Simon <contact@jfsimon.fr>
- */
- abstract class AbstractOperation implements OperationInterface
- {
- public const OBSOLETE_BATCH = 'obsolete';
- public const NEW_BATCH = 'new';
- public const ALL_BATCH = 'all';
- protected $source;
- protected $target;
- protected $result;
- /**
- * @var array|null The domains affected by this operation
- */
- private $domains;
- /**
- * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
- *
- * The data structure of this array is as follows:
- *
- * [
- * 'domain 1' => [
- * 'all' => [...],
- * 'new' => [...],
- * 'obsolete' => [...]
- * ],
- * 'domain 2' => [
- * 'all' => [...],
- * 'new' => [...],
- * 'obsolete' => [...]
- * ],
- * ...
- * ]
- *
- * @var array The array that stores 'all', 'new' and 'obsolete' messages
- */
- protected $messages;
- /**
- * @throws LogicException
- */
- public function __construct(MessageCatalogueInterface $source, MessageCatalogueInterface $target)
- {
- if ($source->getLocale() !== $target->getLocale()) {
- throw new LogicException('Operated catalogues must belong to the same locale.');
- }
- $this->source = $source;
- $this->target = $target;
- $this->result = new MessageCatalogue($source->getLocale());
- $this->messages = [];
- }
- /**
- * {@inheritdoc}
- */
- public function getDomains()
- {
- if (null === $this->domains) {
- $domains = [];
- foreach ([$this->source, $this->target] as $catalogue) {
- foreach ($catalogue->getDomains() as $domain) {
- $domains[$domain] = $domain;
- if ($catalogue->all($domainIcu = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX)) {
- $domains[$domainIcu] = $domainIcu;
- }
- }
- }
- $this->domains = array_values($domains);
- }
- return $this->domains;
- }
- /**
- * {@inheritdoc}
- */
- public function getMessages(string $domain)
- {
- if (!\in_array($domain, $this->getDomains())) {
- throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain));
- }
- if (!isset($this->messages[$domain][self::ALL_BATCH])) {
- $this->processDomain($domain);
- }
- return $this->messages[$domain][self::ALL_BATCH];
- }
- /**
- * {@inheritdoc}
- */
- public function getNewMessages(string $domain)
- {
- if (!\in_array($domain, $this->getDomains())) {
- throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain));
- }
- if (!isset($this->messages[$domain][self::NEW_BATCH])) {
- $this->processDomain($domain);
- }
- return $this->messages[$domain][self::NEW_BATCH];
- }
- /**
- * {@inheritdoc}
- */
- public function getObsoleteMessages(string $domain)
- {
- if (!\in_array($domain, $this->getDomains())) {
- throw new InvalidArgumentException(sprintf('Invalid domain: "%s".', $domain));
- }
- if (!isset($this->messages[$domain][self::OBSOLETE_BATCH])) {
- $this->processDomain($domain);
- }
- return $this->messages[$domain][self::OBSOLETE_BATCH];
- }
- /**
- * {@inheritdoc}
- */
- public function getResult()
- {
- foreach ($this->getDomains() as $domain) {
- if (!isset($this->messages[$domain])) {
- $this->processDomain($domain);
- }
- }
- return $this->result;
- }
- /**
- * @param self::*_BATCH $batch
- */
- public function moveMessagesToIntlDomainsIfPossible(string $batch = self::ALL_BATCH): void
- {
- // If MessageFormatter class does not exists, intl domains are not supported.
- if (!class_exists(\MessageFormatter::class)) {
- return;
- }
- foreach ($this->getDomains() as $domain) {
- $intlDomain = $domain.MessageCatalogueInterface::INTL_DOMAIN_SUFFIX;
- switch ($batch) {
- case self::OBSOLETE_BATCH: $messages = $this->getObsoleteMessages($domain); break;
- case self::NEW_BATCH: $messages = $this->getNewMessages($domain); break;
- case self::ALL_BATCH: $messages = $this->getMessages($domain); break;
- default: throw new \InvalidArgumentException(sprintf('$batch argument must be one of ["%s", "%s", "%s"].', self::ALL_BATCH, self::NEW_BATCH, self::OBSOLETE_BATCH));
- }
- if (!$messages || (!$this->source->all($intlDomain) && $this->source->all($domain))) {
- continue;
- }
- $result = $this->getResult();
- $allIntlMessages = $result->all($intlDomain);
- $currentMessages = array_diff_key($messages, $result->all($domain));
- $result->replace($currentMessages, $domain);
- $result->replace($allIntlMessages + $messages, $intlDomain);
- }
- }
- /**
- * Performs operation on source and target catalogues for the given domain and
- * stores the results.
- *
- * @param string $domain The domain which the operation will be performed for
- */
- abstract protected function processDomain(string $domain);
- }
|