172 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			172 lines
		
	
	
		
			4.8 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\HttpKernel\CacheWarmer\WarmableInterface; | ||
|  | use Symfony\Component\Translation\Exception\InvalidArgumentException; | ||
|  | use Symfony\Contracts\Translation\LocaleAwareInterface; | ||
|  | use Symfony\Contracts\Translation\TranslatorInterface; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com> | ||
|  |  */ | ||
|  | class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface, WarmableInterface | ||
|  | { | ||
|  |     public const MESSAGE_DEFINED = 0; | ||
|  |     public const MESSAGE_MISSING = 1; | ||
|  |     public const MESSAGE_EQUALS_FALLBACK = 2; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @var TranslatorInterface|TranslatorBagInterface | ||
|  |      */ | ||
|  |     private $translator; | ||
|  | 
 | ||
|  |     private $messages = []; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface | ||
|  |      */ | ||
|  |     public function __construct(TranslatorInterface $translator) | ||
|  |     { | ||
|  |         if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) { | ||
|  |             throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', get_debug_type($translator))); | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->translator = $translator; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function trans(?string $id, array $parameters = [], string $domain = null, string $locale = null) | ||
|  |     { | ||
|  |         $trans = $this->translator->trans($id = (string) $id, $parameters, $domain, $locale); | ||
|  |         $this->collectMessage($locale, $domain, $id, $trans, $parameters); | ||
|  | 
 | ||
|  |         return $trans; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function setLocale(string $locale) | ||
|  |     { | ||
|  |         $this->translator->setLocale($locale); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function getLocale() | ||
|  |     { | ||
|  |         return $this->translator->getLocale(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function getCatalogue(string $locale = null) | ||
|  |     { | ||
|  |         return $this->translator->getCatalogue($locale); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      */ | ||
|  |     public function getCatalogues(): array | ||
|  |     { | ||
|  |         return $this->translator->getCatalogues(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * {@inheritdoc} | ||
|  |      * | ||
|  |      * @return string[] | ||
|  |      */ | ||
|  |     public function warmUp(string $cacheDir) | ||
|  |     { | ||
|  |         if ($this->translator instanceof WarmableInterface) { | ||
|  |             return (array) $this->translator->warmUp($cacheDir); | ||
|  |         } | ||
|  | 
 | ||
|  |         return []; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Gets the fallback locales. | ||
|  |      * | ||
|  |      * @return array The fallback locales | ||
|  |      */ | ||
|  |     public function getFallbackLocales() | ||
|  |     { | ||
|  |         if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { | ||
|  |             return $this->translator->getFallbackLocales(); | ||
|  |         } | ||
|  | 
 | ||
|  |         return []; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Passes through all unknown calls onto the translator object. | ||
|  |      */ | ||
|  |     public function __call(string $method, array $args) | ||
|  |     { | ||
|  |         return $this->translator->{$method}(...$args); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public function getCollectedMessages() | ||
|  |     { | ||
|  |         return $this->messages; | ||
|  |     } | ||
|  | 
 | ||
|  |     private function collectMessage(?string $locale, ?string $domain, string $id, string $translation, ?array $parameters = []) | ||
|  |     { | ||
|  |         if (null === $domain) { | ||
|  |             $domain = 'messages'; | ||
|  |         } | ||
|  | 
 | ||
|  |         $catalogue = $this->translator->getCatalogue($locale); | ||
|  |         $locale = $catalogue->getLocale(); | ||
|  |         $fallbackLocale = null; | ||
|  |         if ($catalogue->defines($id, $domain)) { | ||
|  |             $state = self::MESSAGE_DEFINED; | ||
|  |         } elseif ($catalogue->has($id, $domain)) { | ||
|  |             $state = self::MESSAGE_EQUALS_FALLBACK; | ||
|  | 
 | ||
|  |             $fallbackCatalogue = $catalogue->getFallbackCatalogue(); | ||
|  |             while ($fallbackCatalogue) { | ||
|  |                 if ($fallbackCatalogue->defines($id, $domain)) { | ||
|  |                     $fallbackLocale = $fallbackCatalogue->getLocale(); | ||
|  |                     break; | ||
|  |                 } | ||
|  |                 $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); | ||
|  |             } | ||
|  |         } else { | ||
|  |             $state = self::MESSAGE_MISSING; | ||
|  |         } | ||
|  | 
 | ||
|  |         $this->messages[] = [ | ||
|  |             'locale' => $locale, | ||
|  |             'fallbackLocale' => $fallbackLocale, | ||
|  |             'domain' => $domain, | ||
|  |             'id' => $id, | ||
|  |             'translation' => $translation, | ||
|  |             'parameters' => $parameters, | ||
|  |             'state' => $state, | ||
|  |             'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null, | ||
|  |         ]; | ||
|  |     } | ||
|  | } |