vendor/symfony/translation/LoggingTranslator.php line 40

  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 Psr\Log\LoggerInterface;
  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 LoggingTranslator implements TranslatorInterfaceTranslatorBagInterfaceLocaleAwareInterface
  19. {
  20.     private TranslatorInterface $translator;
  21.     private LoggerInterface $logger;
  22.     /**
  23.      * @param TranslatorInterface&TranslatorBagInterface&LocaleAwareInterface $translator The translator must implement TranslatorBagInterface
  24.      */
  25.     public function __construct(TranslatorInterface $translatorLoggerInterface $logger)
  26.     {
  27.         if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) {
  28.             throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.'get_debug_type($translator)));
  29.         }
  30.         $this->translator $translator;
  31.         $this->logger $logger;
  32.     }
  33.     public function trans(?string $id, array $parameters = [], string $domain nullstring $locale null): string
  34.     {
  35.         $trans $this->translator->trans($id = (string) $id$parameters$domain$locale);
  36.         $this->log($id$domain$locale);
  37.         return $trans;
  38.     }
  39.     public function setLocale(string $locale)
  40.     {
  41.         $prev $this->translator->getLocale();
  42.         $this->translator->setLocale($locale);
  43.         if ($prev === $locale) {
  44.             return;
  45.         }
  46.         $this->logger->debug(sprintf('The locale of the translator has changed from "%s" to "%s".'$prev$locale));
  47.     }
  48.     public function getLocale(): string
  49.     {
  50.         return $this->translator->getLocale();
  51.     }
  52.     public function getCatalogue(string $locale null): MessageCatalogueInterface
  53.     {
  54.         return $this->translator->getCatalogue($locale);
  55.     }
  56.     public function getCatalogues(): array
  57.     {
  58.         return $this->translator->getCatalogues();
  59.     }
  60.     /**
  61.      * Gets the fallback locales.
  62.      */
  63.     public function getFallbackLocales(): array
  64.     {
  65.         if ($this->translator instanceof Translator || method_exists($this->translator'getFallbackLocales')) {
  66.             return $this->translator->getFallbackLocales();
  67.         }
  68.         return [];
  69.     }
  70.     /**
  71.      * Passes through all unknown calls onto the translator object.
  72.      */
  73.     public function __call(string $method, array $args)
  74.     {
  75.         return $this->translator->{$method}(...$args);
  76.     }
  77.     /**
  78.      * Logs for missing translations.
  79.      */
  80.     private function log(string $id, ?string $domain, ?string $locale)
  81.     {
  82.         $domain ??= 'messages';
  83.         $catalogue $this->translator->getCatalogue($locale);
  84.         if ($catalogue->defines($id$domain)) {
  85.             return;
  86.         }
  87.         if ($catalogue->has($id$domain)) {
  88.             $this->logger->debug('Translation use fallback catalogue.', ['id' => $id'domain' => $domain'locale' => $catalogue->getLocale()]);
  89.         } else {
  90.             $this->logger->warning('Translation not found.', ['id' => $id'domain' => $domain'locale' => $catalogue->getLocale()]);
  91.         }
  92.     }
  93. }