vendor/symfony/translation/DataCollectorTranslator.php line 48

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Translation;
  11. use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
  12. use Symfony\Component\Translation\Exception\InvalidArgumentException;
  13. use Symfony\Contracts\Translation\LocaleAwareInterface;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. /**
  16.  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
  17.  */
  18. class DataCollectorTranslator implements TranslatorInterfaceTranslatorBagInterfaceLocaleAwareInterfaceWarmableInterface
  19. {
  20.     public const MESSAGE_DEFINED 0;
  21.     public const MESSAGE_MISSING 1;
  22.     public const MESSAGE_EQUALS_FALLBACK 2;
  23.     private $translator;
  24.     private array $messages = [];
  25.     /**
  26.      * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator
  27.      */
  28.     public function __construct(TranslatorInterface $translator)
  29.     {
  30.         if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) {
  31.             throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.'get_debug_type($translator)));
  32.         }
  33.         $this->translator $translator;
  34.     }
  35.     /**
  36.      * {@inheritdoc}
  37.      */
  38.     public function trans(?string $id, array $parameters = [], string $domain nullstring $locale null): string
  39.     {
  40.         $trans $this->translator->trans($id = (string) $id$parameters$domain$locale);
  41.         $this->collectMessage($locale$domain$id$trans$parameters);
  42.         return $trans;
  43.     }
  44.     /**
  45.      * {@inheritdoc}
  46.      */
  47.     public function setLocale(string $locale)
  48.     {
  49.         $this->translator->setLocale($locale);
  50.     }
  51.     /**
  52.      * {@inheritdoc}
  53.      */
  54.     public function getLocale(): string
  55.     {
  56.         return $this->translator->getLocale();
  57.     }
  58.     /**
  59.      * {@inheritdoc}
  60.      */
  61.     public function getCatalogue(string $locale null): MessageCatalogueInterface
  62.     {
  63.         return $this->translator->getCatalogue($locale);
  64.     }
  65.     /**
  66.      * {@inheritdoc}
  67.      */
  68.     public function getCatalogues(): array
  69.     {
  70.         return $this->translator->getCatalogues();
  71.     }
  72.     /**
  73.      * {@inheritdoc}
  74.      *
  75.      * @return string[]
  76.      */
  77.     public function warmUp(string $cacheDir): array
  78.     {
  79.         if ($this->translator instanceof WarmableInterface) {
  80.             return (array) $this->translator->warmUp($cacheDir);
  81.         }
  82.         return [];
  83.     }
  84.     /**
  85.      * Gets the fallback locales.
  86.      */
  87.     public function getFallbackLocales(): array
  88.     {
  89.         if ($this->translator instanceof Translator || method_exists($this->translator'getFallbackLocales')) {
  90.             return $this->translator->getFallbackLocales();
  91.         }
  92.         return [];
  93.     }
  94.     /**
  95.      * Passes through all unknown calls onto the translator object.
  96.      */
  97.     public function __call(string $method, array $args)
  98.     {
  99.         return $this->translator->{$method}(...$args);
  100.     }
  101.     public function getCollectedMessages(): array
  102.     {
  103.         return $this->messages;
  104.     }
  105.     private function collectMessage(?string $locale, ?string $domainstring $idstring $translation, ?array $parameters = [])
  106.     {
  107.         if (null === $domain) {
  108.             $domain 'messages';
  109.         }
  110.         $catalogue $this->translator->getCatalogue($locale);
  111.         $locale $catalogue->getLocale();
  112.         $fallbackLocale null;
  113.         if ($catalogue->defines($id$domain)) {
  114.             $state self::MESSAGE_DEFINED;
  115.         } elseif ($catalogue->has($id$domain)) {
  116.             $state self::MESSAGE_EQUALS_FALLBACK;
  117.             $fallbackCatalogue $catalogue->getFallbackCatalogue();
  118.             while ($fallbackCatalogue) {
  119.                 if ($fallbackCatalogue->defines($id$domain)) {
  120.                     $fallbackLocale $fallbackCatalogue->getLocale();
  121.                     break;
  122.                 }
  123.                 $fallbackCatalogue $fallbackCatalogue->getFallbackCatalogue();
  124.             }
  125.         } else {
  126.             $state self::MESSAGE_MISSING;
  127.         }
  128.         $this->messages[] = [
  129.             'locale' => $locale,
  130.             'fallbackLocale' => $fallbackLocale,
  131.             'domain' => $domain,
  132.             'id' => $id,
  133.             'translation' => $translation,
  134.             'parameters' => $parameters,
  135.             'state' => $state,
  136.             'transChoiceNumber' => isset($parameters['%count%']) && is_numeric($parameters['%count%']) ? $parameters['%count%'] : null,
  137.         ];
  138.     }
  139. }