diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index bc5dfa17c1..6da6bc87ed 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -1275,7 +1275,18 @@ class Request return $locales[0]; } - $preferredLanguages = array_values(array_intersect($preferredLanguages, $locales)); + $extendedPreferredLanguages = array(); + foreach ($preferredLanguages as $language) { + $extendedPreferredLanguages[] = $language; + if (false !== $position = strpos($language, '_')) { + $superLanguage = substr($language, 0, $position); + if (!in_array($superLanguage, $preferredLanguages)) { + $extendedPreferredLanguages[] = $superLanguage; + } + } + } + + $preferredLanguages = array_values(array_intersect($extendedPreferredLanguages, $locales)); return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0]; } @@ -1309,11 +1320,6 @@ class Request for ($i = 0, $max = count($codes); $i < $max; $i++) { if ($i == 0) { $lang = strtolower($codes[0]); - // First segment of compound language codes - // is added to supported languages list - if (!in_array($lang, $this->languages)) { - $this->languages[] = $lang; - } } else { $lang .= '_'.strtoupper($codes[$i]); } @@ -1321,9 +1327,7 @@ class Request } } - if (!in_array($lang, $this->languages)) { - $this->languages[] = $lang; - } + $this->languages[] = $lang; } return $this->languages; diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php index b4a43fc1f2..38ae748da6 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php @@ -881,6 +881,14 @@ class RequestTest extends \PHPUnit_Framework_TestCase $request = new Request(); $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6'); $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en'))); + + $request = new Request(); + $request->headers->set('Accept-language', 'zh, en-us; q=0.8'); + $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en'))); + + $request = new Request(); + $request->headers->set('Accept-language', 'zh, en-us; q=0.8, fr-fr; q=0.6, fr; q=0.5'); + $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en'))); } public function testIsXmlHttpRequest() @@ -951,8 +959,8 @@ class RequestTest extends \PHPUnit_Framework_TestCase $request = new Request(); $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6'); - $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); - $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); + $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages()); + $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages()); $request = new Request(); $request->headers->set('Accept-language', 'zh, en-us; q=0.6, en; q=0.8'); @@ -969,10 +977,6 @@ class RequestTest extends \PHPUnit_Framework_TestCase $request = new Request(); $request->headers->set('Accept-language', 'zh, i-cherokee; q=0.6'); $this->assertEquals(array('zh', 'cherokee'), $request->getLanguages()); - - $request = new Request(); - $request->headers->set('Accept-language', 'en-us'); - $this->assertEquals(array('en', 'en_US'), $request->getLanguages()); } public function testGetRequestFormat()