Skip to content
Snippets Groups Projects
Commit e04bf0aa authored by Thomas Müller's avatar Thomas Müller
Browse files

unit tests for plural translations added

parent 550b647d
No related branches found
No related tags found
No related merge requests found
......@@ -25,7 +25,7 @@
/**
* This class is for i18n and l10n
*/
class OC_L10N{
class OC_L10N {
/**
* cached instances
*/
......@@ -107,6 +107,17 @@ class OC_L10N{
$this->lang = $lang;
}
public function load($transFile) {
$this->app = true;
include $transFile;
if(isset($TRANSLATIONS) && is_array($TRANSLATIONS)) {
$this->translations = $TRANSLATIONS;
}
if(isset($PLURAL_FORMS)) {
$this->plural_form_string = $PLURAL_FORMS;
}
}
protected function init() {
if ($this->app === true) {
return;
......@@ -258,8 +269,9 @@ class OC_L10N{
*
*/
public function n($text_singular, $text_plural, $count, $parameters = array()) {
$this->init();
$identifier = "_${text_singular}__${text_plural}_";
if( array_key_exists($this->translations, $identifier)) {
if( array_key_exists($identifier, $this->translations)) {
return new OC_L10N_String( $this, $identifier, $parameters, $count );
}
else{
......
......@@ -7,30 +7,48 @@
*/
class OC_L10N_String{
/**
* @var OC_L10N
*/
protected $l10n;
/**
* @var string
*/
protected $text;
/**
* @var array
*/
protected $parameters;
/**
* @var integer
*/
protected $count;
public function __construct($l10n, $text, $parameters, $count = 1) {
$this->l10n = $l10n;
$this->text = $text;
$this->parameters = $parameters;
$this->count = $count;
}
public function __toString() {
$translations = $this->l10n->getTranslations();
$localizations = $this->l10n->getLocalizations();
$text = $this->text;
if(array_key_exists($this->text, $translations)) {
if(is_array($translations[$this->text])) {
$fn = $l10n->getPluralFormFunction();
$id = $fn($count);
$fn = $this->l10n->getPluralFormFunction();
$id = $fn($this->count);
$text = $translations[$this->text][$id];
}
else{
$text = $translations[$this->text];
}
}
// Replace %n first (won't interfere with vsprintf)
$text = str_replace('%n', $this->count, $text);
return vsprintf($text, $this->parameters);
......
<?php
$TRANSLATIONS = array(
"_%n window__%n windows_" => array("%n okno", "%n okna", "%n oken")
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
<?php
$TRANSLATIONS = array(
"_%n file__%n files_" => array("%n Datei", "%n Dateien")
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
<?php
$TRANSLATIONS = array(
"_%n file__%n files_" => array("%n файл", "%n файла", "%n файлов")
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
<?php
/**
* Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
class Test_L10n extends PHPUnit_Framework_TestCase {
public function testGermanPluralTranslations() {
$l = new OC_L10N('test');
$transFile = OC::$SERVERROOT.'/tests/data/l10n/de.php';
$l->load($transFile);
$this->assertEquals('1 Datei', (string)$l->n('%n file', '%n files', 1, array(1)));
$this->assertEquals('2 Dateien', (string)$l->n('%n file', '%n files', 2, array(2)));
}
public function testRussianPluralTranslations() {
$l = new OC_L10N('test');
$transFile = OC::$SERVERROOT.'/tests/data/l10n/ru.php';
$l->load($transFile);
$this->assertEquals('1 файл', (string)$l->n('%n file', '%n files', 1));
$this->assertEquals('2 файла', (string)$l->n('%n file', '%n files', 2));
$this->assertEquals('6 файлов', (string)$l->n('%n file', '%n files', 6));
$this->assertEquals('21 файл', (string)$l->n('%n file', '%n files', 21));
$this->assertEquals('22 файла', (string)$l->n('%n file', '%n files', 22));
$this->assertEquals('26 файлов', (string)$l->n('%n file', '%n files', 26));
/*
1 file 1 файл 1 папка
2-4 files 2-4 файла 2-4 папки
5-20 files 5-20 файлов 5-20 папок
21 files 21 файл 21 папка
22-24 files 22-24 файла 22-24 папки
25-30 files 25-30 файлов 25-30 папок
etc
100 files 100 файлов, 100 папок
1000 files 1000 файлов 1000 папок
*/
}
public function testCzechPluralTranslations() {
$l = new OC_L10N('test');
$transFile = OC::$SERVERROOT.'/tests/data/l10n/cs.php';
$l->load($transFile);
$this->assertEquals('1 okno', (string)$l->n('%n window', '%n windows', 1));
$this->assertEquals('2 okna', (string)$l->n('%n window', '%n windows', 2));
$this->assertEquals('5 oken', (string)$l->n('%n window', '%n windows', 5));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment