Fix bug in style changes for the Use cases on the live site.
[yaffs-website] / vendor / symfony / translation / DataCollectorTranslator.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\Translation;
13
14 /**
15  * @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
16  */
17 class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface
18 {
19     const MESSAGE_DEFINED = 0;
20     const MESSAGE_MISSING = 1;
21     const MESSAGE_EQUALS_FALLBACK = 2;
22
23     /**
24      * @var TranslatorInterface|TranslatorBagInterface
25      */
26     private $translator;
27
28     /**
29      * @var array
30      */
31     private $messages = array();
32
33     /**
34      * @param TranslatorInterface $translator The translator must implement TranslatorBagInterface
35      */
36     public function __construct(TranslatorInterface $translator)
37     {
38         if (!$translator instanceof TranslatorBagInterface) {
39             throw new \InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', get_class($translator)));
40         }
41
42         $this->translator = $translator;
43     }
44
45     /**
46      * {@inheritdoc}
47      */
48     public function trans($id, array $parameters = array(), $domain = null, $locale = null)
49     {
50         $trans = $this->translator->trans($id, $parameters, $domain, $locale);
51         $this->collectMessage($locale, $domain, $id, $trans, $parameters);
52
53         return $trans;
54     }
55
56     /**
57      * {@inheritdoc}
58      */
59     public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
60     {
61         $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
62         $this->collectMessage($locale, $domain, $id, $trans, $parameters, $number);
63
64         return $trans;
65     }
66
67     /**
68      * {@inheritdoc}
69      */
70     public function setLocale($locale)
71     {
72         $this->translator->setLocale($locale);
73     }
74
75     /**
76      * {@inheritdoc}
77      */
78     public function getLocale()
79     {
80         return $this->translator->getLocale();
81     }
82
83     /**
84      * {@inheritdoc}
85      */
86     public function getCatalogue($locale = null)
87     {
88         return $this->translator->getCatalogue($locale);
89     }
90
91     /**
92      * Gets the fallback locales.
93      *
94      * @return array $locales The fallback locales
95      */
96     public function getFallbackLocales()
97     {
98         if ($this->translator instanceof Translator) {
99             return $this->translator->getFallbackLocales();
100         }
101
102         return array();
103     }
104
105     /**
106      * Passes through all unknown calls onto the translator object.
107      */
108     public function __call($method, $args)
109     {
110         return call_user_func_array(array($this->translator, $method), $args);
111     }
112
113     /**
114      * @return array
115      */
116     public function getCollectedMessages()
117     {
118         return $this->messages;
119     }
120
121     /**
122      * @param string|null $locale
123      * @param string|null $domain
124      * @param string      $id
125      * @param string      $translation
126      * @param array|null  $parameters
127      * @param int|null    $number
128      */
129     private function collectMessage($locale, $domain, $id, $translation, $parameters = array(), $number = null)
130     {
131         if (null === $domain) {
132             $domain = 'messages';
133         }
134
135         $id = (string) $id;
136         $catalogue = $this->translator->getCatalogue($locale);
137         $locale = $catalogue->getLocale();
138         if ($catalogue->defines($id, $domain)) {
139             $state = self::MESSAGE_DEFINED;
140         } elseif ($catalogue->has($id, $domain)) {
141             $state = self::MESSAGE_EQUALS_FALLBACK;
142
143             $fallbackCatalogue = $catalogue->getFallbackCatalogue();
144             while ($fallbackCatalogue) {
145                 if ($fallbackCatalogue->defines($id, $domain)) {
146                     $locale = $fallbackCatalogue->getLocale();
147                     break;
148                 }
149
150                 $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
151             }
152         } else {
153             $state = self::MESSAGE_MISSING;
154         }
155
156         $this->messages[] = array(
157             'locale' => $locale,
158             'domain' => $domain,
159             'id' => $id,
160             'translation' => $translation,
161             'parameters' => $parameters,
162             'transChoiceNumber' => $number,
163             'state' => $state,
164         );
165     }
166 }