From 2367797c17aafe0f0570477ff653894f3033e97c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas.mueller@tmit.eu>
Date: Tue, 24 Feb 2015 17:42:26 +0100
Subject: [PATCH] Respect http header 'Accept-Language' on ocs and remote.php
 calls

---
 lib/private/l10n.php | 78 ++++++++++++++++++++++++--------------------
 ocs/v1.php           |  4 +--
 remote.php           |  3 ++
 3 files changed, 48 insertions(+), 37 deletions(-)

diff --git a/lib/private/l10n.php b/lib/private/l10n.php
index 4e9316c333e..4fd4a617be8 100644
--- a/lib/private/l10n.php
+++ b/lib/private/l10n.php
@@ -79,6 +79,48 @@ class OC_L10N implements \OCP\IL10N {
 		$this->lang = $lang;
 	}
 
+	/**
+	 * @param $app
+	 * @return string
+	 */
+	public static function setLanguageFromRequest($app = null) {
+		if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+			if (is_array($app)) {
+				$available = $app;
+			} else {
+				$available = self::findAvailableLanguages($app);
+			}
+
+			// E.g. make sure that 'de' is before 'de_DE'.
+			sort($available);
+
+			$preferences = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
+			foreach ($preferences as $preference) {
+				list($preferred_language) = explode(';', $preference);
+				$preferred_language = str_replace('-', '_', $preferred_language);
+				foreach ($available as $available_language) {
+					if ($preferred_language === strtolower($available_language)) {
+						if (is_null($app)) {
+							self::$language = $available_language;
+						}
+						return $available_language;
+					}
+				}
+				foreach ($available as $available_language) {
+					if (substr($preferred_language, 0, 2) === $available_language) {
+						if (is_null($app)) {
+							self::$language = $available_language;
+						}
+						return $available_language;
+					}
+				}
+			}
+		}
+
+		// Last try: English
+		return 'en';
+	}
+
 	/**
 	 * @param $transFile
 	 * @param bool $mergeTranslations
@@ -403,41 +445,7 @@ class OC_L10N implements \OCP\IL10N {
 			return $default_language;
 		}
 
-		if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
-			if(is_array($app)) {
-				$available = $app;
-			} else {
-				$available = self::findAvailableLanguages($app);
-			}
-
-			// E.g. make sure that 'de' is before 'de_DE'.
-			sort($available);
-
-			$preferences = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
-			foreach($preferences as $preference) {
-				list($preferred_language) = explode(';', $preference);
-				$preferred_language = str_replace('-', '_', $preferred_language);
-				foreach($available as $available_language) {
-					if ($preferred_language === strtolower($available_language)) {
-						if (is_null($app)) {
-							self::$language = $available_language;
-						}
-						return $available_language;
-					}
-				}
-				foreach($available as $available_language) {
-					if (substr($preferred_language, 0, 2) === $available_language) {
-						if (is_null($app)) {
-							self::$language = $available_language;
-						}
-						return $available_language;
-					}
-				}
-			}
-		}
-
-		// Last try: English
-		return 'en';
+		return self::setLanguageFromRequest($app);
 	}
 
 	/**
diff --git a/ocs/v1.php b/ocs/v1.php
index b0f3e5e2b90..86631f39686 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -39,8 +39,8 @@ try {
 	// load all apps to get all api routes properly setup
 	OC_App::loadApps();
 
-	// api calls always will return English
-	\OC_L10N::forceLanguage('en');
+	// force language as given in the http request
+	\OC_L10N::setLanguageFromRequest();
 
 	OC::$server->getRouter()->match('/ocs'.\OC::$server->getRequest()->getRawPathInfo());
 } catch (ResourceNotFoundException $e) {
diff --git a/remote.php b/remote.php
index 80173441e90..101b19a807d 100644
--- a/remote.php
+++ b/remote.php
@@ -29,6 +29,9 @@ try {
 		exit;
 	}
 
+	// force language as given in the http request
+	\OC_L10N::setLanguageFromRequest();
+
 	$file=ltrim($file, '/');
 
 	$parts=explode('/', $file, 2);
-- 
GitLab