diff --git a/core/js/js.js b/core/js/js.js
index 15cf1d286fa9735c56c60adfd475051d51c79882..37540bd15e773699643436a08b388259d2f382a2 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -33,7 +33,7 @@ if (oc_debug !== true || typeof console === "undefined" || typeof console.log ==
  * @return string
  */
 function t(app, text, vars, count){
-	if( !( t.cache[app] )){
+	if( !( t.cache[app] )) {
 		$.ajax(OC.filePath('core','ajax','translations.php'),{
 			async:false,//todo a proper sollution for this without sync ajax calls
 			data:{'app': app},
@@ -49,8 +49,7 @@ function t(app, text, vars, count){
 		}
 	}
 	var _build = function (text, vars, count) {
-		// FIXME: replace %n with content of count
-		return text.replace(/{([^{}]*)}/g,
+		return text.replace(/%n/g, count).replace(/{([^{}]*)}/g,
 			function (a, b) {
 				var r = vars[b];
 				return typeof r === 'string' || typeof r === 'number' ? r : a;
@@ -62,7 +61,7 @@ function t(app, text, vars, count){
 		translation = t.cache[app][text];
 	}
 
-	if(typeof vars === 'object' || typeof count !== 'undefined' ) {
+	if(typeof vars === 'object' || count !== undefined ) {
 		return _build(translation, vars, count);
 	} else {
 		return translation;
@@ -79,8 +78,8 @@ t.cache={};
  * @param vars (optional) FIXME
  * @return string
  */
-function tp(app, text_singular, text_plural, count, vars){
-	if(count==1){
+function n(app, text_singular, text_plural, count, vars){
+	if(count === 1) {
 		return t(app, text_singular, vars, count);
 	}
 	else{
diff --git a/lib/l10n.php b/lib/l10n.php
index 03528c22746e841abeb24b3e292f3604ed105322..8348962cc10132af00ad5fe726a2270561e22ae2 100644
--- a/lib/l10n.php
+++ b/lib/l10n.php
@@ -176,13 +176,28 @@ class OC_L10N{
 	 *
 	 * Returns the translation. If no translation is found, $text will be
 	 * returned. %n will be replaced with the number of objects.
+	 *
+	 * In case there is more than one plural form you can add a function
+	 * "selectplural" in core/l10n/l10n-*.php
+	 *
+	 * Example:
+	 *
+	 *   [...]
+	 *   'selectplural' => function($i){return $i == 1 ? 0 : $i == 2 ? 1 : 2},
+	 *   [...]
 	 */
-	public function tp($text_singular, $text_plural, $count, $parameters = array()) {
-		if($count == 1){
-			return new OC_L10N_String($this, $text_singular, $parameters, $count);
+	public function n($text_singular, $text_plural, $count, $parameters = array()) {
+		$identifier = "_${text_singular}__${text_plural}_";
+		if(array_key_exists( $this->localizations, "selectplural") && array_key_exists($this->translations, $identifier)) {
+			return new OC_L10N_String( $this, $identifier, $parameters, $count );
 		}
 		else{
-			return new OC_L10N_String($this, $text_plural, $parameters, $count);
+			if($count === 1) {
+				return new OC_L10N_String($this, $text_singular, $parameters, $count);
+			}
+			else{
+				return new OC_L10N_String($this, $text_plural, $parameters, $count);
+			}
 		}
 	}
 
@@ -220,6 +235,17 @@ class OC_L10N{
 		return $this->translations;
 	}
 
+	/**
+	 * @brief get localizations
+	 * @returns Fetch all localizations
+	 *
+	 * Returns an associative array with all localizations
+	 */
+	public function getLocalizations() {
+		$this->init();
+		return $this->localizations;
+	}
+
 	/**
 	 * @brief Localization
 	 * @param $type Type of localization
diff --git a/lib/l10n/string.php b/lib/l10n/string.php
index 1bef7330945b4773765826ffd7921ca53458c0ba..3cda5eab50687dd6745257c47ad9106418924e27 100644
--- a/lib/l10n/string.php
+++ b/lib/l10n/string.php
@@ -18,10 +18,17 @@ class OC_L10N_String{
 
 	public function __toString() {
 		$translations = $this->l10n->getTranslations();
+		$localizations = $this->l10n->getLocalizations();
 
 		$text = $this->text;
 		if(array_key_exists($this->text, $translations)) {
-			$text = $translations[$this->text];
+			if(is_array($translations[$this->text])) {
+				$id = $localizations["selectplural"]( $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);