diff --git a/src/Symfony/Component/Translation/DataCollectorTranslator.php b/src/Symfony/Component/Translation/DataCollectorTranslator.php index 715c390f531d8..884ead9ee41ed 100644 --- a/src/Symfony/Component/Translation/DataCollectorTranslator.php +++ b/src/Symfony/Component/Translation/DataCollectorTranslator.php @@ -16,7 +16,7 @@ /** * @author Abdellatif Ait boudad */ -class DataCollectorTranslator implements TranslatorInterface, TranslatorBagInterface +class DataCollectorTranslator implements TranslatorFallbackInterface, TranslatorBagInterface { const MESSAGE_DEFINED = 0; const MESSAGE_MISSING = 1; @@ -88,13 +88,19 @@ public function getCatalogue($locale = null) } /** - * Gets the fallback locales. - * - * @return array $locales The fallback locales + * {@inheritdoc} */ public function getFallbackLocales() { - if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { + $implementsFallback = $this->translator instanceof TranslatorFallbackInterface; + if ($implementsFallback || method_exists($this->translator, 'getFallbackLocales')) { + if (!$implementsFallback) { + @trigger_error( + sprintf('Having `getFallbackLocales` in %s without implementing %s is deprecated', get_class($this->translator), TranslatorFallbackInterface::class), + E_USER_DEPRECATED + ); + } + return $this->translator->getFallbackLocales(); } diff --git a/src/Symfony/Component/Translation/LoggingTranslator.php b/src/Symfony/Component/Translation/LoggingTranslator.php index 337c114330bb8..a1accfb83e305 100644 --- a/src/Symfony/Component/Translation/LoggingTranslator.php +++ b/src/Symfony/Component/Translation/LoggingTranslator.php @@ -17,7 +17,7 @@ /** * @author Abdellatif Ait boudad */ -class LoggingTranslator implements TranslatorInterface, TranslatorBagInterface +class LoggingTranslator implements TranslatorFallbackInterface, TranslatorBagInterface { /** * @var TranslatorInterface|TranslatorBagInterface @@ -87,13 +87,19 @@ public function getCatalogue($locale = null) } /** - * Gets the fallback locales. - * - * @return array $locales The fallback locales + * {@inheritdoc} */ public function getFallbackLocales() { - if ($this->translator instanceof Translator || method_exists($this->translator, 'getFallbackLocales')) { + $implementsFallback = $this->translator instanceof TranslatorFallbackInterface; + if ($implementsFallback || method_exists($this->translator, 'getFallbackLocales')) { + if (!$implementsFallback) { + @trigger_error( + sprintf('Having `getFallbackLocales` in %s without implementing %s is deprecated', get_class($this->translator), TranslatorFallbackInterface::class), + E_USER_DEPRECATED + ); + } + return $this->translator->getFallbackLocales(); } diff --git a/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php b/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php index 1b417379c87ae..26af0b60814c6 100644 --- a/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/DataCollectorTranslatorTest.php @@ -12,9 +12,10 @@ namespace Symfony\Component\Translation\Tests; use PHPUnit\Framework\TestCase; -use Symfony\Component\Translation\Translator; use Symfony\Component\Translation\DataCollectorTranslator; use Symfony\Component\Translation\Loader\ArrayLoader; +use Symfony\Component\Translation\Translator; +use Symfony\Component\Translation\TranslatorFallbackInterface; class DataCollectorTranslatorTest extends TestCase { @@ -31,49 +32,49 @@ public function testCollectMessages() $expectedMessages = array(); $expectedMessages[] = array( - 'id' => 'foo', - 'translation' => 'foo (en)', - 'locale' => 'en', - 'domain' => 'messages', - 'state' => DataCollectorTranslator::MESSAGE_DEFINED, - 'parameters' => array(), - 'transChoiceNumber' => null, + 'id' => 'foo', + 'translation' => 'foo (en)', + 'locale' => 'en', + 'domain' => 'messages', + 'state' => DataCollectorTranslator::MESSAGE_DEFINED, + 'parameters' => array(), + 'transChoiceNumber' => null, ); $expectedMessages[] = array( - 'id' => 'bar', - 'translation' => 'bar (fr)', - 'locale' => 'fr', - 'domain' => 'messages', - 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, - 'parameters' => array(), - 'transChoiceNumber' => null, + 'id' => 'bar', + 'translation' => 'bar (fr)', + 'locale' => 'fr', + 'domain' => 'messages', + 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, + 'parameters' => array(), + 'transChoiceNumber' => null, ); $expectedMessages[] = array( - 'id' => 'choice', - 'translation' => 'choice', - 'locale' => 'en', - 'domain' => 'messages', - 'state' => DataCollectorTranslator::MESSAGE_MISSING, - 'parameters' => array(), - 'transChoiceNumber' => 0, + 'id' => 'choice', + 'translation' => 'choice', + 'locale' => 'en', + 'domain' => 'messages', + 'state' => DataCollectorTranslator::MESSAGE_MISSING, + 'parameters' => array(), + 'transChoiceNumber' => 0, ); $expectedMessages[] = array( - 'id' => 'bar_ru', - 'translation' => 'bar (ru)', - 'locale' => 'ru', - 'domain' => 'messages', - 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, - 'parameters' => array(), - 'transChoiceNumber' => null, + 'id' => 'bar_ru', + 'translation' => 'bar (ru)', + 'locale' => 'ru', + 'domain' => 'messages', + 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, + 'parameters' => array(), + 'transChoiceNumber' => null, ); $expectedMessages[] = array( - 'id' => 'bar_ru', - 'translation' => 'bar (ru)', - 'locale' => 'ru', - 'domain' => 'messages', - 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, - 'parameters' => array('foo' => 'bar'), - 'transChoiceNumber' => null, + 'id' => 'bar_ru', + 'translation' => 'bar (ru)', + 'locale' => 'ru', + 'domain' => 'messages', + 'state' => DataCollectorTranslator::MESSAGE_EQUALS_FALLBACK, + 'parameters' => array('foo' => 'bar'), + 'transChoiceNumber' => null, ); $this->assertEquals($expectedMessages, $collector->getCollectedMessages()); @@ -89,4 +90,49 @@ private function createCollector() return new DataCollectorTranslator($translator); } + + public function testFallbackLocalesReturned() + { + $internalTranslator = new Translator('en'); + $internalTranslator->setFallbackLocales(array('bg')); + + $translator = new DataCollectorTranslator($internalTranslator); + + $this->assertInstanceOf(TranslatorFallbackInterface::class, $translator); + $fallbackLocales = $translator->getFallbackLocales(); + $this->assertCount(1, $fallbackLocales); + $this->assertEquals('bg', $fallbackLocales[0]); + } + + public function testWrappedTranslatorWithFallbackLocalesWithoutImplementingFallbackInterface() + { + set_error_handler( + function () { + return false; + } + ); + $e = error_reporting(0); + trigger_error('', E_USER_NOTICE); + + $internalTranslator = new DummyTranslator('en', array('bg')); + + $translator = new DataCollectorTranslator($internalTranslator); + + $fallbackLocales = $translator->getFallbackLocales(); + $this->assertCount(1, $fallbackLocales); + $this->assertEquals('bg', $fallbackLocales[0]); + + error_reporting($e); + restore_error_handler(); + + $lastError = error_get_last(); + unset($lastError['file'], $lastError['line']); + + $expected = array( + 'type' => E_USER_DEPRECATED, + 'message' => sprintf('Having `getFallbackLocales` in %s without implementing %s is deprecated', get_class($internalTranslator), TranslatorFallbackInterface::class), + ); + + $this->assertSame($expected, $lastError); + } } diff --git a/src/Symfony/Component/Translation/Tests/DummyTranslator.php b/src/Symfony/Component/Translation/Tests/DummyTranslator.php new file mode 100644 index 0000000000000..0b43138854414 --- /dev/null +++ b/src/Symfony/Component/Translation/Tests/DummyTranslator.php @@ -0,0 +1,58 @@ + + * + * 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\TranslatorBagInterface; +use Symfony\Component\Translation\TranslatorInterface; + +class DummyTranslator implements TranslatorInterface, TranslatorBagInterface +{ + private $locale; + private $fallbackLocales = array(); + + /** + * @param $locale + * @param string[] $fallbackLocales + */ + public function __construct($locale = null, array $fallbackLocales = array()) + { + $this->locale = $locale; + $this->fallbackLocales = $fallbackLocales; + } + + public function getCatalogue($locale = null) + { + } + + public function trans($id, array $parameters = array(), $domain = null, $locale = null) + { + } + + public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null) + { + } + + public function setLocale($locale) + { + $this->locale = $locale; + } + + public function getLocale() + { + return $this->locale; + } + + public function getFallbackLocales() + { + return $this->fallbackLocales; + } +} diff --git a/src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php b/src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php index 891230a2ded21..44c402d3f09fb 100644 --- a/src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/LoggingTranslatorTest.php @@ -12,9 +12,10 @@ namespace Symfony\Component\Translation\Tests; use PHPUnit\Framework\TestCase; -use Symfony\Component\Translation\Translator; -use Symfony\Component\Translation\LoggingTranslator; use Symfony\Component\Translation\Loader\ArrayLoader; +use Symfony\Component\Translation\LoggingTranslator; +use Symfony\Component\Translation\Translator; +use Symfony\Component\Translation\TranslatorFallbackInterface; class LoggingTranslatorTest extends TestCase { @@ -47,4 +48,52 @@ public function testTransChoiceFallbackIsLogged() $loggableTranslator = new LoggingTranslator($translator, $logger); $loggableTranslator->transChoice('some_message2', 10, array('%count%' => 10)); } + + public function testFallbackLocalesReturned() + { + $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); + + $internalTranslator = new Translator('en'); + $internalTranslator->setFallbackLocales(array('bg')); + + $translator = new LoggingTranslator($internalTranslator, $logger); + + $this->assertInstanceOf(TranslatorFallbackInterface::class, $translator); + $fallbackLocales = $translator->getFallbackLocales(); + $this->assertCount(1, $fallbackLocales); + $this->assertEquals('bg', $fallbackLocales[0]); + } + + public function testWrappedTranslatorWithFallbackLocalesWithoutImplementingFallbackInterface() + { + set_error_handler( + function () { + return false; + } + ); + $e = error_reporting(0); + trigger_error('', E_USER_NOTICE); + + $internalTranslator = new DummyTranslator('en', array('bg')); + + $logger = $this->getMockBuilder('Psr\Log\LoggerInterface')->getMock(); + $translator = new LoggingTranslator($internalTranslator, $logger); + + $fallbackLocales = $translator->getFallbackLocales(); + $this->assertCount(1, $fallbackLocales); + $this->assertEquals('bg', $fallbackLocales[0]); + + error_reporting($e); + restore_error_handler(); + + $lastError = error_get_last(); + unset($lastError['file'], $lastError['line']); + + $expected = array( + 'type' => E_USER_DEPRECATED, + 'message' => sprintf('Having `getFallbackLocales` in %s without implementing %s is deprecated', get_class($internalTranslator), TranslatorFallbackInterface::class), + ); + + $this->assertSame($expected, $lastError); + } } diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index 2899db0101e1d..e2bdabf521449 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -26,7 +26,7 @@ /** * @author Fabien Potencier */ -class Translator implements TranslatorInterface, TranslatorBagInterface +class Translator implements TranslatorFallbackInterface, TranslatorBagInterface { /** * @var MessageCatalogueInterface[] @@ -150,11 +150,9 @@ public function getLocale() } /** - * Sets the fallback locales. + * @param string[] $locales * - * @param array $locales The fallback locales - * - * @throws InvalidArgumentException If a locale contains invalid characters + * @throws \InvalidArgumentException If a locale contains invalid characters */ public function setFallbackLocales(array $locales) { @@ -169,9 +167,7 @@ public function setFallbackLocales(array $locales) } /** - * Gets the fallback locales. - * - * @return array $locales The fallback locales + * {@inheritdoc} */ public function getFallbackLocales() { diff --git a/src/Symfony/Component/Translation/TranslatorFallbackInterface.php b/src/Symfony/Component/Translation/TranslatorFallbackInterface.php new file mode 100644 index 0000000000000..19ff5f990be89 --- /dev/null +++ b/src/Symfony/Component/Translation/TranslatorFallbackInterface.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation; + +/** + * @author Bozhidar Hristov + */ +interface TranslatorFallbackInterface extends TranslatorInterface +{ + /** + * @return string[] $locales + */ + public function getFallbackLocales(); +} pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy