/**
* This class is for i18n and l10n
*/
-class OC_L10N{
+class OC_L10N {
/**
* cached instances
*/
$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;
*
*/
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{
*/
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);
--- /dev/null
+<?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));
+ }
+
+}