diff --git a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig index 97710c79b5..ef45624c4e 100644 --- a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig +++ b/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig @@ -124,7 +124,7 @@ {{- block('form_widget_simple') -}} {%- set label_attr = label_attr|merge({ class: (label_attr.class|default('') ~ ' custom-file-label')|trim }) -%} diff --git a/src/Symfony/Component/Translation/DataCollectorTranslator.php b/src/Symfony/Component/Translation/DataCollectorTranslator.php index f69a8e7f66..d6295c8df6 100644 --- a/src/Symfony/Component/Translation/DataCollectorTranslator.php +++ b/src/Symfony/Component/Translation/DataCollectorTranslator.php @@ -141,7 +141,7 @@ class DataCollectorTranslator implements LegacyTranslatorInterface, TranslatorIn return $this->messages; } - private function collectMessage(?string $locale, ?string $domain, string $id, string $translation, ?array $parameters = []) + private function collectMessage(?string $locale, ?string $domain, ?string $id, string $translation, ?array $parameters = []) { if (null === $domain) { $domain = 'messages'; diff --git a/src/Symfony/Component/Translation/LoggingTranslator.php b/src/Symfony/Component/Translation/LoggingTranslator.php index d0b06ff70c..812136fcd1 100644 --- a/src/Symfony/Component/Translation/LoggingTranslator.php +++ b/src/Symfony/Component/Translation/LoggingTranslator.php @@ -131,7 +131,7 @@ class LoggingTranslator implements TranslatorInterface, LegacyTranslatorInterfac /** * Logs for missing translations. */ - private function log(string $id, ?string $domain, ?string $locale) + private function log(?string $id, ?string $domain, ?string $locale) { if (null === $domain) { $domain = 'messages'; diff --git a/src/Symfony/Component/Translation/Tests/TranslatorTest.php b/src/Symfony/Component/Translation/Tests/TranslatorTest.php index f171ed93fc..5be3ef6c79 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -491,6 +491,19 @@ class TranslatorTest extends TestCase $this->addToAssertionCount(1); } + public function testTransNullId() + { + $translator = new Translator('en'); + $translator->addLoader('array', new ArrayLoader()); + $translator->addResource('array', ['foo' => 'foofoo'], 'en'); + + $this->assertSame('', $translator->trans(null)); + + (\Closure::bind(function () use ($translator) { + $this->assertSame([], $translator->catalogues); + }, $this, Translator::class))(); + } + public function getTransFileTests() { return [ @@ -512,6 +525,7 @@ class TranslatorTest extends TestCase ['Symfony est super !', 'Symfony is great!', 'Symfony est super !', [], 'fr', ''], ['Symfony est awesome !', 'Symfony is %what%!', 'Symfony est %what% !', ['%what%' => 'awesome'], 'fr', ''], ['Symfony est super !', new StringClass('Symfony is great!'), 'Symfony est super !', [], 'fr', ''], + ['', null, '', [], 'fr', ''], ]; } diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Component/Translation/Translator.php index 47784bd8af..f98698d136 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -210,11 +210,14 @@ class Translator implements LegacyTranslatorInterface, TranslatorInterface, Tran */ public function trans($id, array $parameters = [], $domain = null, $locale = null) { + if ('' === $id = (string) $id) { + return ''; + } + if (null === $domain) { $domain = 'messages'; } - $id = (string) $id; $catalogue = $this->getCatalogue($locale); $locale = $catalogue->getLocale(); while (!$catalogue->defines($id, $domain)) { @@ -242,6 +245,10 @@ class Translator implements LegacyTranslatorInterface, TranslatorInterface, Tran { @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the trans() one instead with a "%%count%%" parameter.', __METHOD__), E_USER_DEPRECATED); + if ('' === $id = (string) $id) { + return ''; + } + if (!$this->formatter instanceof ChoiceMessageFormatterInterface) { throw new LogicException(sprintf('The formatter "%s" does not support plural translations.', \get_class($this->formatter))); } @@ -250,7 +257,6 @@ class Translator implements LegacyTranslatorInterface, TranslatorInterface, Tran $domain = 'messages'; } - $id = (string) $id; $catalogue = $this->getCatalogue($locale); $locale = $catalogue->getLocale(); while (!$catalogue->defines($id, $domain)) { diff --git a/src/Symfony/Contracts/Translation/TranslatorTrait.php b/src/Symfony/Contracts/Translation/TranslatorTrait.php index 488b4f4f23..a8267342a0 100644 --- a/src/Symfony/Contracts/Translation/TranslatorTrait.php +++ b/src/Symfony/Contracts/Translation/TranslatorTrait.php @@ -43,7 +43,9 @@ trait TranslatorTrait */ public function trans($id, array $parameters = [], $domain = null, $locale = null) { - $id = (string) $id; + if ('' === $id = (string) $id) { + return ''; + } if (!isset($parameters['%count%']) || !is_numeric($parameters['%count%'])) { return strtr($id, $parameters);