Skip to content

Commit f9448c8

Browse files
committed
Create an interface for TranslationReader and moved TranslationLoader to Translation component
1 parent 3008485 commit f9448c8

File tree

6 files changed

+176
-12
lines changed

6 files changed

+176
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CHANGELOG
77
* Added `TranslationDumperPass`
88
* Added `TranslationExtractorPass`
99
* Added `TranslatorPass`
10+
* Added `TranslationReader` and `TranslationReaderInterface`
1011
* Added `<notes>` section to the Xliff 2.0 dumper.
1112
* Improved Xliff 2.0 loader to load `<notes>` section.
1213
* Added `TranslationWriterInterface`

DependencyInjection/TranslatorPass.php

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@
1919
class TranslatorPass implements CompilerPassInterface
2020
{
2121
private $translatorServiceId;
22-
private $loaderServiceId;
22+
private $readerServiceId;
2323
private $loaderTag;
2424

25-
public function __construct($translatorServiceId = 'translator.default', $loaderServiceId = 'translation.loader', $loaderTag = 'translation.loader')
25+
public function __construct($translatorServiceId = 'translator.default', $readerServiceId = 'translation.loader', $loaderTag = 'translation.loader')
2626
{
27+
if ('translation.loader' === $readerServiceId && 2 > func_num_args()) {
28+
@trigger_error('The default value for $readerServiceId will change in 4.0 to "translation.reader".', E_USER_DEPRECATED);
29+
}
30+
2731
$this->translatorServiceId = $translatorServiceId;
28-
$this->loaderServiceId = $loaderServiceId;
32+
$this->readerServiceId = $readerServiceId;
2933
$this->loaderTag = $loaderTag;
3034
}
3135

@@ -45,15 +49,27 @@ public function process(ContainerBuilder $container)
4549
}
4650
}
4751

48-
if ($container->hasDefinition($this->loaderServiceId)) {
49-
$definition = $container->getDefinition($this->loaderServiceId);
52+
if ($container->hasDefinition($this->readerServiceId)) {
53+
$definition = $container->getDefinition($this->readerServiceId);
5054
foreach ($loaders as $id => $formats) {
5155
foreach ($formats as $format) {
5256
$definition->addMethodCall('addLoader', array($format, $loaderRefs[$id]));
5357
}
5458
}
5559
}
5660

61+
// Duplicated code to support "translation.reader", to be removed in 4.0
62+
if ('translation.reader' !== $this->readerServiceId) {
63+
if ($container->hasDefinition('translation.reader')) {
64+
$definition = $container->getDefinition('translation.reader');
65+
foreach ($loaders as $id => $formats) {
66+
foreach ($formats as $format) {
67+
$definition->addMethodCall('addLoader', array($format, $loaderRefs[$id]));
68+
}
69+
}
70+
}
71+
}
72+
5773
$container
5874
->findDefinition($this->translatorServiceId)
5975
->replaceArgument(0, ServiceLocatorTagPass::register($container, $loaderRefs))

Reader/TranslationReader.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
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\Reader;
13+
14+
use Symfony\Component\Finder\Finder;
15+
use Symfony\Component\Translation\Loader\LoaderInterface;
16+
use Symfony\Component\Translation\MessageCatalogue;
17+
18+
/**
19+
* TranslationReader reads translation messages from translation files.
20+
*
21+
* @author Michel Salib <[email protected]>
22+
*/
23+
class TranslationReader implements TranslationReaderInterface
24+
{
25+
/**
26+
* Loaders used for import.
27+
*
28+
* @var array
29+
*/
30+
private $loaders = array();
31+
32+
/**
33+
* Adds a loader to the translation extractor.
34+
*
35+
* @param string $format The format of the loader
36+
* @param LoaderInterface $loader
37+
*/
38+
public function addLoader($format, LoaderInterface $loader)
39+
{
40+
$this->loaders[$format] = $loader;
41+
}
42+
43+
/**
44+
* {@inheritdoc}
45+
*/
46+
public function read($directory, MessageCatalogue $catalogue)
47+
{
48+
if (!is_dir($directory)) {
49+
return;
50+
}
51+
52+
foreach ($this->loaders as $format => $loader) {
53+
// load any existing translation files
54+
$finder = new Finder();
55+
$extension = $catalogue->getLocale().'.'.$format;
56+
$files = $finder->files()->name('*.'.$extension)->in($directory);
57+
foreach ($files as $file) {
58+
$domain = substr($file->getFilename(), 0, -1 * strlen($extension) - 1);
59+
$catalogue->addCatalogue($loader->load($file->getPathname(), $catalogue->getLocale(), $domain));
60+
}
61+
}
62+
}
63+
}

Reader/TranslationReaderInterface.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
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\Reader;
13+
14+
use Symfony\Component\Translation\MessageCatalogue;
15+
16+
/**
17+
* TranslationReader reads translation messages from translation files.
18+
*
19+
* @author Tobias Nyholm <[email protected]>
20+
*/
21+
interface TranslationReaderInterface
22+
{
23+
/**
24+
* Reads translation messages from a directory to the catalogue.
25+
*
26+
* @param string $directory
27+
* @param MessageCatalogue $catalogue
28+
*/
29+
public function read($directory, MessageCatalogue $catalogue);
30+
}

Tests/DependencyInjection/TranslationPassTest.php

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,79 @@ public function testValidCollector()
2525
$loader = (new Definition())
2626
->addTag('translation.loader', array('alias' => 'xliff', 'legacy-alias' => 'xlf'));
2727

28+
$reader = new Definition();
29+
2830
$translator = (new Definition())
2931
->setArguments(array(null, null, null, null));
3032

3133
$container = new ContainerBuilder();
3234
$container->setDefinition('translator.default', $translator);
33-
$container->setDefinition('translation.loader', $loader);
35+
$container->setDefinition('translation.reader', $reader);
36+
$container->setDefinition('translation.xliff_loader', $loader);
37+
38+
$pass = new TranslatorPass('translator.default', 'translation.reader');
39+
$pass->process($container);
40+
41+
$expectedReader = (new Definition())
42+
->addMethodCall('addLoader', array('xliff', new Reference('translation.xliff_loader')))
43+
->addMethodCall('addLoader', array('xlf', new Reference('translation.xliff_loader')))
44+
;
45+
$this->assertEquals($expectedReader, $reader);
46+
47+
$expectedLoader = (new Definition())
48+
->addTag('translation.loader', array('alias' => 'xliff', 'legacy-alias' => 'xlf'))
49+
;
50+
$this->assertEquals($expectedLoader, $loader);
51+
52+
$this->assertSame(array('translation.xliff_loader' => array('xliff', 'xlf')), $translator->getArgument(3));
53+
54+
$expected = array('translation.xliff_loader' => new ServiceClosureArgument(new Reference('translation.xliff_loader')));
55+
$this->assertEquals($expected, $container->getDefinition((string) $translator->getArgument(0))->getArgument(0));
56+
}
57+
58+
/**
59+
* @group legacy
60+
* @expectedDeprecation The default value for $readerServiceId will change in 4.0 to "translation.reader".
61+
*
62+
* A test that verifies the deprecated "translation.loader" gets the LoaderInterfaces added.
63+
*
64+
* This test should be removed in 4.0.
65+
*/
66+
public function testValidCollectorWithDeprecatedTranslationLoader()
67+
{
68+
$loader = (new Definition())
69+
->addTag('translation.loader', array('alias' => 'xliff', 'legacy-alias' => 'xlf'));
70+
71+
$legacyReader = new Definition();
72+
$reader = new Definition();
73+
74+
$translator = (new Definition())
75+
->setArguments(array(null, null, null, null));
76+
77+
$container = new ContainerBuilder();
78+
$container->setDefinition('translator.default', $translator);
79+
$container->setDefinition('translation.loader', $legacyReader);
80+
$container->setDefinition('translation.reader', $reader);
81+
$container->setDefinition('translation.xliff_loader', $loader);
3482

3583
$pass = new TranslatorPass();
3684
$pass->process($container);
3785

38-
$expected = (new Definition())
86+
$expectedReader = (new Definition())
87+
->addMethodCall('addLoader', array('xliff', new Reference('translation.xliff_loader')))
88+
->addMethodCall('addLoader', array('xlf', new Reference('translation.xliff_loader')))
89+
;
90+
$this->assertEquals($expectedReader, $legacyReader);
91+
$this->assertEquals($expectedReader, $reader);
92+
93+
$expectedLoader = (new Definition())
3994
->addTag('translation.loader', array('alias' => 'xliff', 'legacy-alias' => 'xlf'))
40-
->addMethodCall('addLoader', array('xliff', new Reference('translation.loader')))
41-
->addMethodCall('addLoader', array('xlf', new Reference('translation.loader')))
4295
;
43-
$this->assertEquals($expected, $loader);
96+
$this->assertEquals($expectedLoader, $loader);
4497

45-
$this->assertSame(array('translation.loader' => array('xliff', 'xlf')), $translator->getArgument(3));
98+
$this->assertSame(array('translation.xliff_loader' => array('xliff', 'xlf')), $translator->getArgument(3));
4699

47-
$expected = array('translation.loader' => new ServiceClosureArgument(new Reference('translation.loader')));
100+
$expected = array('translation.xliff_loader' => new ServiceClosureArgument(new Reference('translation.xliff_loader')));
48101
$this->assertEquals($expected, $container->getDefinition((string) $translator->getArgument(0))->getArgument(0));
49102
}
50103
}

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"symfony/dependency-injection": "~3.4|~4.0",
2525
"symfony/intl": "^2.8.18|^3.2.5|~4.0",
2626
"symfony/yaml": "~3.3|~4.0",
27+
"symfony/finder": "~2.8|~3.0|~4.0",
2728
"psr/log": "~1.0"
2829
},
2930
"conflict": {

0 commit comments

Comments
 (0)