blob: d2a3a089df66a342954bc5586e65b6123f029529 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
<?php
/* ChooseLocale
*
* Licence: MPL 2/GPL 2.0/LGPL 2.1
* Author: Pascal Chevrel, Mozilla
* Date : 2010-07-17
*
* Description:
* Class to choose the locale which locale we will show to the visitor
* based on http acceptlang headers and our list of supported locales.
*
*
*/
class ChooseLocale
{
public $HTTPAcceptLang;
public $supportedLocales;
protected $detectedLocale;
protected $defaultLocale;
public $mapLonglocales;
public function __construct($list=array('en-US'), $force_http_accept_language = null)
{
if (null !== $force_http_accept_language) {
$this -> HTTPAcceptLang = $force_http_accept_language;
} else if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
$this -> HTTPAcceptLang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
}
$this -> supportedLocales = array_unique($list);
$this -> setDefaultLocale('en-US');
$this -> setCompatibleLocale();
$this -> mapLonglocales = true;
}
public function getAcceptLangArray()
{
if (empty($this->HTTPAcceptLang)) return null;
return explode(',', strtolower($this->HTTPAcceptLang));
}
public function getCompatibleLocale()
{
$l = $this -> defaultLocale;
$acclang = $this -> getAcceptLangArray();
if(!is_array($acclang)) {
return $this -> defaultLocale;
}
foreach ($acclang as $var) {
$locale = $this -> _cleanHTTPlocaleCode($var);
$shortLocale = array_shift(explode('-', $locale));
if (in_array($locale, $this -> supportedLocales)) {
$l = $locale;
break;
}
if (in_array($shortLocale, $this -> supportedLocales)) {
$l = $shortLocale;
break;
}
// check if we map visitors short locales to site long locales
// like en -> en-GB
if ($this -> mapLonglocales == true) {
foreach ($this -> supportedLocales as $var) {
$shortSupportedLocale = array_shift(explode('-', $var));
if ($shortLocale == $shortSupportedLocale) {
$l = $var;
break;
}
}
}
}
return $l;
}
public function getDefaultLocale() {
return $this -> defaultLocale;
}
public function setCompatibleLocale() {
$this -> detectedLocale = $this -> getCompatibleLocale();
}
public function setDefaultLocale($locale) {
// the default locale should always be among the site locales
// if not, the first locale in the supportedLocales array is default
if (!in_array($locale, $this -> supportedLocales)) {
$this -> defaultLocale = $this -> supportedLocales[0];
} else {
$this -> defaultLocale = $locale;
}
return;
}
private function _cleanHTTPlocaleCode($str)
{
$locale = explode(';', $str);
$locale = trim($locale[0]);
return $locale;
}
}
|