<?php 
 
/* 
 * This file is part of the Symfony package. 
 * 
 * (c) Fabien Potencier <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace Symfony\Component\Translation; 
 
use Symfony\Component\Translation\Exception\InvalidArgumentException; 
 
/** 
 * @author Abdellatif Ait boudad <[email protected]> 
 */ 
class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface 
{ 
    const MESSAGE_DEFINED = 0; 
    const MESSAGE_MISSING = 1; 
    const MESSAGE_EQUALS_FALLBACK = 2; 
 
    /** 
     * @var TranslatorInterface|TranslatorBagInterface 
     */ 
    private $translator; 
 
    /** 
     * @var array 
     */ 
    private $messages = array(); 
 
    /** 
     * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface 
     */ 
    public function __construct(TranslatorInterface $translator) 
    { 
        if (!$translator instanceof TranslatorBagInterface) { 
            throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator))); 
        } 
 
        $this->translator = $translator; 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function trans($id, array $parameters = array(), $domain = null, $locale = null) 
    { 
        $trans = $this->translator->trans($id, $parameters, $domain, $locale); 
        $this->collectMessage($locale, $domain, $id, $trans, $parameters); 
 
        return $trans; 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) 
    { 
        $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale); 
        $this->collectMessage($locale, $domain, $id, $trans, $parameters, $number); 
 
        return $trans; 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function setLocale($locale) 
    { 
        $this->translator->setLocale($locale); 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function getLocale() 
    { 
        return $this->translator->getLocale(); 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public function getCatalogue($locale = null) 
    { 
        return $this->translator->getCatalogue($locale); 
    } 
 
    /** 
     * Gets the fallback locales. 
     * 
     * @return array $locales The fallback locales 
     */ 
    public function getFallbackLocales() 
    { 
        if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { 
            return $this->translator->getFallbackLocales(); 
        } 
 
        return array(); 
    } 
 
    /** 
     * Passes through all unknown calls onto the translator object. 
     */ 
    public function __call($method, $args) 
    { 
        return call_user_func_array(array($this->translator, $method), $args); 
    } 
 
    /** 
     * @return array 
     */ 
    public function getCollectedMessages() 
    { 
        return $this->messages; 
    } 
 
    /** 
     * @param string|null $locale 
     * @param string|null $domain 
     * @param string      $id 
     * @param string      $translation 
     * @param array|null  $parameters 
     * @param int|null    $number 
     */ 
    private function collectMessage($locale, $domain, $id, $translation, $parameters = array(), $number = null) 
    { 
        if (null === $domain) { 
            $domain = 'messages'; 
        } 
 
        $id = (string) $id; 
        $catalogue = $this->translator->getCatalogue($locale); 
        $locale = $catalogue->getLocale(); 
        if ($catalogue->defines($id, $domain)) { 
            $state = self::MESSAGE_DEFINED; 
        } elseif ($catalogue->has($id, $domain)) { 
            $state = self::MESSAGE_EQUALS_FALLBACK; 
 
            $fallbackCatalogue = $catalogue->getFallbackCatalogue(); 
            while ($fallbackCatalogue) { 
                if ($fallbackCatalogue->defines($id, $domain)) { 
                    $locale = $fallbackCatalogue->getLocale(); 
                    break; 
                } 
 
                $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue(); 
            } 
        } else { 
            $state = self::MESSAGE_MISSING; 
        } 
 
        $this->messages[] = array( 
            'locale' => $locale, 
            'domain' => $domain, 
            'id' => $id, 
            'translation' => $translation, 
            'parameters' => $parameters, 
            'transChoiceNumber' => $number, 
            'state' => $state, 
        ); 
    } 
} 
 
 |