Bugfix '-- ' alters strings. Added the Advanced udentities stuff.
[squirrelmail.git] / functions / gettext.php
index ba44942b9a2d685c8b9135f5b561b02d541d101d..80f3c63d1318f1af97cdb2aa6c00a608db27de80 100644 (file)
@@ -5,6 +5,9 @@
     * Uses the session for caching (speed increase)
     * Possible use in other PHP scripts?  The only SM-specific thing is
     *   $sm_language, I think
+    *
+    * Very special thanks to Konstantin Riabitsev for letting me use a
+    * server that didn't already have gettext on it!
     */
      
    if (defined('gettext_php'))
@@ -12,7 +15,7 @@
    define('gettext_php', true);
    
    global $gettext_php_domain, $gettext_php_dir, $gettext_php_loaded,
-      $gettext_php_translateStrings;
+      $gettext_php_translateStrings, $gettext_php_loaded_language;
    
    if (! isset($gettext_php_loaded)) {
       $gettext_php_loaded = false;
    }
    if (! isset($gettext_php_domain)) {
       $gettext_php_domain = '';
-      session_register('gettext_php_translateStrings');
+      session_register('gettext_php_domain');
    }
    if (! isset($gettext_php_dir)) {
       $gettext_php_dir = '';
-      session_register('gettext_php_translateStrings');
+      session_register('gettext_php_dir');
    }
    if (! isset($gettext_php_translateStrings)) {
       $gettext_php_translateStrings = array();
       session_register('gettext_php_translateStrings');
    }
+   if (! isset($gettext_php_loaded_language)) {
+      $gettext_php_loaded_language = '';
+      session_register('gettext_php_loaded_language');
+   }
 
    function gettext_php_load_strings() {
-      global $sm_language, $gettext_php_translateStrings,
-         $gettext_php_domain, $gettext_php_dir, $gettext_php_loaded;
+      global $squirrelmail_language, $gettext_php_translateStrings,
+         $gettext_php_domain, $gettext_php_dir, $gettext_php_loaded,
+         $gettext_php_loaded_language;
       
-      // $sm_language gives 'en' for English, 'de' for German, etc.
-      // I didn't wanna use getenv or similar, but you easily could change
-      // my code to do that.
+      // $squirrelmail_language gives 'en' for English, 'de' for German,
+      // etc.  I didn't wanna use getenv or similar, but you easily could
+      // change my code to do that.
       
       $gettext_php_translateStrings = array();
-      
+
       $filename = $gettext_php_dir;
       if (substr($filename, -1) != '/')
          $filename .= '/';
-      $filename .= $sm_language . '/LC_MESSAGES/' . $gettext_php_domain . '.po';
+      $filename .= $squirrelmail_language . '/LC_MESSAGES/' . 
+         $gettext_php_domain . '.po';
       
-      $file = fopen($filename, 'r');
-      if ($file === false)
-         // Uh-ho
+      $file = @fopen($filename, 'r');
+      if ($file === false) {
+         // Uh-ho -- we can't load the file.
+         // Just fake it.  :-)
+         $gettext_php_loaded = true;
          return;
+      }
          
       $key = '';
       $SkipRead = false;
@@ -71,6 +83,7 @@
                  $key .= $match[1];
                  $line = trim(fgets($file, 4096));
               }
+               $SkipRead = true;
            } else {
               // msgid "string string"
               $key = $match[1];
                  $gettext_php_translateStrings[$key] .= $match[1];
                  $line = trim(fgets($file, 4096));
               }
+               $SkipRead = true;
            } else {
               // msgstr "string string"
               $gettext_php_translateStrings[$key] = $match[1];
            }
+            $gettext_php_translateStrings[$key] =
+               stripslashes($gettext_php_translateStrings[$key]);
            $key = '';
         }
       }
       fclose($file);
-      
+
       $gettext_php_loaded = true;
+      $gettext_php_loaded_language = $squirrelmail_language;
    }
-   
+
    function _($str) {
-      global $gettext_php_loaded;
+      global $gettext_php_loaded, $gettext_php_translateStrings, 
+         $squirrelmail_language, $gettext_php_loaded_language;
         
-      if (! $gettext_php_loaded)
+      if (! $gettext_php_loaded || 
+          $gettext_php_loaded_language != $squirrelmail_language)
          gettext_php_load_strings();
-      
+
+      // Try finding the exact string      
       if (isset($gettext_php_translateStrings[$str]))
          return $gettext_php_translateStrings[$str];
+
+      // Look for a string that is very close to the one we want
+      // Very computationally expensive
+      $oldPercent = 0;
+      $oldStr = '';
+      $newPercent = 0;
+      foreach ($gettext_php_translateStrings as $k => $v) {
+         similar_text($str, $k, $newPercent);
+         if ($newPercent > $oldPercent) {
+            $oldStr = $v;
+            $oldPercent = $newPercent;
+         }
+      }
+      // Require 80% match or better
+      // Adjust to suit your needs
+      if ($oldPercent > 80) {
+         // Remember this so we don't need to search again
+         $gettext_php_translateStrings[$str] = $oldStr;
+         return $oldStr;
+      }
       
+      // Remember this so we don't need to search again
+      $gettext_php_translateStrings[$str] = $str;
       return $str;
    }
    
    function bindtextdomain($name, $dir) {
-      global $gettext_php_domain;
-      
-      $gettext_php_domain = $name;
-      $gettext_php_dir = $dir;
-      $gettext_php_loaded = false;
+      global $gettext_php_domain, $gettext_php_dir, $gettext_php_loaded;
+
+      if ($gettext_php_domain != $name) {
+         $gettext_php_domain = $name;
+         $gettext_php_loaded = false;
+      }
+      if ($gettext_php_dir != $dir) {
+         $gettext_php_dir = $dir;
+         $gettext_php_loaded = false;
+      }
       
       return $dir;
    }
    
    function textdomain($name = false) {
-      global $gettext_php_domain;
-      
-      if ($name != false)
-      {
+      global $gettext_php_domain, $gettext_php_loaded;
+
+      if ($name != false && $gettext_php_domain != $name) {
          $gettext_php_domain = $name;
         $gettext_php_loaded = false;
       }