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@18: use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface; Chris@0: use Symfony\Component\Translation\Exception\InvalidArgumentException; Chris@0: Chris@0: /** Chris@0: * @author Abdellatif Ait boudad Chris@0: */ Chris@18: class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface, WarmableInterface Chris@0: { Chris@0: const MESSAGE_DEFINED = 0; Chris@0: const MESSAGE_MISSING = 1; Chris@0: const MESSAGE_EQUALS_FALLBACK = 2; Chris@0: Chris@0: /** Chris@0: * @var TranslatorInterface|TranslatorBagInterface Chris@0: */ Chris@0: private $translator; Chris@0: Chris@17: private $messages = []; Chris@0: Chris@0: /** Chris@0: * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface Chris@0: */ Chris@0: public function __construct(TranslatorInterface $translator) 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: } 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->collectMessage($locale, $domain, $id, $trans, $parameters); 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->collectMessage($locale, $domain, $id, $trans, $parameters, $number); 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@18: * {@inheritdoc} Chris@18: */ Chris@18: public function warmUp($cacheDir) Chris@18: { Chris@18: if ($this->translator instanceof WarmableInterface) { Chris@18: $this->translator->warmUp($cacheDir); Chris@18: } Chris@18: } Chris@18: Chris@18: /** 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: * @return array Chris@0: */ Chris@0: public function getCollectedMessages() Chris@0: { Chris@0: return $this->messages; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string|null $locale Chris@0: * @param string|null $domain Chris@0: * @param string $id Chris@0: * @param string $translation Chris@0: * @param array|null $parameters Chris@0: * @param int|null $number Chris@0: */ Chris@17: private function collectMessage($locale, $domain, $id, $translation, $parameters = [], $number = null) 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: $locale = $catalogue->getLocale(); Chris@0: if ($catalogue->defines($id, $domain)) { Chris@0: $state = self::MESSAGE_DEFINED; Chris@0: } elseif ($catalogue->has($id, $domain)) { Chris@0: $state = self::MESSAGE_EQUALS_FALLBACK; Chris@0: Chris@0: $fallbackCatalogue = $catalogue->getFallbackCatalogue(); Chris@0: while ($fallbackCatalogue) { Chris@0: if ($fallbackCatalogue->defines($id, $domain)) { Chris@0: $locale = $fallbackCatalogue->getLocale(); Chris@0: break; Chris@0: } Chris@0: Chris@0: $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); Chris@0: } Chris@0: } else { Chris@0: $state = self::MESSAGE_MISSING; Chris@0: } Chris@0: Chris@17: $this->messages[] = [ Chris@0: 'locale' => $locale, Chris@0: 'domain' => $domain, Chris@0: 'id' => $id, Chris@0: 'translation' => $translation, Chris@0: 'parameters' => $parameters, Chris@0: 'transChoiceNumber' => $number, Chris@0: 'state' => $state, Chris@17: ]; Chris@0: } Chris@0: }