8000 [Translator] Fix translator overlapse · symfony/symfony@99ca5f9 · GitHub
[go: up one dir, main page]

Skip to content

Commit 99ca5f9

Browse files
Xavier RENAUDINnicolas-grekas
Xavier RENAUDIN
authored andcommitted
[Translator] Fix translator overlapse
1 parent 0971ff5 commit 99ca5f9

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

src/Symfony/Component/Translation/MessageCatalogue.php

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -159,19 +159,14 @@ public function replace($messages, $domain = 'messages')
159159
*/
160160
public function add($messages, $domain = 'messages')
161161
{
162-
if (!isset($this->messages[$domain])) {
163-
$this->messages[$domain] = [];
164-
}
165-
$intlDomain = $domain;
166-
if (!str_ends_with($domain, self::INTL_DOMAIN_SUFFIX)) {
167-
$intlDomain .= self::INTL_DOMAIN_SUFFIX;
168-
}
162+
$altDomain = str_ends_with($domain, self::INTL_DOMAIN_SUFFIX) ? substr($domain, 0, -\strlen(self::INTL_DOMAIN_SUFFIX)) : $domain.self::INTL_DOMAIN_SUFFIX;
169163
foreach ($messages as $id => $message) {
170-
if (isset($this->messages[$intlDomain]) && \array_key_exists($id, $this->messages[$intlDomain])) {
171-
$this->messages[$intlDomain][$id] = $message;
172-
} else {
173-
$this->messages[$domain][$id] = $message;
174-
}
164+
unset($this->messages[$altDomain][$id]);
165+
$this->messages[$domain][$id] = $message;
166+
}
167+
168+
if ([] === ($this->messages[$altDomain] ?? null)) {
169+
unset($this->messages[$altDomain]);
175170
}
176171
}
177172

src/Symfony/Component/Translation/Tests/TranslatorTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
use Symfony\Component\Translation\Exception\InvalidArgumentException;
1616
use Symfony\Component\Translation\Exception\NotFoundResourceException;
1717
use Symfony\Component\Translation\Exception\RuntimeException;
18+
use Symfony\Component\Translation\Formatter\IntlFormatter;
19+
use Symfony\Component\Translation\Formatter\IntlFormatterInterface;
20+
use Symfony\Component\Translation\Formatter\MessageFormatter;
21+
use Symfony\Component\Translation\Formatter\MessageFormatterInterface;
1822
use Symfony\Component\Translation\Loader\ArrayLoader;
1923
use Symfony\Component\Translation\MessageCatalogue;
2024
use Symfony\Component\Translation\Translator;
@@ -683,6 +687,26 @@ public function testIntlFormattedDomain()
683687
$this->assertSame('Hi Bob', $translator->trans('some_message', ['%name%' => 'Bob']));
684688
}
685689

690+
public function testIntlDomainOverlapseWithIntlResourceBefore()
691+
{
692+
$intlFormatterMock = $this->createMock(IntlFormatterInterface::class);
693+
$intlFormatterMock->expects($this->once())->method('formatIntl')->with('hello intl', 'en', [])->willReturn('hello intl');
694+
695+
$messageFormatter = new MessageFormatter(null, $intlFormatterMock);
696+
697+
$translator = new Translator('en', $messageFormatter);
698+
$translator->addLoader('array', new ArrayLoader());
699+
700+
$translator->addResource('array', ['some_message' => 'hello intl'], 'en', 'messages+intl-icu');
701+
$translator->addResource('array', ['some_message' => 'hello'], 'en', 'messages');
702+
703+
$this->assertSame('hello', $translator->trans('some_message', [], 'messages'));
704+
705+
$translator->addResource('array', ['some_message' => 'hello intl'], 'en', 'messages+intl-icu');
706+
707+
$this->assertSame('hello intl', $translator->trans('some_message', [], 'messages'));
708+
}
709+
686710
/**
687711
* @group legacy
688712
*/

0 commit comments

Comments
 (0)
0