Adding myself.
[squirrelmail.git] / functions / i18n.php
index 8ff0dae4b6e266f7e32bd7ce7cf69e6d5b37c24e..de0115f91ec4265b6a56c44e07a4aecf29895194 100644 (file)
@@ -1,16 +1,16 @@
 <?php
+
 /**
  * SquirrelMail internationalization functions
  *
- * Copyright (c) 1999-2005 The SquirrelMail Project Team
- * Licensed under the GNU GPL. For full terms see the file COPYING.
- *
  * This file contains variuos functions that are needed to do
  * internationalization of SquirrelMail.
  *
  * Internally the output character set is used. Other characters are
  * encoded using Unicode entities according to HTML 4.0.
  *
+ * @copyright &copy; 1999-2006 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package squirrelmail
  * @subpackage i18n
@@ -109,9 +109,11 @@ function sq_setlocale($category,$locale) {
  * @param string $string Text to be decoded
  * @param boolean $force_decode converts string to html without $charset!=$default_charset check.
  * Argument is available since 1.5.1 and 1.4.5.
+ * @param boolean $save_html disables htmlspecialchars() in order to preserve 
+ *  html formating. Use with care. Available since 1.5.1
  * @return string decoded string
  */
-function charset_decode ($charset, $string, $force_decode=false) {
+function charset_decode ($charset, $string, $force_decode=false, $save_html=false) {
     global $languages, $squirrelmail_language, $default_charset;
     global $use_php_recode, $use_php_iconv, $aggressive_decoding;
 
@@ -132,7 +134,7 @@ function charset_decode ($charset, $string, $force_decode=false) {
 
     // Don't do conversion if charset is the same.
     if ( ! $force_decode && $charset == strtolower($default_charset) )
-        return htmlspecialchars($string);
+        return ($save_html ? $string : htmlspecialchars($string));
 
     // catch iso-8859-8-i thing
     if ( $charset == "iso-8859-8-i" )
@@ -148,11 +150,15 @@ function charset_decode ($charset, $string, $force_decode=false) {
             // other charsets can be converted to utf-8 without loss.
             // and output string is smaller
             $string = recode_string($charset . "..utf-8",$string);
-            return htmlspecialchars($string);
+            return ($save_html ? $string : htmlspecialchars($string));
         } else {
             $string = recode_string($charset . "..html",$string);
             // recode does not convert single quote, htmlspecialchars does.
             $string = str_replace("'", '&#039;', $string);
+            // undo html specialchars
+            if ($save_html) 
+                $string=str_replace(array('&amp;','&quot;','&lt;','&gt;'),
+                                    array('&','"','<','>'),$string);
             return $string;
         }
     }
@@ -160,14 +166,13 @@ function charset_decode ($charset, $string, $force_decode=false) {
     // iconv functions does not have html target and can be used only with utf-8
     if ( $use_php_iconv && $default_charset=='utf-8') {
         $string = iconv($charset,$default_charset,$string);
-        return htmlspecialchars($string);
+        return ($save_html ? $string : htmlspecialchars($string));
     }
 
     // If we don't use recode and iconv, we'll do it old way.
 
     /* All HTML special characters are 7 bit and can be replaced first */
-
-    $string = htmlspecialchars ($string);
+    if (! $save_html) $string = htmlspecialchars ($string);
 
     /* controls cpu and memory intensive decoding cycles */
     if (! isset($aggressive_decoding) || $aggressive_decoding=="" ) {
@@ -177,7 +182,8 @@ function charset_decode ($charset, $string, $force_decode=false) {
     $decodefile=SM_PATH . 'functions/decode/' . $decode . '.php';
     if (file_exists($decodefile)) {
         include_once($decodefile);
-        $ret = call_user_func('charset_decode_'.$decode, $string);
+        // send $save_html argument to decoding function. needed for iso-2022-xx decoding.
+        $ret = call_user_func('charset_decode_'.$decode, $string, $save_html);
     } else {
         $ret = $string;
     }
@@ -255,6 +261,13 @@ function fixcharset($charset) {
      */
     $charset=preg_replace("/[-:.\/\\\]/",'_',$charset);
 
+    // OE ks_c_5601_1987 > cp949 
+    $charset=str_replace('ks_c_5601_1987','cp949',$charset);
+    // Moz x-euc-tw > euc-tw
+    $charset=str_replace('x_euc','euc',$charset);
+    // Moz x-windows-949 > cp949
+    $charset=str_replace('x_windows_','cp',$charset);
+
     // windows-125x and cp125x charsets
     $charset=str_replace('windows_','cp',$charset);
 
@@ -682,16 +695,21 @@ $languages['en']['ALIAS'] = 'en_US';
  * Solution for bug. 1240889.
  * setup.php file can contain $languages array entries and XTRA_CODE functions.
  */
-foreach(glob(SM_PATH.'locale/*') as $lang_dir) {
-    // remove trailing slash, if present
-    if (substr($lang_dir,-1)=='/') {
-        $lang_dir = substr($lang_dir,0,-1);
-    }
-    // load language setup
-    if (is_dir(SM_PATH.'locale/'.$lang_dir) && 
-        file_exists(SM_PATH.'locale/'.$lang_dir.'/setup.php')) {
-        include_once(SM_PATH.'locale/'.$lang_dir.'/setup.php');
+if (is_dir(SM_PATH . 'locale') &&
+    is_readable(SM_PATH . 'locale')) {
+    $localedir = dir(SM_PATH . 'locale');
+    while($lang_dir=$localedir->read()) {
+        // remove trailing slash, if present
+        if (substr($lang_dir,-1)=='/') {
+            $lang_dir = substr($lang_dir,0,-1);
+        }
+        if ($lang_dir != '..' && $lang_dir != '.' && $lang_dir != 'CVS' &&
+            is_dir(SM_PATH.'locale/'.$lang_dir) && 
+            file_exists(SM_PATH.'locale/'.$lang_dir.'/setup.php')) {
+            include_once(SM_PATH.'locale/'.$lang_dir.'/setup.php');
+        }
     }
+    $localedir->close();
 }
 
 /* Detect whether gettext is installed. */