8000 [Translator] fixed merge with 2.0 · symfony/symfony@fa57912 · GitHub
[go: up one dir, main page]

Skip to content

Commit fa57912

Browse files
committed
[Translator] fixed merge with 2.0
1 parent 885bb33 commit fa57912

File tree

5 files changed

+73
-25
lines changed

5 files changed

+73
-25
lines changed

src/Symfony/Bundle/FrameworkBundle/Tests/Translation/TranslatorTest.php

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symfony\Bundle\FrameworkBundle\Translation\Translator;
1515
use Symfony\Component\Translation\MessageCatalogue;
1616
use Symfony\Component\HttpKernel\Util\Filesystem;
17+
use Symfony\Component\Translation\MessageSelector;
1718

1819
class TranslatorTest extends \PHPUnit_Framework_TestCase
1920
{
@@ -44,30 +45,36 @@ public function testTransWithoutCaching()
4445
{
4546
$translator = $this->getTranslator($this->getLoader());
4647
$translator->setLocale('fr');
47-
$translator->setFallbackLocale('en');
48+
$translator->setFallbackLocale(array('en', 'es'));
4849

4950
$this->assertEquals('foo (FR)', $translator->trans('foo'));
5051
$this->assertEquals('bar (EN)', $translator->trans('bar'));
52+
$this->assertEquals('foobar (ES)', $translator->trans('foobar'));
53+
$this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
5154
}
5255

5356
public function testTransWithCaching()
5457
{
5558
// prime the cache
5659
$translator = $this->getTranslator($this->getLoader(), array('cache_dir' => $this->tmpDir));
5760
$translator->setLocale('fr');
58-
$translator->setFallbackLocale('en');
61+
$translator->setFallbackLocale(array('en', 'es'));
5962

6063
$this->assertEquals('foo (FR)', $translator->trans('foo'));
6164
$this->assertEquals('bar (EN)', $translator->trans('bar'));
65+
$this->assertEquals('foobar (ES)', $translator->trans('foobar'));
66+
$this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
6267

6368
// do it another time as the cache is primed now
6469
$loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
6570
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir));
6671
$translator->setLocale('fr');
67-
$translator->setFallbackLocale('en');
72+
$translator->setFallbackLocale(array('en', 'es'));
6873

6974
$this->assertEquals('foo (FR)', $translator->trans('foo'));
7075
$this->assertEquals('bar (EN)', $translator->trans('bar'));
76+
$this->assertEquals('foobar (ES)', $translator->trans('foobar'));
77+
$this->assertEquals('choice 0 (EN)', $translator->transChoice('choice', 0));
7178
}
7279

7380
protected function getCatalogue($locale, $messages)
@@ -86,12 +93,25 @@ protected function getLoader()
8693
$loader
8794
->expects($this->at(0))
8895
->method('load')
89-
->will($this->returnValue($this->getCatalogue('fr', array('foo' => 'foo (FR)'))))
96+
->will($this->returnValue($this->getCatalogue('fr', array(
97+
'foo' => 'foo (FR)',
98+
))))
9099
;
91100
$loader
92101
->expects($this->at(1))
93102
->method('load')
94-
->will($this->returnValue($this->getCatalogue('en', array('foo' => 'foo (EN)', 'bar' => 'bar (EN)'))))
103+
->will($this->returnValue($this->getCatalogue('en', array(
104+
'foo' => 'foo (EN)',
105+
'bar' => 'bar (EN)',
106+
'choice' => '{0} choice 0 (EN)|{1} choice 1 (EN)|]1,Inf] choice inf (EN)',
107+
))))
108+
;
109+
$loader
110+
->expects($this->at(2))
111+
->method('load')
112+
->will($this->returnValue($this->getCatalogue('es', array(
113+
'foobar' => 'foobar (ES)',
114+
))))
95115
;
96116

97117
return $loader;
@@ -113,13 +133,14 @@ public function getTranslator($loader, $options = array())
113133
{
114134
$translator = new Translator(
115135
$this->getContainer($loader),
116-
$this->getMock('Symfony\Component\Translation\MessageSelector'),
136+
new MessageSelector(),
117137
array('loader' => 'loader'),
118138
$options
119139
);
120140

121141
$translator->addResource('loader', 'foo', 'fr');
122142
$translator->addResource('loader', 'foo', 'en');
143+
$translator->addResource('loader', 'foo', 'es');
123144

124145
return $translator;
125146
}

src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public function getLocale()
8080
/**
8181
* {@inheritdoc}
8282
*/
83-
protected function doLoadCatalogue($locale)
83+
protected function loadCatalogue($locale)
8484
{
8585
if (isset($this->catalogues[$locale])) {
8686
return;
@@ -96,18 +96,25 @@ protected function doLoadCatalogue($locale)
9696
if (!$cache->isFresh()) {
9797
$this->initialize();
9898

99-
parent::doLoadCatalogue($locale);
99+
parent::loadCatalogue($locale);
100100

101101
$fallbackContent = '';
102-
$fallback = $this->computeFallbackLocale($locale);
103-
if ($fallback && $fallback != $locale) {
104-
$fallbackContent = sprintf(<<<EOF
105-
\$catalogue->addFallbackCatalogue(new MessageCatalogue('%s', %s));
102+
$current = '';
103+
foreach ($this->computeFallbackLocales($locale) as $fallback) {
104+
$fallbackContent .= sprintf(<<<EOF
105+
\$catalogue%s = new MessageCatalogue('%s', %s);
106+
\$catalogue%s->addFallbackCatalogue(\$catalogue%s);
107+
108+
106109
EOF
107110
,
111+
ucfirst($fallback),
108112
$fallback,
109-
var_export($this->catalogues[$fallback]->all(), true)
113+
var_export($this->catalogues[$fallback]->all(), true),
114+
ucfirst($current),
115+
ucfirst($fallback)
110116
);
117+
$current = $fallback;
111118
}
112119

113120
$content = sprintf(<<<EOF
@@ -118,7 +125,6 @@ protected function doLoadCatalogue($locale)
118125
\$catalogue = new MessageCatalogue('%s', %s);
119126
120127
%s
121-
122128
return \$catalogue;
123129
124130
EOF

src/Symfony/Component/Translation/MessageCatalogue.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,18 @@ public function addFallbackCatalogue(MessageCatalogueInterface $catalogue)
190190
}
191191
}
192192

193+
/**
194+
* Gets the fallback catalogue.
195+
*
196+
* @return MessageCatalogueInterface A MessageCatalogueInterface instance
197+
*
198+
* @api
199+
*/
200+
public function getFallbackCatalogue()
201+
{
202+
return $this->fallbackCatalogue;
203+
}
204+
193205
/**
194206
* {@inheritdoc}
195207
*

src/Symfony/Component/Translation/MessageCatalogueInterface.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,15 @@ function addCatalogue(MessageCatalogueInterface $catalogue);
143143
*/
144144
function addFallbackCatalogue(MessageCatalogueInterface $catalogue);
145145

146+
/**
147+
* Gets the fallback catalogue.
148+
*
149+
* @return MessageCatalogueInterface A MessageCatalogueInterface instance
150+
*
151+
* @api
152+
*/
153+
function getFallbackCatalogue();
154+
146155
/**
147156
* Returns an array of resources loaded to build this collection.
148157
*

src/Symfony/Component/Translation/Translator.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -145,17 +145,17 @@ public function transChoice($id, $number, array $parameters = array(), $domain =
145145

146146
$id = (string) $id;
147147

148-
if (!$this->catalogues[$locale]->defines($id, $domain)) {
149-
// we will use the locale fallback
150-
foreach ($this->computeFallbackLocales($locale) as $fallback) {
151-
if ($this->catalogues[$fallback]->defines($id, $domain)) {
152-
$locale = $fallback;
153-
break;
154-
}
148+
$catalogue = $this->catalogues[$locale];
149+
while (!$catalogue->defines($id, $domain)) {
150+
if ($cat = $catalogue->getFallbackCatalogue()) {
151+
$catalogue = $cat;
152+
$locale = $catalogue->getLocale();
153+
} else {
154+
break;
155155
}
156156
}
157157

158-
return strtr($this->selector->choose($this->catalogues[$locale]->get($id, $domain), (int) $number, $locale), $parameters);
158+
return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters);
159159
}
160160

161161
protected function loadCatalogue($locale)
@@ -164,7 +164,7 @@ protected function loadCatalogue($locale)
164164
$this->loadFallbackCatalogues($locale);
165165
}
166166

167-
protected function doLoadCatalogue($locale)
167+
private function doLoadCatalogue($locale)
168168
{
169169
$this->catalogues[$locale] = new MessageCatalogue($locale);
170170

@@ -192,7 +192,7 @@ private function loadFallbackCatalogues($locale)
192192
}
193193
}
194194

195-
private function computeFallbackLocales($locale)
195+
protected function computeFallbackLocales($locale)
196196
{
197197
$locales = array();
198198
foreach ($this->fallbackLocales as $fallback) {
@@ -207,6 +207,6 @@ private function computeFallbackLocales($locale)
207207
array_unshift($locales, substr($locale, 0, -strlen(strrchr($locale, '_'))));
208208
}
209209

210-
return $locales;
210+
return array_unique($locales);
211211
}
212212
}

0 commit comments

Comments
 (0)
0