8000 [translation][performances] move loading resources into Translator in… · symfony/symfony@bf5c583 · GitHub
[go: up one dir, main page]

Skip to content

Commit bf5c583

Browse files
aitboudadfabpot
authored andcommitted
[translation][performances] move loading resources into Translator initialize.
1 parent 6963887 commit bf5c583

File tree

6 files changed

+89
-27
lines changed

6 files changed

+89
-27
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class FrameworkExtension extends Extension
4040
*
4141
* @param array $configs
4242
* @param ContainerBuilder $container
43+
*
4344
* @throws LogicException
4445
*/
4546
public function load(array $configs, ContainerBuilder $container)
@@ -686,6 +687,8 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
686687
foreach ($dirs as $dir) {
687688
$container->addResource(new DirectoryResource($dir));
688689
}
690+
691+
$files = array();
689692
$finder = Finder::create()
690693
->files()
691694
->filter(function (\SplFileInfo $file) {
@@ -695,10 +698,15 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
695698
;
696699

697700
foreach ($finder as $file) {
698-
// filename is domain.locale.format
699701
list($domain, $locale, $format) = explode('.', $file->getBasename(), 3);
700-
$translator->addMethodCall('addResource', array($format, (string) $file, $locale, $domain));
702+
if (!isset($files[$locale])) {
703+
$files[$locale] = array();
704+
}
705+
706+
$files[$locale][] = (string) $file;
701707
}
708+
709+
$translator->replaceArgument(4, $files);
702710
}
703711
}
704712

src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
<argument key="cache_dir">%kernel.cache_dir%/translations</argument>
4545
<argument key="debug">%kernel.debug%</argument>
4646
</argument>
47+
<argument type="collection" /> <!-- translation resources -->
4748
</service>
4849

4950
<service id="translator.logging" class="Symfony\Component\Translation\LoggingTranslator" public="false">

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -218,18 +218,11 @@ public function testAssets()
218218
public function testTranslator()
219219
{
220220
$container = $this->createContainerFromFile('full');
221-
222221
$this->assertTrue($container->hasDefinition('translator.default'), '->registerTranslatorConfiguration() loads translation.xml');
223222
$this->assertEquals('translator.default', (string) $container->getAlias('translator'), '->registerTranslatorConfiguration() redefines translator service from identity to real translator');
223+
$resources = $container->getDefinition('translator.default')->getArgument(4);
224224

225-
$resources = array();
226-
foreach ($container->getDefinition('translator.default')->getMethodCalls() as $call) {
227-
if ('addResource' == $call[0]) {
228-
$resources[] = $call[1];
229-
}
230-
}
231-
232-
$files = array_map(function ($resource) { return realpath($resource[1]); }, $resources);
225+
$files = array_map(function ($resource) { return realpath($resource); }, $resources['en']);
233226
$ref = new \ReflectionClass('Symfony\Component\Validator\Validation');
234227
$this->assertContains(
235228
strtr(dirname($ref->getFileName()).'/Resources/translations/validators.en.xlf', '/', DIRECTORY_SEPARATOR),
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
folder: répertoire

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

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,50 @@ public function testTransWithCaching()
9595
public function testTransWithCachingWithInvalidLocale()
9696
{
9797
$loader = $this->getMock('Symfony\Component\Translation\Loader\LoaderInterface');
98-
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), '\Symfony\Bundle\FrameworkBundle\Tests\Translation\TranslatorWithInvalidLocale');
98+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), array(), 'loader', '\Symfony\Bundle\FrameworkBundle\Tests\Translation\TranslatorWithInvalidLocale');
9999
$translator->setLocale('invalid locale');
100100

101101
$this->setExpectedException('\InvalidArgumentException');
102102
$translator->trans('foo');
103103
}
104104

105+
public function testLoadRessourcesWithCaching()
106+
{
107+
$loader = new \Symfony\Component\Translation\Loader\YamlFileLoader();
108+
$resourceFiles = array(
109+
'fr' => array(
110+
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
111+
),
112+
);
113+
114+
// prime the cache
115+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), $resourceFiles, 'yml');
116+
$translator->setLocale('fr');
117+
118+
$this->assertEquals('répertoire', $translator->trans('folder'));
119+
120+
// do it another time as the cache is primed now
121+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), array(), 'yml');
122+
$translator->setLocale('fr');
123+
124+
$this->assertEquals('répertoire', $translator->trans('folder'));
125+
}
126+
127+
public function testLoadRessourcesWithoutCaching()
128+
{
129+
$loader = new \Symfony\Component\Translation\Loader\YamlFileLoader();
130+
$resourceFiles = array(
131+
'fr' => array(
132+
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
133+
),
134+
);
135+
136+
$translator = $this->getTranslator($loader, array(), $resourceFiles, 'yml');
137+
$translator->setLocale('fr');
138+
139+
$this->assertEquals('répertoire', $translator->trans('folder'));
140+
}
141+
105142
protected function getCatalogue($locale, $messages)
106143
{
107144
$catalogue = new MessageCatalogue($locale);
@@ -182,22 +219,25 @@ protected function getContainer($loader)
182219
return $container;
183220
}
184221

185-
public function getTranslator($loader, $options = array(), $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator')
222+
public function getTranslator($loader, $options = array(), $resources = array(), $loaderFomat = 'loader', $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator')
186223
{
187224
$translator = new $translatorClass(
188225
$this->getContainer($loader),
189226
new MessageSelector(),
190-
array('loader' => array('loader')),
191-
$options
227+
array($loaderFomat => array($loaderFomat)),
228+
$options,
229+
$resources
192230
);
193231

194-
$translator->addResource('loader', 'foo', 'fr');
195-
$translator->addResource('loader', 'foo', 'en');
196-
$translator->addResource('loader', 'foo', 'es');
197-
$translator->addResource('loader', 'foo', 'pt-PT'); // European Portuguese
198-
$translator->addResource('loader', 'foo', 'pt_BR'); // Brazilian Portuguese
199-
$translator->addResource('loader', 'foo', 'fr.UTF-8');
200-
$translator->addResource('loader', 'foo', 'sr@latin'); // Latin Serbian
232+
if ('loader' === $loaderFomat) {
233+
$translator->addResource('loader', 'foo', 'fr');
234+
$translator->addResource('loader', 'foo', 'en');
235+
$translator->addResource('loader', 'foo', 'es');
236+
$translator->addResource('loader', 'foo', 'pt-PT'); // European Portuguese
237+
$translator->addResource('loader', 'foo', 'pt_BR'); // Brazilian Portuguese
238+
$translator->addResource('loader', 'foo', 'fr.UTF-8');
239+
$translator->addResource('loader', 'foo', 'sr@latin'); // Latin Serbian
240+
}
201241

202242
return $translator;
203243
}

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class Translator extends BaseTranslator
2424
{
2525
protected $container;
2626
protected $loaderIds;
27+
protected $resourceFiles;
2728

2829
protected $options = array(
2930
'cache_dir' => null,
@@ -38,17 +39,19 @@ class Translator extends BaseTranslator
3839
* * cache_dir: The cache directory (or null to disable caching)
3940
* * debug: Whether to enable debugging or not (false by default)
4041
*
41-
* @param ContainerInterface $container A ContainerInterface instance
42-
* @param MessageSelector $selector The message selector for pluralization
43-
* @param array $loaderIds An array of loader Ids
44-
* @param array $options An array of options
42+
* @param ContainerInterface $container A ContainerInterface instance
43+
* @param MessageSelector $selector The message selector for pluralization
44+
* @param array $loaderIds An array of loader Ids
45+
* @param array $options An array of options
46+
* @param array $resourceFiles An array of resource directories
4547
*
4648
* @throws \InvalidArgumentException
4749
*/
48-
public function __construct(ContainerInterface $container, MessageSelector $selector, $loaderIds = array(), array $options = array())
50+
public function __construct(ContainerInterface $container, MessageSelector $selector, $loaderIds = array(), array $options = array(), $resourceFiles = array())
4951
{
5052
$this->container = $container;
5153
$this->loaderIds = $loaderIds;
54+
$this->resourceFiles = $resourceFiles;
5255

5356
// check option names
5457
if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
@@ -66,6 +69,7 @@ public function __construct(ContainerInterface $container, MessageSelector $sele
6669
protected function initializeCatalogue($locale)
6770
{
6871
$this->initialize();
72+
$this->loadResources($locale);
6973
parent::initializeCatalogue($locale);
7074
}
7175

@@ -77,4 +81,19 @@ protected function initialize()
7781
}
7882
}
7983
}
84+
85+
private function loadResources($locale)
86+
{
87+
$locales = array_merge(array($locale), $this->computeFallbackLocales($locale));
88+
foreach ($locales as $locale) {
89+
if (isset($this->resourceFiles[$locale])) {
90+
foreach ($this->resourceFiles[$locale] as $file) {
91+
// filename is domain.locale.format
92+
list($domain, $locale, $format) = explode('.', basename($file), 3);
93+
$this->addResource($format, $file, $locale, $domain);
94+
}
95+
unset($this->resourceFiles[$locale]);
96+
}
97+
}
98+
}
8099
}

0 commit comments

Comments
 (0)
0