1212namespace Symfony \Bundle \FrameworkBundle \Tests \Translation ;
1313
1414use PHPUnit \Framework \TestCase ;
15+ use Psr \Container \ContainerInterface ;
1516use Symfony \Bundle \FrameworkBundle \Translation \Translator ;
1617use Symfony \Component \Translation \MessageCatalogue ;
1718use Symfony \Component \Filesystem \Filesystem ;
@@ -42,6 +43,157 @@ protected function deleteTmpDir()
4243$ fs ->remove ($ dir );
4344 }
4445
46+ /**
47+ * @group legacy
48+ * @expectedDeprecation Method Symfony\Bundle\FrameworkBundle\Translation\Translator::__construct() takes the default locale as 3rd argument since version 3.3. Not passing it is deprecated and will trigger an error in 4.0.
49+ */
50+ public function testTransWithoutCachingOmittingLocale ()
51+ {
52+ $ translator =$ this ->getTranslator ($ this ->getLoader (),array (),'loader ' ,'\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,null );
53+ $ translator ->setLocale ('fr ' );
54+ $ translator ->setFallbackLocales (array ('en ' ,'es ' ,'pt-PT ' ,'pt_BR ' ,'fr.UTF-8 ' ,'sr@latin ' ));
55+
56+ $ this ->assertEquals ('foo (FR) ' ,$ translator ->trans ('foo ' ));
57+ $ this ->assertEquals ('bar (EN) ' ,$ translator ->trans ('bar ' ));
58+ $ this ->assertEquals ('foobar (ES) ' ,$ translator ->trans ('foobar ' ));
59+ $ this ->assertEquals ('choice 0 (EN) ' ,$ translator ->transChoice ('choice ' ,0 ));
60+ $ this ->assertEquals ('no translation ' ,$ translator ->trans ('no translation ' ));
61+ $ this ->assertEquals ('foobarfoo (PT-PT) ' ,$ translator ->trans ('foobarfoo ' ));
62+ $ this ->assertEquals ('other choice 1 (PT-BR) ' ,$ translator ->transChoice ('other choice ' ,1 ));
63+ $ this ->assertEquals ('foobarbaz (fr.UTF-8) ' ,$ translator ->trans ('foobarbaz ' ));
64+ $ this ->assertEquals ('foobarbax (sr@latin) ' ,$ translator ->trans ('foobarbax ' ));
65+ }
66+
67+ /**
68+ * @group legacy
69+ * @expectedDeprecation Method Symfony\Bundle\FrameworkBundle\Translation\Translator::__construct() takes the default locale as 3rd argument since version 3.3. Not passing it is deprecated and will trigger an error in 4.0.
70+ */
71+ public function testTransWithCachingOmittingLocale ()
72+ {
73+ // prime the cache
74+ $ translator =$ this ->getTranslator ($ this ->getLoader (),array ('cache_dir ' =>$ this ->tmpDir ),'loader ' ,'\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,null );
75+ $ translator ->setLocale ('fr ' );
76+ $ translator ->setFallbackLocales (array ('en ' ,'es ' ,'pt-PT ' ,'pt_BR ' ,'fr.UTF-8 ' ,'sr@latin ' ));
77+
78+ $ this ->assertEquals ('foo (FR) ' ,$ translator ->trans ('foo ' ));
79+ $ this ->assertEquals ('bar (EN) ' ,$ translator ->trans ('bar ' ));
80+ $ this ->assertEquals ('foobar (ES) ' ,$ translator ->trans ('foobar ' ));
81+ $ this ->assertEquals ('choice 0 (EN) ' ,$ translator ->transChoice ('choice ' ,0 ));
82+ $ this ->assertEquals ('no translation ' ,$ translator ->trans ('no translation ' ));
83+ $ this ->assertEquals ('foobarfoo (PT-PT) ' ,$ translator ->trans ('foobarfoo ' ));
84+ $ this ->assertEquals ('other choice 1 (PT-BR) ' ,$ translator ->transChoice ('other choice ' ,1 ));
85+ $ this ->assertEquals ('foobarbaz (fr.UTF-8) ' ,$ translator ->trans ('foobarbaz ' ));
86+ $ this ->assertEquals ('foobarbax (sr@latin) ' ,$ translator ->trans ('foobarbax ' ));
87+
88+ // do it another time as the cache is primed now
89+ $ loader =$ this ->getMockBuilder ('Symfony\Component\Translation\Loader\LoaderInterface ' )->getMock ();
90+ $ loader ->expects ($ this ->never ())->method ('load ' );
91+
92+ $ translator =$ this ->getTranslator ($ loader ,array ('cache_dir ' =>$ this ->tmpDir ),'loader ' ,'\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,null );
93+ $ translator ->setLocale ('fr ' );
94+ $ translator ->setFallbackLocales (array ('en ' ,'es ' ,'pt-PT ' ,'pt_BR ' ,'fr.UTF-8 ' ,'sr@latin ' ));
95+
96+ $ this ->assertEquals ('foo (FR) ' ,$ translator ->trans ('foo ' ));
97+ $ this ->assertEquals ('bar (EN) ' ,$ translator ->trans ('bar ' ));
98+ $ this ->assertEquals ('foobar (ES) ' ,$ translator ->trans ('foobar ' ));
99+ $ this ->assertEquals ('choice 0 (EN) ' ,$ translator ->transChoice ('choice ' ,0 ));
100+ $ this ->assertEquals ('no translation ' ,$ translator ->trans ('no translation ' ));
101+ $ this ->assertEquals ('foobarfoo (PT-PT) ' ,$ translator ->trans ('foobarfoo ' ));
102+ $ this ->assertEquals ('other choice 1 (PT-BR) ' ,$ translator ->transChoice ('other choice ' ,1 ));
103+ $ this ->assertEquals ('foobarbaz (fr.UTF-8) ' ,$ translator ->trans ('foobarbaz ' ));
104+ $ this ->assertEquals ('foobarbax (sr@latin) ' ,$ translator ->trans ('foobarbax ' ));
105+ }
106+
107+ /**
108+ * @group legacy
109+ * @expectedDeprecation Method Symfony\Bundle\FrameworkBundle\Translation\Translator::__construct() takes the default locale as 3rd argument since version 3.3. Not passing it is deprecated and will trigger an error in 4.0.
110+ * @expectedException \InvalidArgumentException
111+ */
112+ public function testTransWithCachingWithInvalidLocaleOmittingLocale ()
113+ {
114+ $ loader =$ this ->getMockBuilder ('Symfony\Component\Translation\Loader\LoaderInterface ' )->getMock ();
115+ $ translator =$ this ->getTranslator ($ loader ,array ('cache_dir ' =>$ this ->tmpDir ),'loader ' ,'\Symfony\Bundle\FrameworkBundle\Tests\Translation\TranslatorWithInvalidLocale ' ,null );
116+
117+ $ translator ->trans ('foo ' );
118+ }
119+
120+ /**
121+ * @group legacy
122+ * @expectedDeprecation Method Symfony\Bundle\FrameworkBundle\Translation\Translator::__construct() takes the default locale as 3rd argument since version 3.3. Not passing it is deprecated and will trigger an error in 4.0.
123+ */
124+ public function testLoadResourcesWithoutCachingOmittingLocale ()
125+ {
126+ $ loader =new \Symfony \Component \Translation \Loader \YamlFileLoader ();
127+ $ resourceFiles =array (
128+ 'fr ' =>array (
129+ __DIR__ .'/../Fixtures/Resources/translations/messages.fr.yml ' ,
130+ ),
131+ );
132+
133+ $ translator =$ this ->getTranslator ($ loader ,array ('resource_files ' =>$ resourceFiles ),'yml ' ,'\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,null );
134+ $ translator ->setLocale ('fr ' );
135+
136+ $ this ->assertEquals ('répertoire ' ,$ translator ->trans ('folder ' ));
137+ }
138+
139+ /**
140+ * @group legacy
141+ * @expectedDeprecation Method Symfony\Bundle\FrameworkBundle\Translation\Translator::__construct() takes the default locale as 3rd argument since version 3.3. Not passing it is deprecated and will trigger an error in 4.0.
142+ */
143+ public function testGetDefaultLocaleOmittingLocale ()
144+ {
145+ $ container =$ this ->getMockBuilder ('Symfony\Component\DependencyInjection\ContainerInterface ' )->getMock ();
146+ $ container
147+ ->expects ($ this ->once ())
148+ ->method ('getParameter ' )
149+ ->with ('kernel.default_locale ' )
150+ ->will ($ this ->returnValue ('en ' ))
151+ ;
152+ $ translator =new Translator ($ container ,new MessageSelector ());
153+
154+ $ this ->assertSame ('en ' ,$ translator ->getLocale ());
155+ }
156+
157+ /**
158+ * @group legacy
159+ * @expectedException \InvalidArgumentException
160+ * @expectedExceptionMessage Missing third $defaultLocale argument.
161+ */
162+ public function testGetDefaultLocaleOmittingLocaleWithPsrContainer ()
163+ {
164+ $ container =$ this ->getMockBuilder (ContainerInterface::class)->getMock ();
165+ $ translator =new Translator ($ container ,new MessageSelector ());
166+ }
167+
168+ /**
169+ * @group legacy
170+ * @expectedDeprecation Method Symfony\Bundle\FrameworkBundle\Translation\Translator::__construct() takes the default locale as 3rd argument since version 3.3. Not passing it is deprecated and will trigger an error in 4.0.
171+ */
172+ public function testWarmupOmittingLocale ()
173+ {
174+ $ loader =new \Symfony \Component \Translation \Loader \YamlFileLoader ();
175+ $ resourceFiles =array (
176+ 'fr ' =>array (
177+ __DIR__ .'/../Fixtures/Resources/translations/messages.fr.yml ' ,
178+ ),
179+ );
180+
181+ // prime the cache
182+ $ translator =$ this ->getTranslator ($ loader ,array ('cache_dir ' =>$ this ->tmpDir ,'resource_files ' =>$ resourceFiles ),'yml ' ,'\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,null );
183+ $ translator ->setFallbackLocales (array ('fr ' ));
184+ $ translator ->warmup ($ this ->tmpDir );
185+
186+ $ loader =$ this ->getMockBuilder ('Symfony\Component\Translation\Loader\LoaderInterface ' )->getMock ();
187+ $ loader
188+ ->expects ($ this ->never ())
189+ ->method ('load ' );
190+
191+ $ translator =$ this ->getTranslator ($ loader ,array ('cache_dir ' =>$ this ->tmpDir ,'resource_files ' =>$ resourceFiles ),'yml ' ,'\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,null );
192+ $ translator ->setLocale ('fr ' );
193+ $ translator ->setFallbackLocales (array ('fr ' ));
194+ $ this ->assertEquals ('répertoire ' ,$ translator ->trans ('folder ' ));
195+ }
196+
45197public function testTransWithoutCaching ()
46198 {
47199$ translator =$ this ->getTranslator ($ this ->getLoader ());
@@ -97,6 +249,7 @@ public function testTransWithCaching()
97249
98250/**
99251 * @expectedException \InvalidArgumentException
252+ * @expectedExceptionMessage Invalid "invalid locale" locale.
100253 */
101254public function testTransWithCachingWithInvalidLocale ()
102255 {
@@ -123,15 +276,8 @@ public function testLoadResourcesWithoutCaching()
123276
124277public function testGetDefaultLocale ()
125278 {
126- $ container =$ this ->getMockBuilder ('Symfony\Component\DependencyInjection\ContainerInterface ' )->getMock ();
127- $ container
128- ->expects ($ this ->once ())
129- ->method ('getParameter ' )
130- ->with ('kernel.default_locale ' )
131- ->will ($ this ->returnValue ('en ' ))
132- ;
133-
134- $ translator =new Translator ($ container ,new MessageSelector ());
279+ $ container =$ this ->getMockBuilder (ContainerInterface::class)->getMock ();
280+ $ translator =new Translator ($ container ,new MessageSelector (),'en ' );
135281
136282$ this ->assertSame ('en ' ,$ translator ->getLocale ());
137283 }
@@ -144,7 +290,7 @@ public function testInvalidOptions()
144290 {
145291$ container =$ this ->getMockBuilder ('Symfony\Component\DependencyInjection\ContainerInterface ' )->getMock ();
146292
147- (new Translator ($ container ,new MessageSelector (),array (),array ('foo ' =>'bar ' )));
293+ (new Translator ($ container ,new MessageSelector (),' en ' , array (),array ('foo ' =>'bar ' )));
148294 }
149295
150296protected function getCatalogue ($ locale ,$ messages ,$ resources =array ())
@@ -230,9 +376,9 @@ protected function getContainer($loader)
230376return $ container ;
231377 }
232378
233- public function getTranslator ($ loader ,$ options =array (),$ loaderFomat ='loader ' ,$ translatorClass ='\Symfony\Bundle\FrameworkBundle\Translation\Translator ' )
379+ public function getTranslator ($ loader ,$ options =array (),$ loaderFomat ='loader ' ,$ translatorClass ='\Symfony\Bundle\FrameworkBundle\Translation\Translator ' , $ defaultLocale = ' en ' )
234380 {
235- $ translator =$ this ->createTranslator ($ loader ,$ options ,$ translatorClass ,$ loaderFomat );
381+ $ translator =$ this ->createTranslator ($ loader ,$ options ,$ translatorClass ,$ loaderFomat, $ defaultLocale );
236382
237383if ('loader ' ===$ loaderFomat ) {
238384$ translator ->addResource ('loader ' ,'foo ' ,'fr ' );
@@ -272,11 +418,21 @@ public function testWarmup()
272418$ this ->assertEquals ('répertoire ' ,$ translator ->trans ('folder ' ));
273419 }
274420
275- private function createTranslator ($ loader ,$ options ,$ translatorClass ='\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,$ loaderFomat ='loader ' )
421+ private function createTranslator ($ loader ,$ options ,$ translatorClass ='\Symfony\Bundle\FrameworkBundle\Translation\Translator ' ,$ loaderFomat ='loader ' , $ defaultLocale = ' en ' )
276422 {
423+ if (null ===$ defaultLocale ) {
424+ return new $ translatorClass (
425+ $ this ->getContainer ($ loader ),
426+ new MessageSelector (),
427+ array ($ loaderFomat =>array ($ loaderFomat )),
428+ $ options
429+ );
430+ }
431+
277432return new $ translatorClass (
278433$ this ->getContainer ($ loader ),
279434new MessageSelector (),
435+ $ defaultLocale ,
280436array ($ loaderFomat =>array ($ loaderFomat )),
281437$ options
282438 );