|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
/** |
|
4
|
|
|
* PHPPgAdmin v6.0.0-beta.44 |
|
5
|
|
|
*/ |
|
6
|
|
|
|
|
7
|
|
|
namespace PHPPgAdmin; |
|
8
|
|
|
|
|
9
|
|
|
/** |
|
10
|
|
|
* Class for translations. |
|
11
|
|
|
*/ |
|
12
|
|
|
class Translations |
|
13
|
|
|
{ |
|
14
|
|
|
// List of language files, and encoded language name. |
|
15
|
|
|
|
|
16
|
|
|
public $appLangFiles = [ |
|
17
|
|
|
'afrikaans' => 'Afrikaans', |
|
18
|
|
|
'arabic' => 'عربي', |
|
19
|
|
|
'catalan' => 'Català', |
|
20
|
|
|
'chinese-tr' => '繁體中文', |
|
21
|
|
|
'chinese-sim' => '简体中文', |
|
22
|
|
|
'chinese-utf8-zh_TW' => '正體中文(UTF-8)', |
|
23
|
|
|
'chinese-utf8-zh_CN' => '简体中文(UTF-8)', |
|
24
|
|
|
'czech' => 'Česky', |
|
25
|
|
|
'danish' => 'Danish', |
|
26
|
|
|
'dutch' => 'Nederlands', |
|
27
|
|
|
'english' => 'English', |
|
28
|
|
|
'french' => 'Français', |
|
29
|
|
|
'galician' => 'Galego', |
|
30
|
|
|
'german' => 'Deutsch', |
|
31
|
|
|
'greek' => 'Ελληνικά', |
|
32
|
|
|
'hebrew' => 'Hebrew', |
|
33
|
|
|
'hungarian' => 'Magyar', |
|
34
|
|
|
'italian' => 'Italiano', |
|
35
|
|
|
'japanese' => '日本語', |
|
36
|
|
|
'lithuanian' => 'Lietuvių', |
|
37
|
|
|
'mongol' => 'Mongolian', |
|
38
|
|
|
'polish' => 'Polski', |
|
39
|
|
|
'portuguese-br' => 'Português-Brasileiro', |
|
40
|
|
|
'portuguese-pt' => 'Português', |
|
41
|
|
|
'romanian' => 'Română', |
|
42
|
|
|
'russian-utf8' => 'Русский (UTF-8)', |
|
43
|
|
|
'russian' => 'Русский', |
|
44
|
|
|
'slovak' => 'Slovensky', |
|
45
|
|
|
'spanish' => 'Español', |
|
46
|
|
|
'swedish' => 'Svenska', |
|
47
|
|
|
'turkish' => 'Türkçe', |
|
48
|
|
|
'ukrainian' => 'Укра╖нська', |
|
49
|
|
|
]; |
|
50
|
|
|
|
|
51
|
|
|
public $appClasses = [ |
|
52
|
|
|
'afrikaans' => 'Afrikaans', |
|
53
|
|
|
'arabic' => 'Arabic', |
|
54
|
|
|
'catalan' => 'Catalan', |
|
55
|
|
|
'chinese-tr' => 'ChineseTr', |
|
56
|
|
|
'chinese-sim' => 'ChineseSim', |
|
57
|
|
|
'chinese-utf8-zh_TW' => 'ChineseUtf8ZhTw', |
|
58
|
|
|
'chinese-utf8-zh_CN' => 'ChineseUtf8ZhCn', |
|
59
|
|
|
'czech' => 'Czech', |
|
60
|
|
|
'danish' => 'Danish', |
|
61
|
|
|
'dutch' => 'Dutch', |
|
62
|
|
|
'english' => 'English', |
|
63
|
|
|
'french' => 'French', |
|
64
|
|
|
'galician' => 'Galician', |
|
65
|
|
|
'german' => 'German', |
|
66
|
|
|
'greek' => 'Greek', |
|
67
|
|
|
'hebrew' => 'Hebrew', |
|
68
|
|
|
'hungarian' => 'Hungarian', |
|
69
|
|
|
'italian' => 'Italian', |
|
70
|
|
|
'japanese' => 'Japanese', |
|
71
|
|
|
'lithuanian' => 'Lithuanian', |
|
72
|
|
|
'mongol' => 'Mongol', |
|
73
|
|
|
'polish' => 'Polish', |
|
74
|
|
|
'portuguese-br' => 'PortugueseBr', |
|
75
|
|
|
'portuguese-pt' => 'PortuguesePt', |
|
76
|
|
|
'romanian' => 'Romanian', |
|
77
|
|
|
'russian-utf8' => 'RussianUtf8', |
|
78
|
|
|
'russian' => 'Russian', |
|
79
|
|
|
'slovak' => 'Slovak', |
|
80
|
|
|
'spanish' => 'Spanish', |
|
81
|
|
|
'swedish' => 'Swedish', |
|
82
|
|
|
'turkish' => 'Turkish', |
|
83
|
|
|
'ukrainian' => 'Ukrainian', |
|
84
|
|
|
]; |
|
85
|
|
|
|
|
86
|
|
|
private $_language; |
|
87
|
|
|
|
|
88
|
|
|
/** |
|
89
|
|
|
* ISO639 language code to language file mapping. |
|
90
|
|
|
* See http://www.w3.org/WAI/ER/IG/ert/iso639.htm for language codes |
|
91
|
|
|
* If it's available 'language-country', but not general |
|
92
|
|
|
* 'language' translation (eg. 'portuguese-br', but not 'portuguese') |
|
93
|
|
|
* specify both 'la' => 'language-country' and 'la-co' => 'language-country'. |
|
94
|
|
|
*/ |
|
95
|
|
|
public $availableLanguages = [ |
|
96
|
|
|
'af' => 'afrikaans', |
|
97
|
|
|
'ar' => 'arabic', |
|
98
|
|
|
'ca' => 'catalan', |
|
99
|
|
|
'zh' => 'chinese-tr', |
|
100
|
|
|
'zh-cn' => 'chinese-sim', |
|
101
|
|
|
'utf8-zh-cn' => 'chinese-utf8-zh_TW', |
|
102
|
|
|
'utf8-zh-tw' => 'chinese-utf8-zh_CN', |
|
103
|
|
|
'cs' => 'czech', |
|
104
|
|
|
'da' => 'danish', |
|
105
|
|
|
'nl' => 'dutch', |
|
106
|
|
|
'en' => 'english', |
|
107
|
|
|
'fr' => 'french', |
|
108
|
|
|
'gl' => 'galician', |
|
109
|
|
|
'de' => 'german', |
|
110
|
|
|
'el' => 'greek', |
|
111
|
|
|
'he' => 'hebrew', |
|
112
|
|
|
'hu' => 'hungarian', |
|
113
|
|
|
'it' => 'italian', |
|
114
|
|
|
'ja' => 'japanese', |
|
115
|
|
|
'lt' => 'lithuanian', |
|
116
|
|
|
'mn' => 'mongol', |
|
117
|
|
|
'pl' => 'polish', |
|
118
|
|
|
'pt-br' => 'portuguese-br', |
|
119
|
|
|
'pt' => 'portuguese-pt', |
|
120
|
|
|
'ro' => 'romanian', |
|
121
|
|
|
'ru' => 'russian', |
|
122
|
|
|
'ru' => 'russian', |
|
123
|
|
|
'sk' => 'slovak', |
|
124
|
|
|
'es' => 'spanish', |
|
125
|
|
|
'sv' => 'swedish', |
|
126
|
|
|
'tr' => 'turkish', |
|
127
|
|
|
'uk' => 'ukrainian', |
|
128
|
|
|
]; |
|
129
|
|
|
|
|
130
|
|
|
public $languages_iso_code = [ |
|
131
|
|
|
'afrikaans' => 'af', |
|
132
|
|
|
'arabic' => 'ar', |
|
133
|
|
|
'catalan' => 'ca', |
|
134
|
|
|
'chinese-tr' => 'zh-CN', |
|
135
|
|
|
'chinese-sim' => 'zh-CN', |
|
136
|
|
|
'chinese-utf8-zh_TW' => 'zh-TW', |
|
137
|
|
|
'chinese-utf8-zh_CN' => 'zh-CN', |
|
138
|
|
|
'czech' => 'cs', |
|
139
|
|
|
'danish' => 'da', |
|
140
|
|
|
'dutch' => 'nl', |
|
141
|
|
|
'english' => 'en', |
|
142
|
|
|
'french' => 'fr', |
|
143
|
|
|
'galician' => 'gl', |
|
144
|
|
|
'german' => 'de', |
|
145
|
|
|
'greek' => 'el', |
|
146
|
|
|
'hebrew' => 'he', |
|
147
|
|
|
'hungarian' => 'hu', |
|
148
|
|
|
'italian' => 'it', |
|
149
|
|
|
'japanese' => 'ja', |
|
150
|
|
|
'lithuanian' => 'lt', |
|
151
|
|
|
'mongol' => 'mn', |
|
152
|
|
|
'polish' => 'pl', |
|
153
|
|
|
'portuguese-br' => 'pt-BR', |
|
154
|
|
|
'portuguese-pt' => 'pt', |
|
155
|
|
|
'romanian' => 'ro', |
|
156
|
|
|
'russian' => 'ru', |
|
157
|
|
|
'russian' => 'ru', |
|
158
|
|
|
'slovak' => 'sk', |
|
159
|
|
|
'spanish' => 'es', |
|
160
|
|
|
'swedish' => 'sv', |
|
161
|
|
|
'turkish' => 'tr', |
|
162
|
|
|
'ukrainian' => 'uk', |
|
163
|
|
|
]; |
|
164
|
|
|
|
|
165
|
|
|
public function __construct($container) |
|
166
|
|
|
{ |
|
167
|
|
|
$availableLanguages = $this->availableLanguages; |
|
168
|
|
|
$appLangFiles = $this->appLangFiles; |
|
169
|
|
|
$appClasses = $this->appClasses; |
|
170
|
|
|
$_language = $this->_language; |
|
171
|
|
|
$conf = $container->conf; |
|
172
|
|
|
|
|
173
|
|
|
$languages_iso_code = $this->languages_iso_code; |
|
174
|
|
|
|
|
175
|
|
|
if (!isset($conf['default_lang'])) { |
|
176
|
|
|
$conf['default_lang'] = 'english'; |
|
177
|
|
|
} |
|
178
|
|
|
|
|
179
|
|
|
// 1. Check for the language from a request var |
|
180
|
|
|
if (isset($_REQUEST['language'], $appLangFiles[$_REQUEST['language']])) { |
|
181
|
|
|
/* save the selected language in cookie for a year */ |
|
182
|
|
|
setcookie('webdbLanguage', $_REQUEST['language'], time() + 31536000); |
|
183
|
|
|
$_language = $_REQUEST['language']; |
|
184
|
|
|
} elseif (!isset($_language) && isset($_SESSION['webdbLanguage'], $appLangFiles[$_SESSION['webdbLanguage']])) { |
|
185
|
|
|
// 2. Check for language session var |
|
186
|
|
|
$_language = $_SESSION['webdbLanguage']; |
|
187
|
|
|
} elseif (!isset($_language) && isset($_COOKIE['webdbLanguage'], $appLangFiles[$_COOKIE['webdbLanguage']])) { |
|
188
|
|
|
// 3. Check for language in cookie var |
|
189
|
|
|
$_language = $_COOKIE['webdbLanguage']; |
|
190
|
|
|
} elseif (!isset($_language) && $conf['default_lang'] == 'auto' && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { |
|
191
|
|
|
// 4. Check for acceptable languages in HTTP_ACCEPT_LANGUAGE var |
|
192
|
|
|
// extract acceptable language tags |
|
193
|
|
|
// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4) |
|
194
|
|
|
preg_match_all( |
|
195
|
|
|
'/\s*([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;q=([01](?:.[0-9]{0,3})?))?\s*(?:,|$)/', |
|
196
|
|
|
strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']), |
|
197
|
|
|
$_m, |
|
198
|
|
|
PREG_SET_ORDER |
|
199
|
|
|
); |
|
200
|
|
|
foreach ($_m as $_l) { |
|
201
|
|
|
// $_l[1] = language tag, [2] = quality |
|
202
|
|
|
if (!isset($_l[2])) { |
|
203
|
|
|
$_l[2] = 1; |
|
204
|
|
|
} |
|
205
|
|
|
// Default quality to 1 |
|
206
|
|
|
if ($_l[2] > 0 && $_l[2] <= 1 && isset($availableLanguages[$_l[1]])) { |
|
207
|
|
|
// Build up array of (quality => language_file) |
|
208
|
|
|
$_acceptLang[$_l[2]] = $availableLanguages[$_l[1]]; |
|
209
|
|
|
} |
|
210
|
|
|
} |
|
211
|
|
|
unset($_m, $_l); |
|
212
|
|
|
|
|
213
|
|
|
if (isset($_acceptLang)) { |
|
214
|
|
|
// Sort acceptable languages by quality |
|
215
|
|
|
krsort($_acceptLang, SORT_NUMERIC); |
|
216
|
|
|
$_language = reset($_acceptLang); |
|
217
|
|
|
unset($_acceptLang); |
|
218
|
|
|
} |
|
219
|
|
|
} elseif (!isset($_language) && $conf['default_lang'] != 'auto' && isset($appLangFiles[$conf['default_lang']])) { |
|
220
|
|
|
// 5. Otherwise resort to the default set in the config file |
|
221
|
|
|
$_language = $conf['default_lang']; |
|
222
|
|
|
} else { |
|
223
|
|
|
// 6. Otherwise, default to english. |
|
224
|
|
|
$_language = 'english'; |
|
225
|
|
|
} |
|
226
|
|
|
|
|
227
|
|
|
$_type = '\PHPPgAdmin\Translations\\' . $appClasses[$_language]; |
|
228
|
|
|
|
|
229
|
|
|
$langClass = new $_type(); |
|
230
|
|
|
|
|
231
|
|
|
$_SESSION['webdbLanguage'] = $_language; |
|
232
|
|
|
|
|
233
|
|
|
if (array_key_exists($_language, $languages_iso_code)) { |
|
234
|
|
|
$_isolang = $languages_iso_code[$_language]; |
|
235
|
|
|
} else { |
|
236
|
|
|
$_isolang = 'en'; |
|
237
|
|
|
} |
|
238
|
|
|
$_SESSION['isolang'] = $_isolang; |
|
239
|
|
|
|
|
240
|
|
|
$container->offsetSet('appLangFiles', $appLangFiles); |
|
241
|
|
|
$container->offsetSet('language', $_language); |
|
242
|
|
|
$container->offsetSet('isolang', $_isolang); |
|
243
|
|
|
|
|
244
|
|
|
$this->lang = $langClass->getLang(); |
|
245
|
|
|
$this->lang['isolang'] = $_isolang; |
|
246
|
|
|
} |
|
247
|
|
|
} |
|
248
|
|
|
|