diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2023-07-10 18:29:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-10 18:29:58 +0200 |
commit | d3f50f28e14eabc317417450c0f932f71a291d38 (patch) | |
tree | c0c3250cb5c6ca625c3999180ed500128770c997 | |
parent | 1b422df12ac8eb26514849fb117e0dcf58623b88 (diff) | |
parent | 81f9d9a690ee540e640865d9e21f53ae8c37c6bf (diff) | |
download | nextcloud-server-d3f50f28e14eabc317417450c0f932f71a291d38.tar.gz nextcloud-server-d3f50f28e14eabc317417450c0f932f71a291d38.zip |
Merge pull request #38953 from nextcloud/backport/38917/stable27
[stable27] fix(l10n): Fix plural issue with different locale and language
-rw-r--r-- | lib/private/L10N/L10N.php | 7 | ||||
-rw-r--r-- | tests/lib/L10N/L10nTest.php | 9 |
2 files changed, 15 insertions, 1 deletions
diff --git a/lib/private/L10N/L10N.php b/lib/private/L10N/L10N.php index d0794c9c9c0..ea4aa0527bb 100644 --- a/lib/private/L10N/L10N.php +++ b/lib/private/L10N/L10N.php @@ -215,7 +215,12 @@ class L10N implements IL10N { public function getIdentityTranslator(): IdentityTranslator { if (\is_null($this->identityTranslator)) { $this->identityTranslator = new IdentityTranslator(); - $this->identityTranslator->setLocale($this->getLocaleCode()); + // We need to use the language code here instead of the locale, + // because Symfony does not distinguish between the two and would + // otherwise e.g. with locale "Czech" and language "German" try to + // pick a non-existing plural rule, because Czech has 4 plural forms + // and German only 2. + $this->identityTranslator->setLocale($this->getLanguageCode()); } return $this->identityTranslator; diff --git a/tests/lib/L10N/L10nTest.php b/tests/lib/L10N/L10nTest.php index f224592432c..67ad5843546 100644 --- a/tests/lib/L10N/L10nTest.php +++ b/tests/lib/L10N/L10nTest.php @@ -85,6 +85,15 @@ class L10nTest extends TestCase { $this->assertEquals('5 oken', (string)$l->n('%n window', '%n windows', 5)); } + public function testGermanPluralWithCzechLocaleTranslations() { + $transFile = \OC::$SERVERROOT.'/tests/data/l10n/de.json'; + $l = new L10N($this->getFactory(), 'test', 'de', 'cs_CZ', [$transFile]); + + $this->assertEquals('1 Datei', (string) $l->n('%n file', '%n files', 1)); + $this->assertEquals('2 Dateien', (string) $l->n('%n file', '%n files', 2)); + $this->assertEquals('5 Dateien', (string) $l->n('%n file', '%n files', 5)); + } + public function dataPlaceholders(): array { return [ ['Ordered placeholders one %s two %s', 'Placeholder one 1 two 2'], |