From a532d24d1a86bbe219b65626c327a2c4c2423d6b Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sat, 10 May 2014 23:14:12 +0100 Subject: [PATCH 01/10] [Translation][composer] added psr/log --- src/Symfony/Component/Translation/composer.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Translation/composer.json b/src/Symfony/Component/Translation/composer.json index 820a9a648d053..9cd6d9376d57f 100644 --- a/src/Symfony/Component/Translation/composer.json +++ b/src/Symfony/Component/Translation/composer.json @@ -21,11 +21,13 @@ "require-dev": { "symfony/config": "~2.0", "symfony/intl": "~2.3", - "symfony/yaml": "~2.2" + "symfony/yaml": "~2.2", + "psr/log": "~1.0" }, "suggest": { "symfony/config": "", - "symfony/yaml": "" + "symfony/yaml": "", + "psr/log": "For using logging capability in translator" }, "autoload": { "psr-0": { "Symfony\\Component\\Translation\\": "" } From c319cefc8679644ebf8bfe24b556f041331b9f53 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sat, 10 May 2014 23:15:00 +0100 Subject: [PATCH 02/10] [Translation] added LoggableTranslator. --- .../Component/Translation/CHANGELOG.md | 1 + .../Translation/LoggableTranslator.php | 120 ++++++++++++++++++ .../Tests/LoggableTranslatorTest.php | 57 +++++++++ .../Component/Translation/Translator.php | 20 +++ 4 files changed, 198 insertions(+) create mode 100644 src/Symfony/Component/Translation/LoggableTranslator.php create mode 100644 src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index c0eeb7e94f15f..22b756a61baec 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG ----- * added possibility to cache catalogues + * added LoggableTranslator 2.5.0 ----- diff --git a/src/Symfony/Component/Translation/LoggableTranslator.php b/src/Symfony/Component/Translation/LoggableTranslator.php new file mode 100644 index 0000000000000..073991a81de94 --- /dev/null +++ b/src/Symfony/Component/Translation/LoggableTranslator.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +use Psr\Log\LoggerInterface; + +/** + * @author Abdellatif Ait boudad + */ +class LoggableTranslator implements TranslatorInterface +{ + /** + * @var TranslatorInterface + */ + private $translator; + + /** + * @var LoggerInterface + */ + private $logger; + + /** + * @param Translator $translator The translator + * @param LoggerInterface $logger A logger instance + */ + public function __construct(Translator $translator, LoggerInterface $logger = null) + { + $this->translator = $translator; + $this->logger = $logger; + } + + /** + * {@inheritdoc} + */ + public function trans($id, array $parameters = array(), $domain = null, $locale = null) + { + $trans = $this->translator->trans($id, $parameters , $domain , $locale); + $this->log($id, $domain, $locale); + + return $trans; + } + + /** + * {@inheritdoc} + */ + public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) + { + $trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale); + $this->log($id, $domain, $locale); + + return $trans; + } + + /** + * {@inheritdoc} + * + * @api + */ + public function setLocale($locale) + { + $this->translator->setLocale($locale); + } + + /** + * {@inheritdoc} + * + * @api + */ + public function getLocale() + { + return $this->translator->getLocale(); + } + + /** + * Passes through all unknown calls onto the translator object. + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->translator, $method), $args); + } + + /** + * Logs for missing catalogue. + * + * @param string $id + * @param string $domain + * @param string $locale + */ + private function log($id, $domain, $locale) + { + if (null === $locale) { + $locale = $this->getLocale(); + } + + if (null === $domain) { + $domain = 'messages'; + } + + $id = (string) $id; + $catalogue = $this->translator->getCatalogue($locale); + if (null === $this->logger || $catalogue->defines($id, $domain)) { + return; + } + + if ($catalogue->has($id, $domain)) { + $this->logger->debug('Translation use fallback catalogue.', array('id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale())); + } else { + $this->logger->warning('Translation not found.', array('id' => $id, 'domain' => $domain, 'locale' => $catalogue->getLocale())); + } + } +} diff --git a/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php b/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php new file mode 100644 index 0000000000000..b8adfdbff2b33 --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Tests; + +use Symfony\Component\Translation\Translator; +use Symfony\Component\Translation\LoggableTranslator; +use Symfony\Component\Translation\Loader\ArrayLoader; + +class LoggableTranslatorTest extends \PHPUnit_Framework_TestCase +{ + public function testTransWithNoTranslationIsLogged() + { + if (!interface_exists('Psr\Log\LoggerInterface')) { + $this->markTestSkipped('The "LoggerInterface" is not available'); + } + + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $logger->expects($this->exactly(2)) + ->method('warning') + ->with('Translation not found.') + ; + + $translator = new Translator('ar'); + $loggableTranslator = new LoggableTranslator($translator, $logger); + $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); + $loggableTranslator->trans('bar'); + } + + public function testTransChoiceFallbackIsLogged() + { + if (!interface_exists('Psr\Log\LoggerInterface')) { + $this->markTestSkipped('The "LoggerInterface" is not available'); + } + + $logger = $this->getMock('Psr\Log\LoggerInterface'); + $logger->expects($this->once()) + ->method('debug') + ->with('Translation use fallback catalogue.') + ; + + $translator = new Translator('ar'); + $translator->setFallbackLocales(array('en')); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', array('some_message2' => 'one thing|%count% things'), 'en'); + $loggableTranslator = new LoggableTranslator($translator, $logger); + $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); + } +} diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index 9483e6aa7f309..03c381d9d369d 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -256,6 +256,26 @@ public function transChoice($id, $number, array $parameters = array(), $domain = return strtr($this->selector->choose($catalogue->get($id, $domain), (int) $number, $locale), $parameters); } + /** + * Gets the catalogue by locale. + * + * @param string|null $locale The locale or null to use the default + * + * @return MessageCatalogueInterface + */ + public function getCatalogue($locale = null) + { + if (null === $locale) { + $locale = $this->getLocale(); + } + + if (!isset($this->catalogues[$locale])) { + $this->loadCatalogue($locale); + } + + return $this->catalogues[$locale]; + } + /** * Gets the loaders. * From f543258e6e72445787fb4ae99afa9b5a0b46d690 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sat, 10 May 2014 23:43:48 +0100 Subject: [PATCH 03/10] [FrameworkBundle] [Translation] use LoggableTranslator in mode debug. --- .../DependencyInjection/FrameworkExtension.php | 4 ++++ .../FrameworkBundle/Resources/config/translation.xml | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 81dbb3c0c61c4..53f29fd0f90ce 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -621,6 +621,10 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder // Use the "real" translator instead of the identity default $container->setAlias('translator', 'translator.default'); + if ($container->getParameter('kernel.debug')) { + $container->setAlias('translator', 'loggable_translator.default'); + } + $translator = $container->findDefinition('translator.default'); if (!is_array($config['fallback'])) { $config['fallback'] = array($config['fallback']); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index 300f24da7f6e7..1941b9246be2e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -6,6 +6,7 @@ Symfony\Bundle\FrameworkBundle\Translation\Translator + Symfony\Component\Translation\LoggableTranslator Symfony\Component\Translation\IdentityTranslator Symfony\Component\Translation\MessageSelector Symfony\Component\Translation\Loader\PhpFileLoader @@ -46,6 +47,12 @@ + + + + + + From 8fdd235982653d2fcff1f7a2823b9ba961dd30ac Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sun, 11 May 2014 01:00:06 +0100 Subject: [PATCH 04/10] [Translation] added test GetCatalogue --- .../Component/Translation/Tests/TranslatorTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index b141ab5e8bacf..305a25d42d4b0 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -14,6 +14,7 @@ use Symfony\Component\Translation\Translator; use Symfony\Component\Translation\MessageSelector; use Symfony\Component\Translation\Loader\ArrayLoader; +use Symfony\Component\Translation\MessageCatalogue; class TranslatorTest extends \PHPUnit_Framework_TestCase { @@ -74,6 +75,16 @@ public function testSetValidLocale($locale) $this->assertEquals($locale, $translator->getLocale()); } + public function testGetCatalogue() + { + $translator = new Translator('en'); + + $this->assertEquals(new MessageCatalogue('en'), $translator->getCatalogue()); + + $translator->setLocale('fr'); + $this->assertEquals(new MessageCatalogue('fr'), $translator->getCatalogue('fr')); + } + public function testSetFallbackLocales() { $translator = new Translator('en'); From 0f2294dcefe8b7e8181deeedc269bc79f5a435ed Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sun, 8 Jun 2014 12:23:37 +0100 Subject: [PATCH 05/10] [Translation][LoggableTranslator] make logger required with Minor fix. --- .../Component/Translation/LoggableTranslator.php | 12 ++++++------ .../Translation/Tests/LoggableTranslatorTest.php | 9 ++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Symfony/Component/Translation/LoggableTranslator.php b/src/Symfony/Component/Translation/LoggableTranslator.php index 073991a81de94..a6b00c8c95362 100644 --- a/src/Symfony/Component/Translation/LoggableTranslator.php +++ b/src/Symfony/Component/Translation/LoggableTranslator.php @@ -32,7 +32,7 @@ class LoggableTranslator implements TranslatorInterface * @param Translator $translator The translator * @param LoggerInterface $logger A logger instance */ - public function __construct(Translator $translator, LoggerInterface $logger = null) + public function __construct(Translator $translator, LoggerInterface $logger) { $this->translator = $translator; $this->logger = $logger; @@ -89,11 +89,11 @@ public function __call($method, $args) } /** - * Logs for missing catalogue. + * Logs for missing translations. * - * @param string $id - * @param string $domain - * @param string $locale + * @param string $id + * @param string|null $domain + * @param string|null $locale */ private function log($id, $domain, $locale) { @@ -107,7 +107,7 @@ private function log($id, $domain, $locale) $id = (string) $id; $catalogue = $this->translator->getCatalogue($locale); - if (null === $this->logger || $catalogue->defines($id, $domain)) { + if ($catalogue->defines($id, $domain)) { return; } diff --git a/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php b/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php index b8adfdbff2b33..6f223c9d00fd0 100644 --- a/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php @@ -17,12 +17,15 @@ class LoggableTranslatorTest extends \PHPUnit_Framework_TestCase { - public function testTransWithNoTranslationIsLogged() + protected function setUp() { if (!interface_exists('Psr\Log\LoggerInterface')) { $this->markTestSkipped('The "LoggerInterface" is not available'); } + } + public function testTransWithNoTranslationIsLogged() + { $logger = $this->getMock('Psr\Log\LoggerInterface'); $logger->expects($this->exactly(2)) ->method('warning') @@ -37,10 +40,6 @@ public function testTransWithNoTranslationIsLogged() public function testTransChoiceFallbackIsLogged() { - if (!interface_exists('Psr\Log\LoggerInterface')) { - $this->markTestSkipped('The "LoggerInterface" is not available'); - } - $logger = $this->getMock('Psr\Log\LoggerInterface'); $logger->expects($this->once()) ->method('debug') From ecea9543eb33492c584080330c2ca0834be81a32 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sun, 8 Jun 2014 12:33:53 +0100 Subject: [PATCH 06/10] [FrameworkBundle] [Translation] Added config to enable logging and use LoggableTranslatorPass. --- .../Compiler/LoggableTranslatorPass.php | 32 +++++++++++++++++++ .../DependencyInjection/Configuration.php | 11 +++++++ .../FrameworkExtension.php | 14 +++++--- .../FrameworkBundle/FrameworkBundle.php | 2 ++ .../Resources/config/translation.xml | 8 ++--- .../DependencyInjection/ConfigurationTest.php | 9 +++--- 6 files changed, 64 insertions(+), 12 deletions(-) create mode 100644 src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php new file mode 100644 index 0000000000000..a7cc26295fd2a --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler; + +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; + +/** + * @author Abdellatif Ait boudad + */ +class LoggableTranslatorPass implements CompilerPassInterface +{ + public function process(ContainerBuilder $container) + { + if (!$container->hasAlias('logger')) { + return; + } + + if ($container->getParameter('translator.logging')) { + $container->getDefinition('translator.loggable')->setDecoratedService('translator'); + } + } +} diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 0a7e2cc4cd495..36ce2901e0bae 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -22,6 +22,16 @@ */ class Configuration implements ConfigurationInterface { + private $debug; + + /** + * @param bool $debug Whether debugging is enabled or not + */ + public function __construct($debug) + { + $this->debug = (bool) $debug; + } + /** * Generates the configuration tree builder. * @@ -441,6 +451,7 @@ private function addTranslatorSection(ArrayNodeDefinition $rootNode) ->canBeEnabled() ->children() ->scalarNode('fallback')->defaultValue('en')->end() + ->booleanNode('logging')->defaultValue($this->debug)->end() ->end() ->end() ->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 53f29fd0f90ce..04c2076dc6b07 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -169,6 +169,14 @@ public function load(array $configs, ContainerBuilder $container) )); } + /** + * {@inheritdoc} + */ + public function getConfiguration(array $config, ContainerBuilder $container) + { + return new Configuration($container->getParameter('kernel.debug')); + } + /** * Loads Form configuration. * @@ -621,16 +629,14 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder // Use the "real" translator instead of the identity default $container->setAlias('translator', 'translator.default'); - if ($container->getParameter('kernel.debug')) { - $container->setAlias('translator', 'loggable_translator.default'); - } - $translator = $container->findDefinition('translator.default'); if (!is_array($config['fallback'])) { $config['fallback'] = array($config['fallback']); } $translator->addMethodCall('setFallbackLocales', array($config['fallback'])); + $container->setParameter('translator.logging', $config['logging']); + // Discover translation directories $dirs = array(); if (class_exists('Symfony\Component\Validator\Validator')) { diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php index 387031ddc35a0..9fb58ef87a10a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php @@ -20,6 +20,7 @@ use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RoutingResolverPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ProfilerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslatorPass; +use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\LoggableTranslatorPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheWarmerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheClearerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ContainerBuilderDebugDumpPass; @@ -77,6 +78,7 @@ public function build(ContainerBuilder $container) $container->addCompilerPass(new AddConsoleCommandPass()); $container->addCompilerPass(new FormPass()); $container->addCompilerPass(new TranslatorPass()); + $container->addCompilerPass(new LoggableTranslatorPass()); $container->addCompilerPass(new AddCacheWarmerPass()); $container->addCompilerPass(new AddCacheClearerPass()); $container->addCompilerPass(new TranslationExtractorPass()); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index 1941b9246be2e..922a6db352ac3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -6,7 +6,7 @@ Symfony\Bundle\FrameworkBundle\Translation\Translator - Symfony\Component\Translation\LoggableTranslator + Symfony\Component\Translation\LoggableTranslator Symfony\Component\Translation\IdentityTranslator Symfony\Component\Translation\MessageSelector Symfony\Component\Translation\Loader\PhpFileLoader @@ -47,9 +47,9 @@ - - - + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php index 4d41cf23551b8..31e761f28b3db 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php @@ -19,7 +19,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase public function testDefaultConfig() { $processor = new Processor(); - $config = $processor->processConfiguration(new Configuration(), array(array('secret' => 's3cr3t'))); + $config = $processor->processConfiguration(new Configuration(true), array(array('secret' => 's3cr3t'))); $this->assertEquals( array_merge(array('secret' => 's3cr3t', 'trusted_hosts' => array()), self::getBundleDefaultConfig()), @@ -33,7 +33,7 @@ public function testDefaultConfig() public function testValidTrustedProxies($trustedProxies, $processedProxies) { $processor = new Processor(); - $configuration = new Configuration(); + $configuration = new Configuration(true); $config = $processor->processConfiguration($configuration, array(array( 'secret' => 's3cr3t', 'trusted_proxies' => $trustedProxies, @@ -62,7 +62,7 @@ public function getTestValidTrustedProxiesData() public function testInvalidTypeTrustedProxies() { $processor = new Processor(); - $configuration = new Configuration(); + $configuration = new Configuration(true); $processor->processConfiguration($configuration, array( array( 'secret' => 's3cr3t', @@ -77,7 +77,7 @@ public function testInvalidTypeTrustedProxies() public function testInvalidValueTrustedProxies() { $processor = new Processor(); - $configuration = new Configuration(); + $configuration = new Configuration(true); $processor->processConfiguration($configuration, array( array( 'secret' => 's3cr3t', @@ -123,6 +123,7 @@ protected static function getBundleDefaultConfig() 'translator' => array( 'enabled' => false, 'fallback' => 'en', + 'logging' => true, ), 'validation' => array( 'enabled' => false, From 38fb8848894c2c400cc25f4994f3ce568e40ba6a Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Mon, 16 Jun 2014 19:56:54 +0100 Subject: [PATCH 07/10] fixed typo. --- src/Symfony/Component/Translation/composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/Translation/composer.json b/src/Symfony/Component/Translation/composer.json index 9cd6d9376d57f..8824d293aacc3 100644 --- a/src/Symfony/Component/Translation/composer.json +++ b/src/Symfony/Component/Translation/composer.json @@ -27,7 +27,7 @@ "suggest": { "symfony/config": "", "symfony/yaml": "", - "psr/log": "For using logging capability in translator" + "psr/log": "To use logging capability in translator" }, "autoload": { "psr-0": { "Symfony\\Component\\Translation\\": "" } From 071880b2a31270508d1d63dff256600d24b04f32 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Sun, 20 Jul 2014 17:34:08 +0000 Subject: [PATCH 08/10] added TranslatorBagInterface. --- .../Component/Translation/CHANGELOG.md | 1 + .../Translation/LoggableTranslator.php | 10 +++---- .../Component/Translation/Translator.php | 8 ++--- .../Translation/TranslatorBagInterface.php | 29 +++++++++++++++++++ 4 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 src/Symfony/Component/Translation/TranslatorBagInterface.php diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index 22b756a61baec..e294887dadd3a 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -5,6 +5,7 @@ CHANGELOG ----- * added possibility to cache catalogues + * added TranslatorBagInterface * added LoggableTranslator 2.5.0 diff --git a/src/Symfony/Component/Translation/LoggableTranslator.php b/src/Symfony/Component/Translation/LoggableTranslator.php index a6b00c8c95362..706f731a35c27 100644 --- a/src/Symfony/Component/Translation/LoggableTranslator.php +++ b/src/Symfony/Component/Translation/LoggableTranslator.php @@ -28,12 +28,12 @@ class LoggableTranslator implements TranslatorInterface */ private $logger; - /** - * @param Translator $translator The translator - * @param LoggerInterface $logger A logger instance - */ - public function __construct(Translator $translator, LoggerInterface $logger) + public function __construct($translator, LoggerInterface $logger) { + if (!($translator instanceof TranslatorInterface && $translator instanceof TranslatorBagInterface)) { + throw new \InvalidArgumentException(sprintf('The Translator "%s" must implements TranslatorInterface and TranslatorBagInterface.', get_class($translator))); + } + $this->translator = $translator; $this->logger = $logger; } diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index 03c381d9d369d..356a21b5923e1 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -22,7 +22,7 @@ * * @api */ -class Translator implements TranslatorInterface +class Translator implements TranslatorInterface, TranslatorBagInterface { /** * @var MessageCatalogueInterface[] @@ -257,11 +257,7 @@ public function transChoice($id, $number, array $parameters = array(), $domain = } /** - * Gets the catalogue by locale. - * - * @param string|null $locale The locale or null to use the default - * - * @return MessageCatalogueInterface + * {@inheritdoc} */ public function getCatalogue($locale = null) { diff --git a/src/Symfony/Component/Translation/TranslatorBagInterface.php b/src/Symfony/Component/Translation/TranslatorBagInterface.php new file mode 100644 index 0000000000000..e0312d9135576 --- /dev/null +++ b/src/Symfony/Component/Translation/TranslatorBagInterface.php @@ -0,0 +1,29 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +/** + * TranslatorBagInterface + * + * @author Abdellatif Ait boudad + */ +interface TranslatorBagInterface +{ + /** + * Gets the catalogue by locale. + * + * @param string|null $locale The locale or null to use the default + * + * @return MessageCatalogueInterface + */ + public function getCatalogue($locale = null); +} From 8af5171a5f8c2ee9d78cab00ac8540e5aa15c948 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Wed, 23 Jul 2014 17:58:41 +0000 Subject: [PATCH 09/10] Use LoggableTranslator only if the translator implements TranslatorInterface and TranslatorBagInterface. --- .../Compiler/LoggableTranslatorPass.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php index a7cc26295fd2a..b066e2469a67d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php @@ -26,7 +26,14 @@ public function process(ContainerBuilder $container) } if ($container->getParameter('translator.logging')) { - $container->getDefinition('translator.loggable')->setDecoratedService('translator'); + $translatorAlias = $container->getAlias('translator'); + $definition = $container->getDefinition((string) $translatorAlias); + $class = $container->getParameterBag()->resolveValue($definition->getClass()); + + $refClass = new \ReflectionClass($class); + if ($refClass->implementsInterface('Symfony\Component\Translation\TranslatorInterface') && $refClass->implementsInterface('Symfony\Component\Translation\TranslatorBagInterface')) { + $container->getDefinition('translator.loggable')->setDecoratedService('translator'); + } } } } From c7ee3006c419c82237305d93f72889860690e274 Mon Sep 17 00:00:00 2001 From: Abdellatif Ait boudad Date: Mon, 22 Sep 2014 16:23:36 +0100 Subject: [PATCH 10/10] rename LoggableTranslator to LoggingTranslator + minor fixes. --- ...atorPass.php => LoggingTranslatorPass.php} | 4 +- .../FrameworkBundle/FrameworkBundle.php | 4 +- .../Resources/config/translation.xml | 6 +- .../Compiler/LoggingTranslatorPassTest.php | 68 +++++++++++++++++++ .../Component/Translation/CHANGELOG.md | 2 +- ...leTranslator.php => LoggingTranslator.php} | 6 +- ...atorTest.php => LoggingTranslatorTest.php} | 8 +-- 7 files changed, 85 insertions(+), 13 deletions(-) rename src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/{LoggableTranslatorPass.php => LoggingTranslatorPass.php} (88%) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/LoggingTranslatorPassTest.php rename src/Symfony/Component/Translation/{LoggableTranslator.php => LoggingTranslator.php} (95%) rename src/Symfony/Component/Translation/Tests/{LoggableTranslatorTest.php => LoggingTranslatorTest.php} (85%) diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggingTranslatorPass.php similarity index 88% rename from src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php rename to src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggingTranslatorPass.php index b066e2469a67d..3d6214b6e2e11 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggableTranslatorPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/LoggingTranslatorPass.php @@ -17,7 +17,7 @@ /** * @author Abdellatif Ait boudad */ -class LoggableTranslatorPass implements CompilerPassInterface +class LoggingTranslatorPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { @@ -32,7 +32,7 @@ public function process(ContainerBuilder $container) $refClass = new \ReflectionClass($class); if ($refClass->implementsInterface('Symfony\Component\Translation\TranslatorInterface') && $refClass->implementsInterface('Symfony\Component\Translation\TranslatorBagInterface')) { - $container->getDefinition('translator.loggable')->setDecoratedService('translator'); + $container->getDefinition('translator.logging')->setDecoratedService('translator'); } } } diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php index 9fb58ef87a10a..2cde83fab6bc2 100644 --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php @@ -20,7 +20,7 @@ use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RoutingResolverPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ProfilerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslatorPass; -use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\LoggableTranslatorPass; +use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\LoggingTranslatorPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheWarmerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddCacheClearerPass; use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ContainerBuilderDebugDumpPass; @@ -78,7 +78,7 @@ public function build(ContainerBuilder $container) $container->addCompilerPass(new AddConsoleCommandPass()); $container->addCompilerPass(new FormPass()); $container->addCompilerPass(new TranslatorPass()); - $container->addCompilerPass(new LoggableTranslatorPass()); + $container->addCompilerPass(new LoggingTranslatorPass()); $container->addCompilerPass(new AddCacheWarmerPass()); $container->addCompilerPass(new AddCacheClearerPass()); $container->addCompilerPass(new TranslationExtractorPass()); diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml index 922a6db352ac3..1f4fd9e40715e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/translation.xml @@ -6,7 +6,7 @@ Symfony\Bundle\FrameworkBundle\Translation\Translator - Symfony\Component\Translation\LoggableTranslator + Symfony\Component\Translation\LoggingTranslator Symfony\Component\Translation\IdentityTranslator Symfony\Component\Translation\MessageSelector Symfony\Component\Translation\Loader\PhpFileLoader @@ -47,8 +47,8 @@ - - + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/LoggingTranslatorPassTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/LoggingTranslatorPassTest.php new file mode 100644 index 0000000000000..9fdee8fd8edb4 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Compiler/LoggingTranslatorPassTest.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Compiler; + +use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\LoggingTranslatorPass; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; + +class LoggingTranslatorPassTest extends \PHPUnit_Framework_TestCase +{ + public function testProcess() + { + $definition = $this->getMock('Symfony\Component\DependencyInjection\Definition'); + $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder'); + $parameterBag = $this->getMock('Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface'); + + $container->expects($this->once()) + ->method('hasAlias') + ->will($this->returnValue(true)); + + $container->expects($this->once()) + ->method('getParameter') + ->will($this->returnValue(true)); + + $container->expects($this->once()) + ->method('getAlias') + ->will($this->returnValue('translation.default')); + + $container->expects($this->exactly(2)) + ->method('getDefinition') + ->will($this->returnValue($definition)); + + $definition->expects($this->once()) + ->method('getClass') + ->will($this->returnValue("%translator.class%")); + + $parameterBag->expects($this->once()) + ->method('resolveValue') + ->will($this->returnValue("Symfony\Bundle\FrameworkBundle\Translation\Translator")); + + $container->expects($this->once()) + ->method('getParameterBag') + ->will($this->returnValue($parameterBag)); + + $pass = new LoggingTranslatorPass(); + $pass->process($container); + } + + public function testThatCompilerPassIsIgnoredIfThereIsNotLoggerDefinition() + { + $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder'); + $container->expects($this->once()) + ->method('hasAlias') + ->will($this->returnValue(false)); + + $pass = new LoggingTranslatorPass(); + $pass->process($container); + } +} diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index e294887dadd3a..d85b70ad0e97d 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -6,7 +6,7 @@ CHANGELOG * added possibility to cache catalogues * added TranslatorBagInterface - * added LoggableTranslator + * added LoggingTranslator 2.5.0 ----- diff --git a/src/Symfony/Component/Translation/LoggableTranslator.php b/src/Symfony/Component/Translation/LoggingTranslator.php similarity index 95% rename from src/Symfony/Component/Translation/LoggableTranslator.php rename to src/Symfony/Component/Translation/LoggingTranslator.php index 706f731a35c27..ae9be1f28fb42 100644 --- a/src/Symfony/Component/Translation/LoggableTranslator.php +++ b/src/Symfony/Component/Translation/LoggingTranslator.php @@ -16,7 +16,7 @@ /** * @author Abdellatif Ait boudad */ -class LoggableTranslator implements TranslatorInterface +class LoggingTranslator implements TranslatorInterface { /** * @var TranslatorInterface @@ -28,6 +28,10 @@ class LoggableTranslator implements TranslatorInterface */ private $logger; + /** + * @param Translator $translator + * @param LoggerInterface $logger + */ public function __construct($translator, LoggerInterface $logger) { if (!($translator instanceof TranslatorInterface && $translator instanceof TranslatorBagInterface)) { diff --git a/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php b/src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php similarity index 85% rename from src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php rename to src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php index 6f223c9d00fd0..ab98d72e7425c 100644 --- a/src/Symfony/Component/Translation/Tests/LoggableTranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php @@ -12,10 +12,10 @@ namespace Symfony\Component\Translation\Tests; use Symfony\Component\Translation\Translator; -use Symfony\Component\Translation\LoggableTranslator; +use Symfony\Component\Translation\LoggingTranslator; use Symfony\Component\Translation\Loader\ArrayLoader; -class LoggableTranslatorTest extends \PHPUnit_Framework_TestCase +class LoggingTranslatorTest extends \PHPUnit_Framework_TestCase { protected function setUp() { @@ -33,7 +33,7 @@ public function testTransWithNoTranslationIsLogged() ; $translator = new Translator('ar'); - $loggableTranslator = new LoggableTranslator($translator, $logger); + $loggableTranslator = new LoggingTranslator($translator, $logger); $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); $loggableTranslator->trans('bar'); } @@ -50,7 +50,7 @@ public function testTransChoiceFallbackIsLogged() $translator->setFallbackLocales(array('en')); $translator->addLoader('array', new ArrayLoader()); $translator->addResource('array', array('some_message2' => 'one thing|%count% things'), 'en'); - $loggableTranslator = new LoggableTranslator($translator, $logger); + $loggableTranslator = new LoggingTranslator($translator, $logger); $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); } }