From 9d1b425b62af0dc56af473d853d39182a7597a6c Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 12:25:48 +0200 Subject: [PATCH 1/8] Correct indentation for default language. --- lib/private/l10n.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 3e84c306dc..38efa88388 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -447,11 +447,11 @@ class OC_L10N implements \OCP\IL10N { } } - $default_language = OC_Config::getValue('default_language', false); + $default_language = OC_Config::getValue('default_language', false); - if($default_language !== false) { - return $default_language; - } + if($default_language !== false) { + return $default_language; + } if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $accepted_languages = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); From 207f6d55ce5047e43f7250ef30b14525dee6bd65 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 12:39:12 +0200 Subject: [PATCH 2/8] Fix coding style for else. --- lib/private/l10n.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 38efa88388..99481404f6 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -438,8 +438,7 @@ class OC_L10N implements \OCP\IL10N { if(is_array($app)) { $available = $app; $lang_exists = array_search($lang, $available) !== false; - } - else { + } else { $lang_exists = self::languageExists($app, $lang); } if($lang_exists) { @@ -457,8 +456,7 @@ class OC_L10N implements \OCP\IL10N { $accepted_languages = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); if(is_array($app)) { $available = $app; - } - else{ + } else { $available = self::findAvailableLanguages($app); } foreach($accepted_languages as $i) { From 4c76dd38719f28d6c995047e2ac6154ec20c2ad5 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 12:56:51 +0200 Subject: [PATCH 3/8] Better variable names. --- lib/private/l10n.php | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 99481404f6..9f89f0d03e 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -453,27 +453,27 @@ class OC_L10N implements \OCP\IL10N { } if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $accepted_languages = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); if(is_array($app)) { $available = $app; } else { $available = self::findAvailableLanguages($app); } - foreach($accepted_languages as $i) { - $temp = explode(';', $i); - $temp[0] = str_replace('-', '_', $temp[0]); - if( ($key = array_search($temp[0], $available)) !== false) { + $preferences = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); + foreach($preferences as $preference) { + list($prefered_language) = explode(';', $preference); + $prefered_language = str_replace('-', '_', $prefered_language); + if( ($key = array_search($prefered_language, $available)) !== false) { if (is_null($app)) { self::$language = $available[$key]; } return $available[$key]; } - foreach($available as $l) { - if ( $temp[0] == substr($l, 0, 2) ) { + foreach($available as $available_language) { + if ($prefered_language == substr($available_language, 0, 2)) { if (is_null($app)) { - self::$language = $l; + self::$language = $available_language; } - return $l; + return $available_language; } } } From c14b470ea24258b0402ad8ee783646d23c6693b9 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 15:38:22 +0200 Subject: [PATCH 4/8] Apply substring on the correct value. --- lib/private/l10n.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 9f89f0d03e..62827312d3 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -469,7 +469,7 @@ class OC_L10N implements \OCP\IL10N { return $available[$key]; } foreach($available as $available_language) { - if ($prefered_language == substr($available_language, 0, 2)) { + if (substr($prefered_language, 0, 2) === $available_language) { if (is_null($app)) { self::$language = $available_language; } From daf93c45165ac2c73fc1f0d6af513b8c3e497691 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 15:38:54 +0200 Subject: [PATCH 5/8] Sort, so 'de' is preferred over 'de_DE' when performing non-exact matching. --- lib/private/l10n.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 62827312d3..9392cfac05 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -458,6 +458,10 @@ class OC_L10N implements \OCP\IL10N { } 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($prefered_language) = explode(';', $preference); From 06f2ae082eb6fc04b1c6680bd2f35ca1c2032d59 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 15:39:50 +0200 Subject: [PATCH 6/8] Have to also strtolower() on available language name. Otherwise no match. --- lib/private/l10n.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 9392cfac05..0125dca92e 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -466,11 +466,13 @@ class OC_L10N implements \OCP\IL10N { foreach($preferences as $preference) { list($prefered_language) = explode(';', $preference); $prefered_language = str_replace('-', '_', $prefered_language); - if( ($key = array_search($prefered_language, $available)) !== false) { - if (is_null($app)) { - self::$language = $available[$key]; + foreach($available as $available_language) { + if ($prefered_language === strtolower($available_language)) { + if (is_null($app)) { + self::$language = $available_language; + } + return $available_language; } - return $available[$key]; } foreach($available as $available_language) { if (substr($prefered_language, 0, 2) === $available_language) { From 8166aaf82c1e96090e32eb2d8479bd150c12d166 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 23 Oct 2013 15:41:15 +0200 Subject: [PATCH 7/8] Some tests for OC_L10N::findLanguage() --- tests/lib/l10n.php | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/lib/l10n.php b/tests/lib/l10n.php index 12eac818f8..5ddf2290c3 100644 --- a/tests/lib/l10n.php +++ b/tests/lib/l10n.php @@ -64,4 +64,45 @@ class Test_L10n extends PHPUnit_Framework_TestCase { $l = new OC_L10N('test'); $this->assertSame('February 13, 2009 23:31', $l->l('datetime', 1234567890)); } + + /** + * @dataProvider findLanguageData + */ + public function testFindLanguage($default, $preference, $expected) { + OC_User::setUserId(null); + if (is_null($default)) { + OC_Config::deleteKey('default_language'); + } else { + OC_Config::setValue('default_language', $default); + } + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $preference; + + $reflection = new \ReflectionClass('OC_L10N'); + $prop = $reflection->getProperty('language'); + $prop->setAccessible(1); + $prop->setValue(''); + $prop->setAccessible(0); + + $this->assertSame($expected, OC_L10N::findLanguage()); + } + + public function findLanguageData() { + return array( + // Exact match + array(null, 'de-DE,en;q=0.5', 'de_DE'), + array(null, 'de-DE,en-US;q=0.8,en;q=0.6', 'de_DE'), + + // Best match + array(null, 'de-US,en;q=0.5', 'de'), + array(null, 'de-US,en-US;q=0.8,en;q=0.6', 'de'), + + // The default_language config setting overrides browser preferences. + array('es_AR', 'de-DE,en;q=0.5', 'es_AR'), + array('es_AR', 'de-DE,en-US;q=0.8,en;q=0.6', 'es_AR'), + + // Worst case default to english + array(null, '', 'en'), + array(null, null, 'en'), + ); + } } From 54e0f1d739b4b3820cafafca039a3524d3dd28ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 23 Oct 2013 19:06:36 +0200 Subject: [PATCH 8/8] fixing PHPDoc & grammar --- lib/private/l10n.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 0125dca92e..2d44085045 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -419,7 +419,7 @@ class OC_L10N implements \OCP\IL10N { /** * @brief find the best language * @param $app Array or string, details below - * @returns language + * @returns string language * * If $app is an array, ownCloud assumes that these are the available * languages. Otherwise ownCloud tries to find the files in the l10n @@ -464,10 +464,10 @@ class OC_L10N implements \OCP\IL10N { $preferences = preg_split('/,\s*/', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE'])); foreach($preferences as $preference) { - list($prefered_language) = explode(';', $preference); - $prefered_language = str_replace('-', '_', $prefered_language); + list($preferred_language) = explode(';', $preference); + $preferred_language = str_replace('-', '_', $preferred_language); foreach($available as $available_language) { - if ($prefered_language === strtolower($available_language)) { + if ($preferred_language === strtolower($available_language)) { if (is_null($app)) { self::$language = $available_language; } @@ -475,7 +475,7 @@ class OC_L10N implements \OCP\IL10N { } } foreach($available as $available_language) { - if (substr($prefered_language, 0, 2) === $available_language) { + if (substr($preferred_language, 0, 2) === $available_language) { if (is_null($app)) { self::$language = $available_language; }