From cbad5c998b260040523ac8e6a2797591d0086938 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 11 Dec 2014 11:33:40 +0100 Subject: [PATCH] Correctly fallback to english, if the plural case is not translated --- lib/private/l10n.php | 2 +- lib/private/l10n/string.php | 22 ++++++++++++++++++++-- tests/data/l10n/ru.json | 3 ++- tests/lib/l10n.php | 18 ++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 3c759a9e3a..6c66bee3e7 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -238,7 +238,7 @@ class OC_L10N implements \OCP\IL10N { $this->init(); $identifier = "_${text_singular}_::_${text_plural}_"; if( array_key_exists($identifier, $this->translations)) { - return new OC_L10N_String( $this, $identifier, $parameters, $count ); + return new OC_L10N_String($this, $identifier, $parameters, $count, array($text_singular, $text_plural)); }else{ if($count === 1) { return new OC_L10N_String($this, $text_singular, $parameters, $count); diff --git a/lib/private/l10n/string.php b/lib/private/l10n/string.php index 04eaacab57..5f5452ad16 100644 --- a/lib/private/l10n/string.php +++ b/lib/private/l10n/string.php @@ -22,6 +22,11 @@ class OC_L10N_String{ */ protected $parameters; + /** + * @var array + */ + protected $plurals; + /** * @var integer */ @@ -30,11 +35,12 @@ class OC_L10N_String{ /** * @param OC_L10N $l10n */ - public function __construct($l10n, $text, $parameters, $count = 1) { + public function __construct($l10n, $text, $parameters, $count = 1, $plurals = array()) { $this->l10n = $l10n; $this->text = $text; $this->parameters = $parameters; $this->count = $count; + $this->plurals = $plurals; } public function __toString() { @@ -45,7 +51,19 @@ class OC_L10N_String{ if(is_array($translations[$this->text])) { $fn = $this->l10n->getPluralFormFunction(); $id = $fn($this->count); - $text = $translations[$this->text][$id]; + + if ($translations[$this->text][$id] !== '') { + // The translation of this plural case is not empty, so use it + $text = $translations[$this->text][$id]; + } else { + // We didn't find the plural in the language, + // so we fall back to english. + $id = ($id != 0) ? 1 : 0; + if (isset($this->plurals[$id])) { + // Fallback to the english plural + $text = $this->plurals[$id]; + } + } } else{ $text = $translations[$this->text]; diff --git a/tests/data/l10n/ru.json b/tests/data/l10n/ru.json index 177b14a6b2..7041205e76 100644 --- a/tests/data/l10n/ru.json +++ b/tests/data/l10n/ru.json @@ -1,6 +1,7 @@ { "translations" : { - "_%n file_::_%n files_" : ["%n файл", "%n файла", "%n файлов"] + "_%n file_::_%n files_" : ["%n файл", "%n файла", "%n файлов"], + "_%n missing plural_::_%n missing plurals_" : ["", "", ""] }, "pluralForm" : "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } diff --git a/tests/lib/l10n.php b/tests/lib/l10n.php index 68f43b76f5..2235581add 100644 --- a/tests/lib/l10n.php +++ b/tests/lib/l10n.php @@ -42,6 +42,24 @@ class Test_L10n extends \Test\TestCase { */ } + public function russianMissingPluralTranslationsData() { + return array( + array(1, '1 missing plural'), + array(2, '2 missing plurals'), + array(6, '6 missing plurals'), + ); + } + + /** + * @dataProvider russianMissingPluralTranslationsData + */ + public function testRussianMissingPluralTranslations($count, $expected) { + $l = new OC_L10N('test'); + $l->load(OC::$SERVERROOT.'/tests/data/l10n/ru.json'); + + $this->assertEquals($expected, (string)$l->n('%n missing plural', '%n missing plurals', $count)); + } + public function testCzechPluralTranslations() { $l = new OC_L10N('test'); $transFile = OC::$SERVERROOT.'/tests/data/l10n/cs.json';