Skip to content

Commit c4036fe

Browse files
committed
Added language detection class
1 parent 969fe09 commit c4036fe

File tree

9 files changed

+172
-77
lines changed

9 files changed

+172
-77
lines changed

src/Browser/AcceptLanguage.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
namespace Browser;
3+
4+
class AcceptLanguage
5+
{
6+
/**
7+
* @var string
8+
*/
9+
private $acceptLanguageString;
10+
11+
/**
12+
* @param string $acceptLanguageString
13+
*/
14+
public function __construct($acceptLanguageString = null)
15+
{
16+
if (null !== $acceptLanguageString) {
17+
$this->setAcceptLanguageString($acceptLanguageString);
18+
}
19+
}
20+
21+
/**
22+
* @param string $acceptLanguageString
23+
* @return $this
24+
*/
25+
public function setAcceptLanguageString($acceptLanguageString)
26+
{
27+
$this->acceptLanguageString = $acceptLanguageString;
28+
return $this;
29+
}
30+
31+
/**
32+
* @return string
33+
*/
34+
public function getAcceptLanguageString()
35+
{
36+
if (null === $this->acceptLanguageString) {
37+
$this->createAcceptLanguageString();
38+
}
39+
return $this->acceptLanguageString;
40+
}
41+
42+
/**
43+
* @return string
44+
*/
45+
public function createAcceptLanguageString()
46+
{
47+
$acceptLanguageString = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : null;
48+
$this->setAcceptLanguageString($acceptLanguageString);
49+
return $acceptLanguageString;
50+
}
51+
}

src/Browser/Browser.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?php
2-
32
namespace Browser;
43

54
/**

src/Browser/Language.php

Lines changed: 53 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,78 @@
11
<?php
2-
32
namespace Browser;
43

4+
use InvalidArgumentException;
5+
56
/**
67
* Language Detection
78
*
89
* @package browser
910
*/
1011
class Language
1112
{
12-
private static $acceptLanguage;
13-
private static $languages;
14-
1513
/**
16-
* Detect a user's languages and order them by priority
14+
* @var AcceptLanguage
1715
*/
18-
private static function checkLanguages()
19-
{
20-
$acceptLanguage = self::getAcceptLanguage();
21-
self::$languages = array();
22-
23-
if (!empty($acceptLanguage)) {
24-
$httpLanguages = preg_split('/q=([\d\.]*)/', $acceptLanguage, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
25-
26-
$languages = array();
27-
$key = 0;
28-
foreach (array_reverse($httpLanguages) as $value) {
29-
$value = trim($value, ',; .');
30-
if (is_numeric($value)) {
31-
$key = $value;
32-
} else {
33-
$languages[$key] = explode(',', $value);
34-
}
35-
}
36-
krsort($languages);
37-
38-
foreach ($languages as $value) {
39-
self::$languages = array_merge(self::$languages, $value);
40-
}
41-
}
42-
}
16+
private $acceptLanguage;
4317

4418
/**
45-
* Get the accept language value in use to determine the language.
46-
*
47-
* @return string
19+
* @var array
4820
*/
49-
public static function getAcceptLanguage()
50-
{
51-
if (!isset(self::$acceptLanguage)) {
52-
self::setAcceptLanguage(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : "");
53-
}
54-
55-
return self::$acceptLanguage;
56-
}
21+
private $languages;
5722

5823
/**
59-
* Set the accept language value in use to determine the browser.
60-
*
61-
* @param string $acceptLanguage
24+
* @param null|string|AcceptLanguage $acceptLanguage
25+
* @throws InvalidArgumentException
6226
*/
63-
public static function setAcceptLanguage($acceptLanguage)
27+
public function __construct($acceptLanguage = null)
6428
{
65-
self::$acceptLanguage = $acceptLanguage;
29+
if ($acceptLanguage instanceof AcceptLanguage) {
30+
$this->setAcceptLanguage($acceptLanguage);
31+
} elseif (null === $acceptLanguage || is_string($acceptLanguage)) {
32+
$this->setAcceptLanguage(new AcceptLanguage($acceptLanguage));
33+
} else {
34+
throw new InvalidArgumentException;
35+
}
6636
}
6737

6838
/**
6939
* Get all user's languages
7040
*
7141
* @return array
7242
*/
73-
public static function getLanguages()
43+
public function getLanguages()
7444
{
75-
if (!is_array(self::$languages)) {
76-
self::checkLanguages();
45+
if (!is_array($this->languages)) {
46+
LanguageDetection::detect($this, $this->getAcceptLanguage());
7747
}
7848

79-
return self::$languages;
49+
return $this->languages;
8050
}
8151

8252
/**
8353
* Set languages.
8454
*
85-
* @param string $value
55+
* @param string $languages
56+
* @return $this
8657
*/
87-
public static function setLanguages($value)
58+
public function setLanguages($languages)
8859
{
89-
self::$languages = $value;
60+
$this->languages = $languages;
61+
return $this;
9062
}
9163

9264
/**
9365
* Get a user's language
9466
*
9567
* @return string
9668
*/
97-
public static function getLanguage()
69+
public function getLanguage()
9870
{
99-
if (!is_array(self::$languages)) {
100-
self::checkLanguages();
71+
if (!is_array($this->languages)) {
72+
LanguageDetection::detect($this, $this->getAcceptLanguage());
10173
}
10274

103-
return strtolower(substr(reset(self::$languages), 0, 2));
75+
return strtolower(substr(reset($this->languages), 0, 2));
10476
}
10577

10678
/**
@@ -109,14 +81,14 @@ public static function getLanguage()
10981
* @param string $separator
11082
* @return string
11183
*/
112-
public static function getLanguageLocale($separator = '-')
84+
public function getLanguageLocale($separator = '-')
11385
{
114-
if (!is_array(self::$languages)) {
115-
self::checkLanguages();
86+
if (!is_array($this->languages)) {
87+
LanguageDetection::detect($this, $this->getAcceptLanguage());
11688
}
11789

118-
$userLanguage = self::getLanguage();
119-
foreach (self::$languages as $language) {
90+
$userLanguage = $this->getLanguage();
91+
foreach ($this->languages as $language) {
12092
if (strlen($language) === 5 && strpos($language, $userLanguage) === 0) {
12193
$locale = substr($language, -2);
12294
break;
@@ -129,4 +101,22 @@ public static function getLanguageLocale($separator = '-')
129101
return $userLanguage;
130102
}
131103
}
132-
}
104+
105+
/**
106+
* @param AcceptLanguage $acceptLanguage
107+
* @return $this
108+
*/
109+
public function setAcceptLanguage(AcceptLanguage $acceptLanguage)
110+
{
111+
$this->acceptLanguage = $acceptLanguage;
112+
return $this;
113+
}
114+
115+
/**
116+
* @return AcceptLanguage
117+
*/
118+
public function getAcceptLanguage()
119+
{
120+
return $this->acceptLanguage;
121+
}
122+
}

src/Browser/LanguageDetection.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
namespace Browser;
3+
4+
class LanguageDetection
5+
{
6+
/**
7+
* Detect a user's languages and order them by priority
8+
*
9+
* @param Language $language
10+
* @param AcceptLanguage $acceptLanguage
11+
* @return bool
12+
*/
13+
public static function detect(Language $language, AcceptLanguage $acceptLanguage)
14+
{
15+
$acceptLanguageString = $acceptLanguage->getAcceptLanguageString();
16+
$languages = array();
17+
$language->setLanguages($languages);
18+
19+
if (!empty($acceptLanguageString)) {
20+
$httpLanguages = preg_split('/q=([\d\.]*)/', $acceptLanguageString, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
21+
22+
$key = 0;
23+
foreach (array_reverse($httpLanguages) as $value) {
24+
$value = trim($value, ',; .');
25+
if (is_numeric($value)) {
26+
$key = $value;
27+
} else {
28+
$languages[$key] = explode(',', $value);
29+
}
30+
}
31+
krsort($languages);
32+
33+
foreach ($languages as $value) {
34+
$language->setLanguages(array_merge($language->getLanguages(), $value));
35+
}
36+
}
37+
}
38+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
namespace Browser\Tests;
3+
4+
use Browser\AcceptLanguage;
5+
use PHPUnit_Framework_TestCase;
6+
7+
class AcceptLanguageTest extends PHPUnit_Framework_TestCase
8+
{
9+
public function testObject()
10+
{
11+
$acceptLanguage = new AcceptLanguage;
12+
$this->assertNull($acceptLanguage->getAcceptLanguageString());
13+
14+
$acceptLanguage = new AcceptLanguage('my_accept_language_string');
15+
$this->assertEquals('my_accept_language_string', $acceptLanguage->getAcceptLanguageString());
16+
17+
$acceptLanguage->setAcceptLanguageString('my_new_accept_language_string');
18+
$this->assertEquals('my_new_accept_language_string', $acceptLanguage->getAcceptLanguageString());
19+
}
20+
}

test/Browser/Tests/BrowserTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?php
2-
32
namespace Browser\Tests;
43

54
use Browser\Browser;
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
<?php
2-
32
namespace Browser\Tests;
43

5-
use Browser;
4+
use Browser\Language;
65
use PHPUnit_Framework_TestCase;
76

87
class LanguageTest extends PHPUnit_Framework_TestCase
98
{
9+
/**
10+
* @var Language
11+
*/
12+
private $language;
13+
1014
public function setUp()
1115
{
1216
$httpAcceptLanguage = "fr-CA,fr;q=0.8,en-CA;q=0.6,en;q=0.4,en-US;q=0.2";
13-
Browser\Language::setAcceptLanguage($httpAcceptLanguage);
17+
$this->language = new Language($httpAcceptLanguage);
1418
}
1519

1620
public function testGetLanguage()
1721
{
18-
$language = Browser\Language::getLanguage();
19-
$this->assertEquals('fr', $language);
22+
$this->assertEquals('fr', $this->language->getLanguage());
2023
}
2124

2225
public function testGetLanguages()
2326
{
24-
$languages = Browser\Language::getLanguages();
25-
$this->assertGreaterThan(0, sizeof($languages));
27+
$this->assertGreaterThan(0, sizeof($this->language->getLanguages()));
2628
}
2729

2830
public function testGetLanguageLocal()
2931
{
30-
$language = Browser\Language::getLanguageLocale();
31-
$this->assertEquals('fr-CA', $language);
32+
$this->assertEquals('fr-CA', $this->language->getLanguageLocale());
3233
}
3334
}

test/Browser/Tests/OsTest.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
<?php
2-
32
namespace Browser\Tests;
43

5-
use Browser\Browser;
64
use Browser\Os;
75
use PHPUnit_Framework_TestCase;
86

test/Browser/Tests/UserAgentTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
<?php
2-
32
namespace Browser\Tests;
43

54
use Browser\UserAgent;

0 commit comments

Comments
 (0)