4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\Translation;
14 use Psr\Log\LoggerInterface;
17 * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
19 class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface
22 * @var TranslatorInterface|TranslatorBagInterface
27 * @var LoggerInterface
32 * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
33 * @param LoggerInterface $logger
35 public function __construct(TranslatorInterface $translator, LoggerInterface $logger)
37 if (!$translator instanceof TranslatorBagInterface) {
38 throw new \InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator)));
41 $this->translator = $translator;
42 $this->logger = $logger;
48 public function trans($id, array $parameters = array(), $domain = null, $locale = null)
50 $trans = $this->translator->trans($id, $parameters, $domain, $locale);
51 $this->log($id, $domain, $locale);
59 public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
61 $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
62 $this->log($id, $domain, $locale);
70 public function setLocale($locale)
72 $this->translator->setLocale($locale);
78 public function getLocale()
80 return $this->translator->getLocale();
86 public function getCatalogue($locale = null)
88 return $this->translator->getCatalogue($locale);
92 * Gets the fallback locales.
94 * @return array $locales The fallback locales
96 public function getFallbackLocales()
98 if ($this->translator instanceof Translator) {
99 return $this->translator->getFallbackLocales();
106 * Passes through all unknown calls onto the translator object.
108 public function __call($method, $args)
110 return call_user_func_array(array($this->translator, $method), $args);
114 * Logs for missing translations.
117 * @param string|null $domain
118 * @param string|null $locale
120 private function log($id, $domain, $locale)
122 if (null === $domain) {
123 $domain = 'messages';
127 $catalogue = $this->translator->getCatalogue($locale);
128 if ($catalogue->defines($id, $domain)) {
132 if ($catalogue->has($id, $domain)) {
133 $this->logger->debug('Translation use fallback catalogue.', array('id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()));
135 $this->logger->warning('Translation not found.', array('id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()));