106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?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; | ||
|  | 
 | ||
|  | use Symfony\Component\Translation\Catalogue\AbstractOperation; | ||
|  | use Symfony\Component\Translation\Catalogue\TargetOperation; | ||
|  | 
 | ||
|  | final class TranslatorBag implements TranslatorBagInterface | ||
|  | { | ||
|  |     /** @var MessageCatalogue[] */ | ||
|  |     private $catalogues = []; | ||
|  | 
 | ||
|  |     public function addCatalogue(MessageCatalogue $catalogue): void | ||
|  |     { | ||
|  |         if (null !== $existingCatalogue = $this->getCatalogue($catalogue->getLocale())) { | ||
|  |             $catalogue->addCatalogue($existingCatalogue); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->catalogues[$catalogue->getLocale()] = $catalogue; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function addBag(TranslatorBagInterface $bag): void | ||
|  |     { | ||
|  |         foreach ($bag->getCatalogues() as $catalogue) { | ||
|  |             $this->addCatalogue($catalogue); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function getCatalogue(string $locale = null) | ||
|  |     { | ||
|  |         if (null === $locale || !isset($this->catalogues[$locale])) { | ||
|  |             $this->catalogues[$locale] = new MessageCatalogue($locale); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $this->catalogues[$locale]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function getCatalogues(): array | ||
|  |     { | ||
|  |         return array_values($this->catalogues); | ||
|  |     } | ||
|  | 
 | ||
|  |     public function diff(TranslatorBagInterface $diffBag): self | ||
|  |     { | ||
|  |         $diff = new self(); | ||
|  | 
 | ||
|  |         foreach ($this->catalogues as $locale => $catalogue) { | ||
|  |             if (null === $diffCatalogue = $diffBag->getCatalogue($locale)) { | ||
|  |                 $diff->addCatalogue($catalogue); | ||
|  | 
 | ||
|  |                 continue; | ||
|  |             } | ||
|  | 
 | ||
|  |             $operation = new TargetOperation($diffCatalogue, $catalogue); | ||
|  |             $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::NEW_BATCH); | ||
|  |             $newCatalogue = new MessageCatalogue($locale); | ||
|  | 
 | ||
|  |             foreach ($operation->getDomains() as $domain) { | ||
|  |                 $newCatalogue->add($operation->getNewMessages($domain), $domain); | ||
|  |             } | ||
|  | 
 | ||
|  |             $diff->addCatalogue($newCatalogue); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $diff; | ||
|  |     } | ||
|  | 
 | ||
|  |     public function intersect(TranslatorBagInterface $intersectBag): self | ||
|  |     { | ||
|  |         $diff = new self(); | ||
|  | 
 | ||
|  |         foreach ($this->catalogues as $locale => $catalogue) { | ||
|  |             if (null === $intersectCatalogue = $intersectBag->getCatalogue($locale)) { | ||
|  |                 continue; | ||
|  |             } | ||
|  | 
 | ||
|  |             $operation = new TargetOperation($catalogue, $intersectCatalogue); | ||
|  |             $operation->moveMessagesToIntlDomainsIfPossible(AbstractOperation::OBSOLETE_BATCH); | ||
|  |             $obsoleteCatalogue = new MessageCatalogue($locale); | ||
|  | 
 | ||
|  |             foreach ($operation->getDomains() as $domain) { | ||
|  |                 $obsoleteCatalogue->add($operation->getObsoleteMessages($domain), $domain); | ||
|  |             } | ||
|  | 
 | ||
|  |             $diff->addCatalogue($obsoleteCatalogue); | ||
|  |         } | ||
|  | 
 | ||
|  |         return $diff; | ||
|  |     } | ||
|  | } |