aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <nickvergessen@gmx.de>2014-12-11 11:33:40 +0100
committerJoas Schilling <nickvergessen@gmx.de>2014-12-11 12:42:21 +0100
commitcbad5c998b260040523ac8e6a2797591d0086938 (patch)
treef53b611ef5fad393979b5f3cc1c39eac3cd0e729
parentb33d8a3d60555de3e6e99a92eed3a303e55a3380 (diff)
downloadnextcloud-server-cbad5c998b260040523ac8e6a2797591d0086938.tar.gz
nextcloud-server-cbad5c998b260040523ac8e6a2797591d0086938.zip
Correctly fallback to english, if the plural case is not translated
-rw-r--r--lib/private/l10n.php2
-rw-r--r--lib/private/l10n/string.php22
-rw-r--r--tests/data/l10n/ru.json3
-rw-r--r--tests/lib/l10n.php18
4 files changed, 41 insertions, 4 deletions
diff --git a/lib/private/l10n.php b/lib/private/l10n.php
index 3c759a9e3a2..6c66bee3e79 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 04eaacab57b..5f5452ad16d 100644
--- a/lib/private/l10n/string.php
+++ b/lib/private/l10n/string.php
@@ -23,6 +23,11 @@ class OC_L10N_String{
protected $parameters;
/**
+ * @var array
+ */
+ protected $plurals;
+
+ /**
* @var integer
*/
protected $count;
@@ -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 177b14a6b20..7041205e761 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 68f43b76f51..2235581add8 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';