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
|
|
|
|