Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Translation; Chris@0: Chris@0: use Psr\Log\LoggerInterface; Chris@0: use Symfony\Component\Translation\Exception\InvalidArgumentException; Chris@0: Chris@0: /** Chris@0: * @author Abdellatif Ait boudad Chris@0: */ Chris@0: class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface Chris@0: { Chris@0: /** Chris@0: * @var TranslatorInterface|TranslatorBagInterface Chris@0: */ Chris@0: private $translator; Chris@0: Chris@0: private $logger; Chris@0: Chris@0: /** Chris@0: * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface Chris@0: * @param LoggerInterface $logger Chris@0: */ Chris@0: public function __construct(TranslatorInterface $translator, LoggerInterface $logger) Chris@0: { Chris@0: if (!$translator instanceof TranslatorBagInterface) { Chris@17: throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator))); Chris@0: } Chris@0: Chris@0: $this->translator = $translator; Chris@0: $this->logger = $logger; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function trans($id, array $parameters = [], $domain = null, $locale = null) Chris@0: { Chris@0: $trans = $this->translator->trans($id, $parameters, $domain, $locale); Chris@0: $this->log($id, $domain, $locale); Chris@0: Chris@0: return $trans; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null) Chris@0: { Chris@0: $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale); Chris@0: $this->log($id, $domain, $locale); Chris@0: Chris@0: return $trans; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setLocale($locale) Chris@0: { Chris@0: $this->translator->setLocale($locale); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getLocale() Chris@0: { Chris@0: return $this->translator->getLocale(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getCatalogue($locale = null) Chris@0: { Chris@0: return $this->translator->getCatalogue($locale); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the fallback locales. Chris@0: * Chris@17: * @return array The fallback locales Chris@0: */ Chris@0: public function getFallbackLocales() Chris@0: { Chris@12: if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { Chris@0: return $this->translator->getFallbackLocales(); Chris@0: } Chris@0: Chris@17: return []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Passes through all unknown calls onto the translator object. Chris@0: */ Chris@0: public function __call($method, $args) Chris@0: { Chris@17: return \call_user_func_array([$this->translator, $method], $args); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Logs for missing translations. Chris@0: * Chris@0: * @param string $id Chris@0: * @param string|null $domain Chris@0: * @param string|null $locale Chris@0: */ Chris@0: private function log($id, $domain, $locale) Chris@0: { Chris@0: if (null === $domain) { Chris@0: $domain = 'messages'; Chris@0: } Chris@0: Chris@0: $id = (string) $id; Chris@0: $catalogue = $this->translator->getCatalogue($locale); Chris@0: if ($catalogue->defines($id, $domain)) { Chris@0: return; Chris@0: } Chris@0: Chris@0: if ($catalogue->has($id, $domain)) { Chris@17: $this->logger->debug('Translation use fallback catalogue.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); Chris@0: } else { Chris@17: $this->logger->warning('Translation not found.', ['id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale()]); Chris@0: } Chris@0: } Chris@0: }