HTML Filter bugfixes and further strengthening.
[squirrelmail.git] / functions / i18n.php
CommitLineData
59177427 1<?php
1fd97780 2
35586184 3/**
4 * i18n.php
5 *
76911253 6 * Copyright (c) 1999-2003 The SquirrelMail Project Team
35586184 7 * Licensed under the GNU GPL. For full terms see the file COPYING.
8 *
9 * This file contains variuos functions that are needed to do
10 * internationalization of SquirrelMail.
11 *
12 * Internally the output character set is used. Other characters are
13 * encoded using Unicode entities according to HTML 4.0.
14 *
15 * $Id$
16 */
17
961ca3d8 18require_once(SM_PATH . 'functions/global.php');
19
a2a7852b 20/* Decodes a string to the internal encoding from the given charset */
21function charset_decode ($charset, $string) {
3ec81e63 22 global $languages, $squirrelmail_language, $default_charset;
a2a7852b 23
3714db45 24 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
25 function_exists($languages[$squirrelmail_language]['XTRA_CODE'])) {
6fbd125b 26 $string = $languages[$squirrelmail_language]['XTRA_CODE']('decode', $string);
27 }
b05c8961 28
3ec81e63 29 $charset = strtolower($charset);
30
31 set_my_charset();
32
33 // Variables that allow to use functions without function_exist() calls
34 $use_php_recode=false;
35 $use_php_iconv=false;
36
37 // Don't do conversion if charset is the same.
38 if ( $charset == strtolower($default_charset) )
39 return htmlspecialchars($string);
40
41 // catch iso-8859-8-i thing
42 if ( $charset == "iso-8859-8-i" )
43 $charset = "iso-8859-8";
44
45 /*
46 * Recode converts html special characters automatically if you use
47 * 'charset..html' decoding. There is no documented way to put -d option
48 * into php recode function call.
49 */
50 if ( $use_php_recode ) {
51 if ( $default_charset == "utf-8" ) {
52 // other charsets can be converted to utf-8 without loss.
53 // and output string is smaller
54 $string = recode_string($charset . "..utf-8",$string);
55 return htmlspecialchars($string);
56 } else {
57 $string = recode_string($charset . "..html",$string);
58 // recode does not convert single quote, htmlspecialchars does.
59 $string = str_replace("'", '&#039;', $string);
60 return $string;
61 }
62 }
63
64 // iconv functions does not have html target and can be used only with utf-8
65 if ( $use_php_iconv && $default_charset=='utf-8') {
66 $string = iconv($charset,$default_charset,$string);
67 return htmlspecialchars($string);
68 }
69
70 // If we don't use recode and iconv, we'll do it old way.
71
a2a7852b 72 /* All HTML special characters are 7 bit and can be replaced first */
cef054e4 73
098ea084 74 $string = htmlspecialchars ($string);
a2a7852b 75
5dd23dac 76 /* controls cpu and memory intensive decoding cycles */
77 $agresive_decoding = false;
78
a2a7852b 79 if (ereg('iso-8859-([[:digit:]]+)', $charset, $res)) {
80 if ($res[1] == '1') {
5dd23dac 81 include_once(SM_PATH . 'functions/decode/iso8859-1.php');
82 $ret = charset_decode_iso8859_1 ($string);
a2a7852b 83 } else if ($res[1] == '2') {
5dd23dac 84 include_once(SM_PATH . 'functions/decode/iso8859-2.php');
85 $ret = charset_decode_iso8859_2 ($string);
3a66bed2 86 } else if ($res[1] == '3') {
87 include_once(SM_PATH . 'functions/decode/iso8859-3.php');
88 $ret = charset_decode_iso8859_3 ($string);
9be313d5 89 } else if ($res[1] == '4') {
3a66bed2 90 include_once(SM_PATH . 'functions/decode/iso8859-4.php');
91 $ret = charset_decode_iso8859_4 ($string);
94965562 92 } else if ($res[1] == '5') {
3a66bed2 93 include_once(SM_PATH . 'functions/decode/iso8859-5.php');
94 $ret = charset_decode_iso8859_5 ($string);
ef82d2d5 95 } else if ($res[1] == '6') {
5dd23dac 96 include_once(SM_PATH . 'functions/decode/iso8859-6.php');
97 $ret = charset_decode_iso8859_6 ($string);
a2a7852b 98 } else if ($res[1] == '7') {
5dd23dac 99 include_once(SM_PATH . 'functions/decode/iso8859-7.php');
100 $ret = charset_decode_iso8859_7 ($string);
3a66bed2 101 } else if ($res[1] == '8') {
102 include_once(SM_PATH . 'functions/decode/iso8859-8.php');
103 $ret = charset_decode_iso8859_8 ($string);
3ab35042 104 } else if ($res[1] == '9') {
5dd23dac 105 include_once(SM_PATH . 'functions/decode/iso8859-9.php');
106 $ret = charset_decode_iso8859_9 ($string);
3a66bed2 107 } else if ($res[1] == '10') {
108 include_once(SM_PATH . 'functions/decode/iso8859-10.php');
109 $ret = charset_decode_iso8859_10 ($string);
110 } else if ($res[1] == '11') {
111 include_once(SM_PATH . 'functions/decode/iso8859-11.php');
112 $ret = charset_decode_iso8859_11 ($string);
9be313d5 113 } else if ($res[1] == '13') {
3a66bed2 114 include_once(SM_PATH . 'functions/decode/iso8859-13.php');
115 $ret = charset_decode_iso8859_13 ($string);
116 } else if ($res[1] == '14') {
117 include_once(SM_PATH . 'functions/decode/iso8859-14.php');
118 $ret = charset_decode_iso8859_14 ($string);
a2a7852b 119 } else if ($res[1] == '15') {
5dd23dac 120 include_once(SM_PATH . 'functions/decode/iso8859-15.php');
121 $ret = charset_decode_iso8859_15 ($string);
3a66bed2 122 } else if ($res[1] == '16') {
123 include_once(SM_PATH . 'functions/decode/iso8859-16.php');
124 $ret = charset_decode_iso8859_16 ($string);
a2a7852b 125 } else {
126 $ret = charset_decode_iso_8859_default ($string);
127 }
128 } else if ($charset == 'ns_4551-1') {
129 $ret = charset_decode_ns_4551_1 ($string);
130 } else if ($charset == 'koi8-r') {
5dd23dac 131 include_once(SM_PATH . 'functions/decode/koi8-r.php');
a2a7852b 132 $ret = charset_decode_koi8r ($string);
1c0e847f 133 } else if ($charset == 'koi8-u') {
5dd23dac 134 include_once(SM_PATH . 'functions/decode/koi8-u.php');
1c0e847f 135 $ret = charset_decode_koi8u ($string);
5dd23dac 136 } else if ($charset == 'windows-1250') {
137 include_once(SM_PATH . 'functions/decode/cp1250.php');
138 $ret = charset_decode_cp1250 ($string);
a2a7852b 139 } else if ($charset == 'windows-1251') {
5dd23dac 140 include_once(SM_PATH . 'functions/decode/cp1251.php');
141 $ret = charset_decode_cp1251 ($string);
142 } else if ($charset == 'windows-1252') {
143 include_once(SM_PATH . 'functions/decode/cp1252.php');
144 $ret = charset_decode_cp1252 ($string);
3ab35042 145 } else if ($charset == 'windows-1253') {
5dd23dac 146 include_once(SM_PATH . 'functions/decode/cp1253.php');
147 $ret = charset_decode_cp1253 ($string);
3ab35042 148 } else if ($charset == 'windows-1254') {
5dd23dac 149 include_once(SM_PATH . 'functions/decode/cp1254.php');
150 $ret = charset_decode_cp1254 ($string);
c48a8ca7 151 } else if ($charset == 'windows-1255') {
5dd23dac 152 include_once(SM_PATH . 'functions/decode/cp1255.php');
153 $ret = charset_decode_cp1255 ($string);
c48a8ca7 154 } else if ($charset == 'windows-1256') {
5dd23dac 155 include_once(SM_PATH . 'functions/decode/cp1256.php');
156 $ret = charset_decode_cp1256 ($string);
c37a12f8 157 } else if ($charset == 'windows-1257') {
3a66bed2 158 include_once(SM_PATH . 'functions/decode/cp1257.php');
159 $ret = charset_decode_cp1257 ($string);
5dd23dac 160 } else if ($charset == 'windows-1258') {
161 include_once(SM_PATH . 'functions/decode/cp1258.php');
162 $ret = charset_decode_cp1258 ($string);
e9a71964 163 } else if ($charset == 'x-mac-roman') {
164 include_once(SM_PATH . 'functions/decode/cp10000.php');
165 $ret = charset_decode_cp10000 ($string);
166 } else if ($charset == 'x-mac-greek') {
167 include_once(SM_PATH . 'functions/decode/cp10006.php');
168 $ret = charset_decode_cp10006 ($string);
169 } else if ($charset == 'x-mac-cyrillic') {
170 include_once(SM_PATH . 'functions/decode/cp10007.php');
171 $ret = charset_decode_cp10007 ($string);
172 } else if ($charset == 'x-mac-ukrainian') {
173 include_once(SM_PATH . 'functions/decode/cp10017.php');
174 $ret = charset_decode_cp10017 ($string);
175 } else if ($charset == 'x-mac-centraleurroman') {
176 include_once(SM_PATH . 'functions/decode/cp10029.php');
177 $ret = charset_decode_cp10029 ($string);
178 } else if ($charset == 'x-mac-icelandic') {
179 include_once(SM_PATH . 'functions/decode/cp10079.php');
180 $ret = charset_decode_cp10079 ($string);
181 } else if ($charset == 'x-mac-turkish') {
182 include_once(SM_PATH . 'functions/decode/cp10081.php');
183 $ret = charset_decode_cp10081 ($string);
184 } else if ($charset == 'ibm855') {
185 include_once(SM_PATH . 'functions/decode/cp855.php');
186 $ret = charset_decode_cp855 ($string);
187 } else if ($charset == 'ibm866') {
188 include_once(SM_PATH . 'functions/decode/cp866.php');
189 $ret = charset_decode_cp866 ($string);
7af26ef8 190 } else if ($charset == 'tis-620') {
191 include_once(SM_PATH . 'functions/decode/tis620.php');
192 $ret = charset_decode_tis620 ($string);
5dd23dac 193 } else if ($charset == 'big5' and $agresive_decoding ) {
194 include_once(SM_PATH . 'functions/decode/big5.php');
195 $ret = charset_decode_big5 ($string);
196 } else if ($charset == 'gb2312' and $agresive_decoding ) {
197 include_once(SM_PATH . 'functions/decode/gb2312.php');
198 $ret = charset_decode_gb2312 ($string);
3ab35042 199 } else if ($charset == 'utf-8') {
5dd23dac 200 include_once(SM_PATH . 'functions/decode/utf-8.php');
3ab35042 201 $ret = charset_decode_utf8 ($string);
a2a7852b 202 } else {
203 $ret = $string;
204 }
205 return( $ret );
206}
207
a2a7852b 208
209/* Remove all 8 bit characters from all other ISO-8859 character sets */
210function charset_decode_iso_8859_default ($string) {
211 return (strtr($string, "\240\241\242\243\244\245\246\247".
1fd97780 212 "\250\251\252\253\254\255\256\257".
213 "\260\261\262\263\264\265\266\267".
214 "\270\271\272\273\274\275\276\277".
215 "\300\301\302\303\304\305\306\307".
216 "\310\311\312\313\314\315\316\317".
217 "\320\321\322\323\324\325\326\327".
218 "\330\331\332\333\334\335\336\337".
219 "\340\341\342\343\344\345\346\347".
220 "\350\351\352\353\354\355\356\357".
221 "\360\361\362\363\364\365\366\367".
a2a7852b 222 "\370\371\372\373\374\375\376\377",
1fd97780 223 "????????????????????????????????????????".
224 "????????????????????????????????????????".
225 "????????????????????????????????????????".
226 "????????"));
a2a7852b 227
228}
229
230/*
231 * This is the same as ISO-646-NO and is used by some
232 * Microsoft programs when sending Norwegian characters
233 */
234function charset_decode_ns_4551_1 ($string) {
235 /*
236 * These characters are:
237 * Latin capital letter AE
238 * Latin capital letter O with stroke
239 * Latin capital letter A with ring above
240 * and the same as small letters
241 */
242 return strtr ($string, "[\\]{|}", "");
243}
244
6fbd125b 245
a2a7852b 246/*
247 * Set up the language to be output
248 * if $do_search is true, then scan the browser information
249 * for a possible language that we know
250 */
67a8c90a 251function set_up_language($sm_language, $do_search = false, $default = false) {
a2a7852b 252
253 static $SetupAlready = 0;
9eb0fbd4 254 global $use_gettext, $languages,
a2a7852b 255 $squirrelmail_language, $squirrelmail_default_language,
256 $sm_notAlias;
257
258 if ($SetupAlready) {
259 return;
260 }
a65846a7 261
5c920668 262 $SetupAlready = TRUE;
961ca3d8 263 sqgetGlobalVar('HTTP_ACCEPT_LANGUAGE', $accept_lang, SQ_SERVER);
a2a7852b 264
961ca3d8 265 if ($do_search && ! $sm_language && isset($accept_lang)) {
266 $sm_language = substr($accept_lang, 0, 2);
a2a7852b 267 }
66d7950f 268
67a8c90a 269 if ((!$sm_language||$default) && isset($squirrelmail_default_language)) {
a2a7852b 270 $squirrelmail_language = $squirrelmail_default_language;
66d7950f 271 $sm_language = $squirrelmail_default_language;
a2a7852b 272 }
273 $sm_notAlias = $sm_language;
3ec81e63 274
275 // Catching removed translation
276 // System reverts to English translation if user prefs contain translation
277 // that is not available in $languages array (admin removed directory
278 // with that translation)
279 if (!isset($languages[$sm_notAlias])) {
280 $sm_notAlias="en_US";
281 }
282
a2a7852b 283 while (isset($languages[$sm_notAlias]['ALIAS'])) {
284 $sm_notAlias = $languages[$sm_notAlias]['ALIAS'];
285 }
286
88cb1b4d 287 if ( isset($sm_language) &&
5c920668 288 $use_gettext &&
289 $sm_language != '' &&
290 isset($languages[$sm_notAlias]['CHARSET']) ) {
a65846a7 291 bindtextdomain( 'squirrelmail', SM_PATH . 'locale/' );
88cb1b4d 292 textdomain( 'squirrelmail' );
7928848f 293 if (function_exists('bind_textdomain_codeset')) {
294 bind_textdomain_codeset ("squirrelmail", $languages[$sm_notAlias]['CHARSET'] );
295 }
f2374580 296 if (isset($languages[$sm_notAlias]['LOCALE'])){
297 $longlocale=$languages[$sm_notAlias]['LOCALE'];
298 } else {
299 $longlocale=$sm_notAlias;
300 }
88cb1b4d 301 if ( !ini_get('safe_mode') &&
f2374580 302 getenv( 'LC_ALL' ) != $longlocale ) {
303 putenv( "LC_ALL=$longlocale" );
304 putenv( "LANG=$longlocale" );
305 putenv( "LANGUAGE=$longlocale" );
a2a7852b 306 }
f2374580 307 setlocale(LC_ALL, $longlocale);
308 $squirrelmail_language = $sm_notAlias;
538f1ab7 309 if ($squirrelmail_language == 'ja_JP' && function_exists('mb_detect_encoding') ) {
b05c8961 310 header ('Content-Type: text/html; charset=EUC-JP');
311 if (!function_exists('mb_internal_encoding')) {
e842b215 312 echo _("You need to have php4 installed with the multibyte string function enabled (using configure option --enable-mbstring).");
313 }
314 if (function_exists('mb_language')) {
315 mb_language('Japanese');
b05c8961 316 }
317 mb_internal_encoding('EUC-JP');
318 mb_http_output('pass');
319 } else {
5c920668 320 header( 'Content-Type: text/html; charset=' . $languages[$sm_notAlias]['CHARSET'] );
a2a7852b 321 }
322}
b05c8961 323}
a2a7852b 324
325function set_my_charset(){
326
327 /*
328 * There can be a $default_charset setting in the
329 * config.php file, but the user may have a different language
330 * selected for a user interface. This function checks the
331 * language selected by the user and tags the outgoing messages
332 * with the appropriate charset corresponding to the language
333 * selection. This is "more right" (tm), than just stamping the
334 * message blindly with the system-wide $default_charset.
335 */
94965562 336 global $data_dir, $username, $default_charset, $languages, $squirrelmail_default_language;
88cb1b4d 337
a2a7852b 338 $my_language = getPref($data_dir, $username, 'language');
5c920668 339 if (!$my_language) {
94965562 340 $my_language = $squirrelmail_default_language ;
5c920668 341 }
3ec81e63 342 // Catch removed translation
343 if (!isset($languages[$my_language])) {
344 $my_language="en_US";
345 }
a2a7852b 346 while (isset($languages[$my_language]['ALIAS'])) {
f7e8861e 347 $my_language = $languages[$my_language]['ALIAS'];
a2a7852b 348 }
5c920668 349 $my_charset = $languages[$my_language]['CHARSET'];
a2a7852b 350 if ($my_charset) {
351 $default_charset = $my_charset;
352 }
353}
354
a2a7852b 355/* ------------------------------ main --------------------------- */
356
5c920668 357global $squirrelmail_language, $languages, $use_gettext;
358
a2a7852b 359if (! isset($squirrelmail_language)) {
360 $squirrelmail_language = '';
361}
362
363/* This array specifies the available languages. */
5c920668 364
ddc315a7 365if ( file_exists( SM_PATH . 'locale/ca_ES') ) {
366 // The glibc locale is ca_ES.
367 $languages['ca_ES']['NAME'] = 'Catalan';
368 $languages['ca_ES']['CHARSET'] = 'iso-8859-1';
369 $languages['ca']['ALIAS'] = 'ca_ES';
370}
a2a7852b 371
ddc315a7 372if ( file_exists( SM_PATH . 'locale/cs_CZ') ) {
373 $languages['cs_CZ']['NAME'] = 'Czech';
374 $languages['cs_CZ']['CHARSET'] = 'iso-8859-2';
375 $languages['cs']['ALIAS'] = 'cs_CZ';
376}
5c920668 377
ddc315a7 378if ( file_exists( SM_PATH . 'locale/da_DK') ) {
379 // Danish locale is da_DK.
380 $languages['da_DK']['NAME'] = 'Danish';
381 $languages['da_DK']['CHARSET'] = 'iso-8859-1';
382 $languages['da']['ALIAS'] = 'da_DK';
383}
5c920668 384
ddc315a7 385if ( file_exists( SM_PATH . 'locale/de_DE') ) {
386 $languages['de_DE']['NAME'] = 'Deutsch';
387 $languages['de_DE']['CHARSET'] = 'iso-8859-1';
388 $languages['de']['ALIAS'] = 'de_DE';
389}
a2a7852b 390
5c920668 391// There is no en_EN! There is en_US, en_BR, en_AU, and so forth,
392// but who cares about !US, right? Right? :)
a2a7852b 393
ddc315a7 394if ( file_exists( SM_PATH . 'locale/el_GR') ) {
395 $languages['el_GR']['NAME'] = 'Greek';
396 $languages['el_GR']['CHARSET'] = 'iso-8859-7';
397 $languages['el']['ALIAS'] = 'el_GR';
398}
3ab35042 399
5c920668 400$languages['en_US']['NAME'] = 'English';
401$languages['en_US']['CHARSET'] = 'iso-8859-1';
402$languages['en']['ALIAS'] = 'en_US';
a2a7852b 403
ddc315a7 404if ( file_exists( SM_PATH . 'locale/es_ES') ) {
405 $languages['es_ES']['NAME'] = 'Spanish';
406 $languages['es_ES']['CHARSET'] = 'iso-8859-1';
407 $languages['es']['ALIAS'] = 'es_ES';
408}
409if ( file_exists( SM_PATH . 'locale/et_EE') ) {
410 $languages['et_EE']['NAME'] = 'Estonian';
411 $languages['et_EE']['CHARSET'] = 'iso-8859-15';
412 $languages['et']['ALIAS'] = 'et_EE';
413}
414if ( file_exists( SM_PATH . 'locale/fo_FO') ) {
415 $languages['fo_FO']['NAME'] = 'Faroese';
416 $languages['fo_FO']['CHARSET'] = 'iso-8859-1';
417 $languages['fo']['ALIAS'] = 'fo_FO';
418}
419if ( file_exists( SM_PATH . 'locale/fi_FI') ) {
420 $languages['fi_FI']['NAME'] = 'Finnish';
421 $languages['fi_FI']['CHARSET'] = 'iso-8859-1';
422 $languages['fi']['ALIAS'] = 'fi_FI';
423}
424if ( file_exists( SM_PATH . 'locale/fr_FR') ) {
425 $languages['fr_FR']['NAME'] = 'French';
426 $languages['fr_FR']['CHARSET'] = 'iso-8859-1';
427 $languages['fr']['ALIAS'] = 'fr_FR';
428}
429if ( file_exists( SM_PATH . 'locale/hr_HR') ) {
430 $languages['hr_HR']['NAME'] = 'Croatian';
431 $languages['hr_HR']['CHARSET'] = 'iso-8859-2';
432 $languages['hr']['ALIAS'] = 'hr_HR';
433}
434if ( file_exists( SM_PATH . 'locale/hu_HU') ) {
435 $languages['hu_HU']['NAME'] = 'Hungarian';
436 $languages['hu_HU']['CHARSET'] = 'iso-8859-2';
437 $languages['hu']['ALIAS'] = 'hu_HU';
438}
439if ( file_exists( SM_PATH . 'locale/id_ID') ) {
440 $languages['id_ID']['NAME'] = 'Bahasa Indonesia';
441 $languages['id_ID']['CHARSET'] = 'iso-8859-1';
442 $languages['id']['ALIAS'] = 'id_ID';
443}
444if ( file_exists( SM_PATH . 'locale/is_IS') ) {
445 $languages['is_IS']['NAME'] = 'Icelandic';
446 $languages['is_IS']['CHARSET'] = 'iso-8859-1';
447 $languages['is']['ALIAS'] = 'is_IS';
448}
449if ( file_exists( SM_PATH . 'locale/it_IT') ) {
450 $languages['it_IT']['NAME'] = 'Italian';
451 $languages['it_IT']['CHARSET'] = 'iso-8859-1';
452 $languages['it']['ALIAS'] = 'it_IT';
453}
454if ( file_exists( SM_PATH . 'locale/ja_JP') ) {
455 $languages['ja_JP']['NAME'] = 'Japanese';
456 $languages['ja_JP']['CHARSET'] = 'iso-2022-jp';
457 $languages['ja_JP']['XTRA_CODE'] = 'japanese_charset_xtra';
458 $languages['ja']['ALIAS'] = 'ja_JP';
459}
460if ( file_exists( SM_PATH . 'locale/ko_KR') ) {
461 $languages['ko_KR']['NAME'] = 'Korean';
462 $languages['ko_KR']['CHARSET'] = 'euc-KR';
463 $languages['ko_KR']['XTRA_CODE'] = 'korean_charset_xtra';
464 $languages['ko']['ALIAS'] = 'ko_KR';
465}
466if ( file_exists( SM_PATH . 'locale/nl_NL') ) {
467 $languages['nl_NL']['NAME'] = 'Dutch';
468 $languages['nl_NL']['CHARSET'] = 'iso-8859-1';
469 $languages['nl']['ALIAS'] = 'nl_NL';
470}
060c9483 471if ( file_exists( SM_PATH . 'locale/ms_MY') ) {
472 $languages['ms_MY']['NAME'] = 'Bahasa Melayu';
473 $languages['ms_MY']['CHARSET'] = 'iso-8859-1';
474 $languages['my']['ALIAS'] = 'ms_MY';
475}
476
ddc315a7 477if ( file_exists( SM_PATH . 'locale/no_NO') ) {
478 $languages['no_NO']['NAME'] = 'Norwegian (Bokm&aring;l)';
479 $languages['no_NO']['CHARSET'] = 'iso-8859-1';
480 $languages['no']['ALIAS'] = 'no_NO';
481}
482if ( file_exists( SM_PATH . 'locale/nn_NO') ) {
483 $languages['nn_NO']['NAME'] = 'Norwegian (Nynorsk)';
484 $languages['nn_NO']['CHARSET'] = 'iso-8859-1';
485}
486if ( file_exists( SM_PATH . 'locale/pl_PL') ) {
487 $languages['pl_PL']['NAME'] = 'Polish';
488 $languages['pl_PL']['CHARSET'] = 'iso-8859-2';
489 $languages['pl']['ALIAS'] = 'pl_PL';
490}
491if ( file_exists( SM_PATH . 'locale/pt_PT') ) {
492 $languages['pt_PT']['NAME'] = 'Portuguese (Portugal)';
493 $languages['pt_PT']['CHARSET'] = 'iso-8859-1';
494 $languages['pt']['ALIAS'] = 'pt_PT';
495}
496if ( file_exists( SM_PATH . 'locale/pt_BR') ) {
497 $languages['pt_BR']['NAME'] = 'Portuguese (Brazil)';
498 $languages['pt_BR']['CHARSET'] = 'iso-8859-1';
499}
500if ( file_exists( SM_PATH . 'locale/ru_RU') ) {
501 $languages['ru_RU']['NAME'] = 'Russian';
f96f799a 502 $languages['ru_RU']['CHARSET'] = 'utf-8';
503 $languages['ru_RU']['LOCALE'] = 'ru_RU.UTF-8';
ddc315a7 504 $languages['ru']['ALIAS'] = 'ru_RU';
505}
506if ( file_exists( SM_PATH . 'locale/sr_YU') ) {
507 $languages['sr_YU']['NAME'] = 'Serbian';
508 $languages['sr_YU']['CHARSET'] = 'iso-8859-2';
509 $languages['sr']['ALIAS'] = 'sr_YU';
510}
511if ( file_exists( SM_PATH . 'locale/sv_SE') ) {
512 $languages['sv_SE']['NAME'] = 'Swedish';
513 $languages['sv_SE']['CHARSET'] = 'iso-8859-1';
514 $languages['sv']['ALIAS'] = 'sv_SE';
515}
516if ( file_exists( SM_PATH . 'locale/tr_TR') ) {
517 $languages['tr_TR']['NAME'] = 'Turkish';
518 $languages['tr_TR']['CHARSET'] = 'iso-8859-9';
519 $languages['tr']['ALIAS'] = 'tr_TR';
520}
521if ( file_exists( SM_PATH . 'locale/zh_TW') ) {
522 $languages['zh_TW']['NAME'] = 'Chinese Trad';
523 $languages['zh_TW']['CHARSET'] = 'big5';
524 $languages['tw']['ALIAS'] = 'zh_TW';
525}
526if ( file_exists( SM_PATH . 'locale/zh_CN') ) {
527 $languages['zh_CN']['NAME'] = 'Chinese Simp';
528 $languages['zh_CN']['CHARSET'] = 'gb2312';
529 $languages['cn']['ALIAS'] = 'zh_CN';
530}
531if ( file_exists( SM_PATH . 'locale/sk_SK') ) {
532 $languages['sk_SK']['NAME'] = 'Slovak';
533 $languages['sk_SK']['CHARSET'] = 'iso-8859-2';
534 $languages['sk']['ALIAS'] = 'sk_SK';
535}
536if ( file_exists( SM_PATH . 'locale/ro_RO') ) {
537 $languages['ro_RO']['NAME'] = 'Romanian';
538 $languages['ro_RO']['CHARSET'] = 'iso-8859-2';
539 $languages['ro']['ALIAS'] = 'ro_RO';
540}
541if ( file_exists( SM_PATH . 'locale/th_TH') ) {
542 $languages['th_TH']['NAME'] = 'Thai';
543 $languages['th_TH']['CHARSET'] = 'tis-620';
544 $languages['th']['ALIAS'] = 'th_TH';
545}
546if ( file_exists( SM_PATH . 'locale/lt_LT') ) {
547 $languages['lt_LT']['NAME'] = 'Lithuanian';
f67cfab7 548 $languages['lt_LT']['CHARSET'] = 'utf-8';
549 $languages['lt_LT']['LOCALE'] = 'lt_LT.UTF-8';
ddc315a7 550 $languages['lt']['ALIAS'] = 'lt_LT';
551}
552if ( file_exists( SM_PATH . 'locale/sl_SI') ) {
553 $languages['sl_SI']['NAME'] = 'Slovenian';
554 $languages['sl_SI']['CHARSET'] = 'iso-8859-2';
555 $languages['sl']['ALIAS'] = 'sl_SI';
556}
557if ( file_exists( SM_PATH . 'locale/bg_BG') ) {
558 $languages['bg_BG']['NAME'] = 'Bulgarian';
559 $languages['bg_BG']['CHARSET'] = 'windows-1251';
560 $languages['bg']['ALIAS'] = 'bg_BG';
561}
562if ( file_exists( SM_PATH . 'locale/uk_UA') ) {
563 $languages['uk_UA']['NAME'] = 'Ukrainian';
564 $languages['uk_UA']['CHARSET'] = 'koi8-u';
565 $languages['uk']['ALIAS'] = 'uk_UA';
566}
567if ( file_exists( SM_PATH . 'locale/cy_GB') ) {
568 $languages['cy_GB']['NAME'] = 'Welsh';
569 $languages['cy_GB']['CHARSET'] = 'iso-8859-1';
570 $languages['cy']['ALIAS'] = 'cy_GB';
571}
572if ( file_exists( SM_PATH . 'locale/vi_VN') ) {
573 $languages['vi_VN']['NAME'] = 'Vietnamese';
574 $languages['vi_VN']['CHARSET'] = 'utf-8';
575 $languages['vi']['ALIAS'] = 'vi_VN';
576}
d3b57948 577// Right to left languages
ddc315a7 578if ( file_exists( SM_PATH . 'locale/ar') ) {
579 $languages['ar']['NAME'] = 'Arabic';
580 $languages['ar']['CHARSET'] = 'windows-1256';
581 $languages['ar']['DIR'] = 'rtl';
582}
583if ( file_exists( SM_PATH . 'locale/he_IL') ) {
584 $languages['he_IL']['NAME'] = 'Hebrew';
585 $languages['he_IL']['CHARSET'] = 'windows-1255';
586 $languages['he_IL']['DIR'] = 'rtl';
587 $languages['he']['ALIAS'] = 'he_IL';
588}
d3b57948 589
5c920668 590/* Detect whether gettext is installed. */
a2a7852b 591$gettext_flags = 0;
592if (function_exists('_')) {
593 $gettext_flags += 1;
594}
595if (function_exists('bindtextdomain')) {
596 $gettext_flags += 2;
597}
598if (function_exists('textdomain')) {
599 $gettext_flags += 4;
600}
601
5c920668 602/* If gettext is fully loaded, cool */
a2a7852b 603if ($gettext_flags == 7) {
604 $use_gettext = true;
605}
5c920668 606/* If we can fake gettext, try that */
a2a7852b 607elseif ($gettext_flags == 0) {
608 $use_gettext = true;
e7ab8c9d 609 include_once(SM_PATH . 'functions/gettext.php');
a2a7852b 610} else {
5c920668 611 /* Uh-ho. A weird install */
a2a7852b 612 if (! $gettext_flags & 1) {
613 function _($str) {
614 return $str;
615 }
616 }
617 if (! $gettext_flags & 2) {
618 function bindtextdomain() {
619 return;
620 }
621 }
622 if (! $gettext_flags & 4) {
623 function textdomain() {
624 return;
625 }
626 }
627}
628
1d33e35e 629
630/*
631 * Japanese charset extra function
632 *
633 */
634function japanese_charset_xtra() {
635 $ret = func_get_arg(1); /* default return value */
636 if (function_exists('mb_detect_encoding')) {
637 switch (func_get_arg(0)) { /* action */
638 case 'decode':
e842b215 639 $detect_encoding = @mb_detect_encoding($ret);
1d33e35e 640 if ($detect_encoding == 'JIS' ||
641 $detect_encoding == 'EUC-JP' ||
e842b215 642 $detect_encoding == 'SJIS' ||
643 $detect_encoding == 'UTF-8') {
1d33e35e 644
e842b215 645 $ret = mb_convert_kana(mb_convert_encoding($ret, 'EUC-JP', 'AUTO'), "KV");
1d33e35e 646 }
647 break;
648 case 'encode':
e842b215 649 $detect_encoding = @mb_detect_encoding($ret);
1d33e35e 650 if ($detect_encoding == 'JIS' ||
651 $detect_encoding == 'EUC-JP' ||
e842b215 652 $detect_encoding == 'SJIS' ||
653 $detect_encoding == 'UTF-8') {
1d33e35e 654
e842b215 655 $ret = mb_convert_encoding(mb_convert_kana($ret, "KV"), 'JIS', 'AUTO');
1d33e35e 656 }
657 break;
658 case 'strimwidth':
659 $width = func_get_arg(2);
660 $ret = mb_strimwidth($ret, 0, $width, '...');
661 break;
662 case 'encodeheader':
8ba05cbe 663 $result = '';
664 if (strlen($ret) > 0) {
665 $tmpstr = mb_substr($ret, 0, 1);
666 $prevcsize = strlen($tmpstr);
667 for ($i = 1; $i < mb_strlen($ret); $i++) {
668 $tmp = mb_substr($ret, $i, 1);
669 if (strlen($tmp) == $prevcsize) {
670 $tmpstr .= $tmp;
671 } else {
672 if ($prevcsize == 1) {
673 $result .= $tmpstr;
674 } else {
e842b215 675 $result .= str_replace(' ', '',
676 mb_encode_mimeheader($tmpstr,'iso-2022-jp','B',''));
8ba05cbe 677 }
678 $tmpstr = $tmp;
679 $prevcsize = strlen($tmp);
680 }
681 }
682 if (strlen($tmpstr)) {
683 if (strlen(mb_substr($tmpstr, 0, 1)) == 1)
684 $result .= $tmpstr;
685 else
e842b215 686 $result .= str_replace(' ', '',
687 mb_encode_mimeheader($tmpstr,'iso-2022-jp','B',''));
8ba05cbe 688 }
689 }
690 $ret = $result;
1d33e35e 691 break;
692 case 'decodeheader':
693 $ret = str_replace("\t", "", $ret);
694 if (eregi('=\\?([^?]+)\\?(q|b)\\?([^?]+)\\?=', $ret))
e842b215 695 $ret = @mb_decode_mimeheader($ret);
696 $ret = @mb_convert_encoding($ret, 'EUC-JP', 'AUTO');
1d33e35e 697 break;
698 case 'downloadfilename':
699 $useragent = func_get_arg(2);
700 if (strstr($useragent, 'Windows') !== false ||
701 strstr($useragent, 'Mac_') !== false) {
702 $ret = mb_convert_encoding($ret, 'SJIS', 'AUTO');
703 } else {
704 $ret = mb_convert_encoding($ret, 'EUC-JP', 'AUTO');
705}
706 break;
e842b215 707 case 'wordwrap':
708 $no_begin = "\x21\x25\x29\x2c\x2e\x3a\x3b\x3f\x5d\x7d\xa1\xf1\xa1\xeb\xa1" .
709 "\xc7\xa1\xc9\xa2\xf3\xa1\xec\xa1\xed\xa1\xee\xa1\xa2\xa1\xa3\xa1\xb9" .
710 "\xa1\xd3\xa1\xd5\xa1\xd7\xa1\xd9\xa1\xdb\xa1\xcd\xa4\xa1\xa4\xa3\xa4" .
711 "\xa5\xa4\xa7\xa4\xa9\xa4\xc3\xa4\xe3\xa4\xe5\xa4\xe7\xa4\xee\xa1\xab" .
712 "\xa1\xac\xa1\xb5\xa1\xb6\xa5\xa1\xa5\xa3\xa5\xa5\xa5\xa7\xa5\xa9\xa5" .
713 "\xc3\xa5\xe3\xa5\xe5\xa5\xe7\xa5\xee\xa5\xf5\xa5\xf6\xa1\xa6\xa1\xbc" .
714 "\xa1\xb3\xa1\xb4\xa1\xaa\xa1\xf3\xa1\xcb\xa1\xa4\xa1\xa5\xa1\xa7\xa1" .
715 "\xa8\xa1\xa9\xa1\xcf\xa1\xd1";
716 $no_end = "\x5c\x24\x28\x5b\x7b\xa1\xf2\x5c\xa1\xc6\xa1\xc8\xa1\xd2\xa1" .
717 "\xd4\xa1\xd6\xa1\xd8\xa1\xda\xa1\xcc\xa1\xf0\xa1\xca\xa1\xce\xa1\xd0\xa1\xef";
718 $wrap = func_get_arg(2);
719
720 if (strlen($ret) >= $wrap &&
721 substr($ret, 0, 1) != '>' &&
722 strpos($ret, 'http://') === FALSE &&
723 strpos($ret, 'https://') === FALSE &&
724 strpos($ret, 'ftp://') === FALSE) {
725
726 $ret = mb_convert_kana($ret, "KV");
727
728 $line_new = '';
729 $ptr = 0;
730
731 while ($ptr < strlen($ret) - 1) {
732 $l = mb_strcut($ret, $ptr, $wrap);
733 $ptr += strlen($l);
734 $tmp = $l;
735
736 $l = mb_strcut($ret, $ptr, 2);
737 while (strlen($l) != 0 && mb_strpos($no_begin, $l) !== FALSE ) {
738 $tmp .= $l;
739 $ptr += strlen($l);
740 $l = mb_strcut($ret, $ptr, 1);
741 }
742 $line_new .= $tmp;
743 if ($ptr < strlen($ret) - 1)
744 $line_new .= "\n";
745 }
746 $ret = $line_new;
747 }
748 break;
749 case 'utf7-imap_encode':
750 $ret = mb_convert_encoding($ret, 'UTF7-IMAP', 'EUC-JP');
751 break;
752 case 'utf7-imap_decode':
753 $ret = mb_convert_encoding($ret, 'EUC-JP', 'UTF7-IMAP');
754 break;
1d33e35e 755 }
756 }
757 return $ret;
758}
759
760
761/*
762 * Korean charset extra function
763 * Hangul(Korean Character) Attached File Name Fix.
764 */
765function korean_charset_xtra() {
766
767 $ret = func_get_arg(1); /* default return value */
768 if (func_get_arg(0) == 'downloadfilename') { /* action */
769 $ret = str_replace("\x0D\x0A", '', $ret); /* Hanmail's CR/LF Clear */
770 for ($i=0;$i<strlen($ret);$i++) {
771 if ($ret[$i] >= "\xA1" && $ret[$i] <= "\xFE") { /* 0xA1 - 0XFE are Valid */
772 $i++;
773 continue;
774 } else if (($ret[$i] >= 'a' && $ret[$i] <= 'z') || /* From Original ereg_replace in download.php */
775 ($ret[$i] >= 'A' && $ret[$i] <= 'Z') ||
776 ($ret[$i] == '.') || ($ret[$i] == '-')) {
777 continue;
778 } else {
779 $ret[$i] = '_';
780 }
781 }
782
783 }
784
785 return $ret;
786}
787
9af9c0a2 788/*
789 * This function can be used to replace non-braking space symbols
790 * that are inserted in forms by some browsers instead of normal
791 * space symbol.
792 */
793function cleanup_nbsp($string,$charset) {
794
795 // reduce number of case statements
796 if (stristr('iso-8859-',substr($charset,0,9))){
797 $output_charset="iso-8859-x";
798 }
799 if (stristr('windows-125',substr($charset,0,11))){
800 $output_charset="cp125x";
801 }
802 if (stristr('koi8',substr($charset,0,4))){
803 $output_charset="koi8-x";
804 }
805 if (! isset($output_charset)){
806 $output_charset=strtolower($charset);
807 }
808
809// where is non-braking space symbol
810switch($output_charset):
811 case "iso-8859-x":
97b9c02f 812 case "cp125x":
813 case "iso-2022-jp":
9af9c0a2 814 $nbsp="\xA0";
815 break;
9af9c0a2 816 case "koi8-x":
817 $nbsp="\x9A";
818 break;
819 case "utf-8":
820 $nbsp="\xC2\xA0";
821 break;
9af9c0a2 822 default:
823 // don't change string if charset is unmatched
824 return $string;
825endswitch;
826
827// return space instead of non-braking space.
828 return str_replace($nbsp,' ',$string);
829}
060c9483 830?>