8000 FIX #13919 added TranslationsCacheWarmer to generate catalogues at wa… · xavierleune/symfony@d1015db · GitHub
[go: up one dir, main page]

Skip to content

Commit d1015db

Browse files
committed
FIX symfony#13919 added TranslationsCacheWarmer to generate catalogues at warmup
1 parent cb70899 commit d1015db

File tree

9 files changed

+143
-31
lines changed

9 files changed

+143
-31
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
2.7.0
5+
-----
6+
7+
* Added `TranslationsCacheWarmer` to create catalogues at warmup
8+
49
2.6.0
510
-----
611

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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\Bundle\FrameworkBundle\CacheWarmer;
13+
14+
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface;
15+
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
16+
use Symfony\Component\Translation\TranslatorInterface;
17+
18+
/**
19+
* Generates the catalogues for translations.
20+
*
21+
* @author Xavier Leune <xavier.leune@gmail.com>
22+
*/
23+
class TranslationsCacheWarmer implements CacheWarmerInterface
24+
{
25+
private $translator;
26+
27+
/**
28+
*
29+
* @param TranslatorInterface $translator A Translator instance
30+
*/
31+
public function __construct(TranslatorInterface $translator)
32+
{
33+
$this->translator = $translator;
34+
}
35+
36+
/**
37+
* {@inheritdoc}
38+
*/
39+
public function warmUp($cacheDir)
40+
{
41+
if ($this->translator instanceof WarmableInterface) {
42+
$this->translator->warmUp($cacheDir);
43+
}
44+
}
45+
46+
/**
47+
* {@inheritdoc}
48+
*/
49+
public function isOptional()
50+
{
51+
return true;
52+
}
53+
}

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggingTranslatorPass.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
16+
use Symfony\Component\DependencyInjection\Reference;
1617

1718
/**
1819
* @author Abdellatif Ait boudad <a.aitboudad@gmail.com>
@@ -38,6 +39,7 @@ public function process(ContainerBuilder $container)
3839
$refClass = new \ReflectionClass($class);
3940
if ($refClass->implementsInterface('Symfony\Component\Translation\TranslatorInterface') && $refClass->implementsInterface('Symfony\Component\Translation\TranslatorBagInterface')) {
4041
$container->getDefinition('translator.logging')->setDecoratedService('translator');
42+
$container->getDefinition('translation.warmer')->replaceArgument(0, new Reference('translator.logging.inner'));
4143
}
4244
}
4345
}

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -698,12 +698,22 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
698698
->in($dirs)
699699
;
700700

701+
$locales = array();
701702
foreach ($finder as $file) {
702703
list($domain, $locale, $format) = explode('.', $file->getBasename(), 3);
703-
$files[] = (string) $file;
704+
if (!isset($files[$locale])) {
705+
$files[$locale] = array();
706+
}
707+
708+
$files[$locale][] = (string) $file;
704709
}
705710

706-
$translator->replaceArgument(4, $files);
711+
$options = array_merge(
712+
$translator->getArgument(3),
713+
array('resource_files' => $files)
714+
);
715+
716+
$translator->replaceArgument(3, $options);
707717
}
708718
}
709719

@@ -865,9 +875,9 @@ private function registerSecurityCsrfConfiguration(array $config, ContainerBuild
865875
/**
866876
* Loads the serializer configuration.
867877
*
868-
* @param array $config A serializer configuration array
878+
* @param array $config A serializer configuration array
869879
* @param ContainerBuilder $container A ContainerBuilder instance
870-
* @param XmlFileLoader $loader An XmlFileLoader instance
880+
* @param XmlFileLoader $loader An XmlFileLoader instance
871881
*/
872882
private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
873883
{

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,5 +152,10 @@
152152
<service id="translation.extractor" class="%translation.extractor.class%"/>
153153

154154
<service id="translation.writer" class="%translation.writer.class%"/>
155+
156+
<service id="translation.warmer" class="Symfony\Bundle\FrameworkBundle\CacheWarmer\TranslationsCacheWarmer" public="false">
157+
<argument type="service" id="translator" />
158+
<tag name="kernel.cache_warmer" />
159+
</service>
155160
</services>
156161
</container>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/LoggingTranslatorPassTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function testProcess()
3535
->method('getAlias')
3636
->will($this->returnValue('translation.default'));
3737

38-
$container->expects($this->exactly(2))
38+
$container->expects($this->exactly(3))
3939
->method('getDefinition')
4040
->will($this->returnValue($definition));
4141

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,9 @@ public function testTranslator()
223223
$container = $this->createContainerFromFile('full');
224224
$this->assertTrue($container->hasDefinition('translator.default'), '->registerTranslatorConfiguration() loads translation.xml');
225225
$this->assertEquals('translator.default', (string) $container->getAlias('translator'), '->registerTranslatorConfiguration() redefines translator service from identity to real translator');
226-
$resources = $container->getDefinition('translator.default')->getArgument(4);
226+
$options = $container->getDefinition('translator.default')->getArgument(3);
227227

228-
$files = array_map(function ($resource) { return realpath($resource); }, $resources);
228+
$files = array_map(function ($resource) { return realpath($resource); }, $options['resource_files']['en']);
229229
$ref = new \ReflectionClass('Symfony\Component\Validator\Validation');
230230
$this->assertContains(
231231
strtr(dirname($ref->getFileName()).'/Resources/translations/validators.en.xlf', '/', DIRECTORY_SEPARATOR),

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

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ 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), array(), 'loader', '\Symfony\Bundle\FrameworkBundle\Tests\Translation\TranslatorWithInvalidLocale');
98+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), 'loader', '\Symfony\Bundle\FrameworkBundle\Tests\Translation\TranslatorWithInvalidLocale');
9999
$translator->setLocale('invalid locale');
100100

101101
$this->setExpectedException('\InvalidArgumentException');
@@ -106,23 +106,25 @@ public function testLoadRessourcesWithCaching()
106106
{
107107
$loader = new \Symfony\Component\Translation\Loader\YamlFileLoader();
108108
$resourceFiles = array(
109-
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
109+
'fr' => array(
110+
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
111+
),
110112
);
111113

112114
// prime the cache
113-
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), $resourceFiles, 'yml');
115+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir, 'resource_files' => $resourceFiles), 'yml');
114116
$translator->setLocale('fr');
115117

116118
$this->assertEquals('répertoire', $translator->trans('folder'));
117119

118120
// do it another time as the cache is primed now
119-
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), array(), 'yml');
121+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir), 'yml');
120122
$translator->setLocale('fr');
121123

122124
$this->assertEquals('répertoire', $translator->trans('folder'));
123125

124126
// refresh cache when resources is changed in debug mode.
125-
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir, 'debug' => true), array(), 'yml');
127+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir, 'debug' => true), 'yml');
126128
$translator->setLocale('fr');
127129

128130
$this->assertEquals('folder', $translator->trans('folder'));
@@ -132,10 +134,12 @@ public function testLoadRessourcesWithoutCaching()
132134
{
133135
$loader = new \Symfony\Component\Translation\Loader\YamlFileLoader();
134136
$resourceFiles = array(
135-
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
137+
'fr' => array(
138+
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
139+
),
136140
);
137141

138-
$translator = $this->getTranslator($loader, array(), $resourceFiles, 'yml');
142+
$translator = $this->getTranslator($loader, array('resource_files' => $resourceFiles), 'yml');
139143
$translator->setLocale('fr');
140144

141145
$this->assertEquals('répertoire', $translator->trans('folder'));
@@ -221,14 +225,13 @@ protected function getContainer($loader)
221225
return $container;
222226
}
223227

224-
public function getTranslator($loader, $options = array(), $resources = array(), $loaderFomat = 'loader', $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator')
228+
public function getTranslator($loader, $options = array(), $loaderFomat = 'loader', $translatorClass = '\Symfony\Bundle\FrameworkBundle\Translation\Translator')
225229
{
226230
$translator = new $translatorClass(
227231
$this->getContainer($loader),
228232
new MessageSelector(),
229233
array($loaderFomat => array($loaderFomat)),
230-
$options,
231-
$resources
234+
$options
232235
);
233236

234237
if ('loader' === $loaderFomat) {
@@ -243,6 +246,22 @@ public function getTranslator($loader, $options = array(), $resources = array(),
243246

244247
return $translator;
245248
}
249+
250+
public function testWarmup()
251+
{
252+
$loader = new \Symfony\Component\Translation\Loader\YamlFileLoader();
253+
$resourceFiles = array(
254+
'fr' => array(
255+
__DIR__.'/../Fixtures/Resources/translations/messages.fr.yml',
256+
),
257+
);
258+
259+
// prime the cache
260+
$translator = $this->getTranslator($loader, array('cache_dir' => $this->tmpDir, 'resource_files' => $resourceFiles), 'yml');
261+
$this->assertFalse(file_exists($this->tmpDir.'/catalogue.fr.php'));
262+
$translator->warmup($this->tmpDir);
263+
$this->assertTrue(file_exists($this->tmpDir.'/catalogue.fr.php'));
264+
}
246265
}
247266

248267
class TranslatorWithInvalidLocale extends Translator

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

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\Translation;
1313

14+
use Symfony\Component\HttpKernel\CacheWarmer\WarmableInterface;
1415
use Symfony\Component\Translation\Translator as BaseTranslator;
1516
use Symfony\Component\Translation\MessageSelector;
1617
use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -20,45 +21,50 @@
2021
*
2122
* @author Fabien Potencier <fabien@symfony.com>
2223
*/
23-
class Translator extends BaseTranslator
24+
class Translator extends BaseTranslator implements WarmableInterface
2425
{
2526
protected $container;
2627
protected $loaderIds;
27-
protected $resourceFiles;
2828

2929
protected $options = array(
3030
'cache_dir' => null,
3131
'debug' => false,
32+
'res F438 ource_files' => array(),
3233
);
3334

35+
/**
36+
* @var array
37+
*/
38+
private $resourceLocales;
39+
3440
/**
3541
* Constructor.
3642
*
3743
* Available options:
3844
*
3945
* * cache_dir: The cache directory (or null to disable caching)
4046
* * debug: Whether to enable debugging or not (false by default)
47+
* * resource_files: List of translation resources available grouped by locale.
4148
*
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
49+
* @param ContainerInterface $container A ContainerInterface instance
50+
* @param MessageSelector $selector The message selector for pluralization
51+
* @param array $loaderIds An array of loader Ids
52+
* @param array $options An array of options
4753
*
4854
* @throws \InvalidArgumentException
4955
*/
50-
public function __construct(ContainerInterface $container, MessageSelector $selector, $loaderIds = array(), array $options = array(), $resourceFiles = array())
56+
public function __construct(ContainerInterface $container, MessageSelector $selector, $loaderIds = array(), array $options = array())
5157
{
5258
$this->container = $container;
5359
$this->loaderIds = $loaderIds;
54-
$this->resourceFiles = $resourceFiles;
5560

5661
// check option names
5762
if ($diff = array_diff(array_keys($options), array_keys($this->options))) {
5863
throw new \InvalidArgumentException(sprintf('The Translator does not support the following options: \'%s\'.', implode('\', \'', $diff)));
5964
}
6065

6166
$this->options = array_merge($this->options, $options);
67+
$this->resourceLocales = array_keys($this->options['resource_files']);
6268
if (null !== $this->options['cache_dir'] && $this->options['debug']) {
6369
$this->loadResources();
6470
}
@@ -87,11 +93,23 @@ protected function initialize()
8793

8894
private function loadResources()
8995
{
90-
foreach ($this->resourceFiles as $key => $file) {
91-
// filename is domain.locale.format
92-
list($domain, $locale, $format) = explode('.', basename($file), 3);
93-
$this->addResource($format, $file, $locale, $domain);
94-
unset($this->resourceFiles[$key]);
96+
foreach ($this->options['resource_files'] as $locale => $files) {
97+
foreach ($files as $key => $file) {
98+
// filename is domain.locale.format
99+
list($domain, $locale, $format) = explode('.', basename($file), 3);
100+
$this->addResource($format, $file, $locale, $domain);
101+
unset($this->options['resource_files'][$locale][$key]);
102+
}
103+
}
104+
}
105+
106+
/**
107+
* {@inheritdoc}
108+
*/
109+
public function warmUp($cacheDir)
110+
{
111+
foreach ($this->resourceLocales as $locale) {
112+
$this->loadCatalogue($locale);
95113
}
96114
}
97115
}

0 commit comments

Comments
 (0)
0