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 97710c79b59c..ef45624c4ed7 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 f69a8e7f66b4..d6295c8df614 100644 --- a/src/Symfony/Component/Translation/DataCollectorTranslator.php +++ b/src/Symfony/Component/Translation/DataCollectorTranslator.php @@ -141,7 +141,7 @@ public function getCollectedMessages() 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 d0b06ff70c19..812136fcd197 100644 --- a/src/Symfony/Component/Translation/LoggingTranslator.php +++ b/src/Symfony/Component/Translation/LoggingTranslator.php @@ -131,7 +131,7 @@ public function __call($method, $args) /** * 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 f171ed93fc81..5be3ef6c7993 100644 --- a/src/Symfony/Component/Translation/Tests/TranslatorTest.php +++ b/src/Symfony/Component/Translation/Tests/TranslatorTest.php @@ -491,6 +491,19 @@ public function testTransChoiceNullLocale() $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 @@ public function getTransTests() ['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 47784bd8af21..f98698d13629 100644 --- a/src/Symfony/Component/Translation/Translator.php +++ b/src/Symfony/Component/Translation/Translator.php @@ -210,11 +210,14 @@ public function getFallbackLocales() */ 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 @@ public function transChoice($id, $number, array $parameters = [], $domain = null { @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 @@ public function transChoice($id, $number, array $parameters = [], $domain = null $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 488b4f4f2397..a8267342a0e8 100644 --- a/src/Symfony/Contracts/Translation/TranslatorTrait.php +++ b/src/Symfony/Contracts/Translation/TranslatorTrait.php @@ -43,7 +43,9 @@ public function getLocale() */ 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);