diff --git a/lib/private/L10N/L10NString.php b/lib/private/L10N/L10NString.php index ef33babac5..0722057de0 100644 --- a/lib/private/L10N/L10NString.php +++ b/lib/private/L10N/L10NString.php @@ -61,10 +61,6 @@ class L10NString implements \JsonSerializable { $translations = $this->l10n->getTranslations(); $identityTranslator = $this->l10n->getIdentityTranslator(); - $parameters = $this->parameters; - // Add $count as %count% as per \Symfony\Contracts\Translation\TranslatorInterface - $parameters['%count%'] = $this->count; - // Use the indexed version as per \Symfony\Contracts\Translation\TranslatorInterface $identity = $this->text; if (array_key_exists($this->text, $translations)) { @@ -84,7 +80,10 @@ class L10NString implements \JsonSerializable { $identity = str_replace('%n', '%count%', $identity); - return $identityTranslator->trans($identity, $parameters); + // $count as %count% as per \Symfony\Contracts\Translation\TranslatorInterface + $text = $identityTranslator->trans($identity, ['%count%' => $this->count]); + + return vsprintf($text, $this->parameters); } diff --git a/tests/data/l10n/de.json b/tests/data/l10n/de.json index c2b6f34c08..d9e75d303c 100644 --- a/tests/data/l10n/de.json +++ b/tests/data/l10n/de.json @@ -1,6 +1,9 @@ { "translations" : { - "_%n file_::_%n files_": ["%n Datei", "%n Dateien"] + "_%n file_::_%n files_": ["%n Datei", "%n Dateien"], + "Ordered placeholders one %s two %s": "Placeholder one %s two %s", + "Reordered placeholders one %s two %s": "Placeholder two %2$s one %1$s", + "Reordered placeholders one %1$s two %2$s": "Placeholder two %2$s one %1$s" }, "pluralForm" : "nplurals=2; plural=(n != 1);" } diff --git a/tests/lib/L10N/L10nTest.php b/tests/lib/L10N/L10nTest.php index 0de09386fb..3fb22b3f66 100644 --- a/tests/lib/L10N/L10nTest.php +++ b/tests/lib/L10N/L10nTest.php @@ -76,6 +76,27 @@ class L10nTest extends TestCase { $this->assertEquals('5 oken', (string)$l->n('%n window', '%n windows', 5)); } + public function dataPlaceholders(): array { + return [ + ['Ordered placeholders one %s two %s', 'Placeholder one 1 two 2'], + ['Reordered placeholders one %s two %s', 'Placeholder two 2 one 1'], + ['Reordered placeholders one %1$s two %2$s', 'Placeholder two 2 one 1'], + ]; + } + + /** + * @dataProvider dataPlaceholders + * + * @param $string + * @param $expected + */ + public function testPlaceholders($string, $expected): void { + $transFile = \OC::$SERVERROOT.'/tests/data/l10n/de.json'; + $l = new L10N($this->getFactory(), 'test', 'de', 'de_AT', [$transFile]); + + $this->assertEquals($expected, $l->t($string, ['1', '2'])); + } + public function localizationData() { return [ // timestamp as string