Use compatibility_info() function if at all possible instead of compatibility_version()
[squirrelmail.git] / plugins / translate / functions.php
index 2c3a96bd9c1f5674dbcf4da9bdf3d1fcea8937b8..0d77939d0f0a1ed48be95469b70c444deab1724b 100644 (file)
@@ -1,15 +1,23 @@
 <?php
+
 /**
  * SquirrelMail translate plugin functions
  *
- * Copyright (c) 2004 The SquirrelMail Project Team
- * Licensed under the GNU GPL. For full terms see the file COPYING.
- *
+ * @copyright &copy; 2004-2007 The SquirrelMail Project Team
+ * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  * @version $Id$
  * @package plugins
  * @subpackage translate
  */
 
+/**
+ * do not allow to call this file directly
+ */
+if ((isset($_SERVER['SCRIPT_FILENAME']) && $_SERVER['SCRIPT_FILENAME'] == __FILE__) ||
+     (isset($HTTP_SERVER_SERVER['SCRIPT_FILENAME']) && $HTTP_SERVER_SERVER['SCRIPT_FILENAME'] == __FILE__) ) {
+    header("Location: ../../src/login.php");
+    die();
+}
 /** Load default config */
 if (file_exists(SM_PATH . 'plugins/translate/config_default.php')) {
     include_once(SM_PATH . 'plugins/translate/config_default.php');
@@ -39,6 +47,8 @@ if (file_exists(SM_PATH . 'plugins/translate/config_default.php')) {
     $translate_gpltrans_enabled=true;
     global $translate_custom_enabled;
     $translate_custom_enabled=false;
+    // This is logged error message. Don't translate it.
+    error_log('SquirrelMail: default configuration file removed in translate plugin.');
 }
 
 /** Load site config */
@@ -50,8 +60,8 @@ if (file_exists(SM_PATH . 'config/translate_config.php')) {
 
 /** Setup functions */
 
-/** 
- * Shows translation box in message display window 
+/**
+ * Shows translation box in message display window
  * @access private
  */
 function translate_read_form_function() {
@@ -65,6 +75,8 @@ function translate_read_form_function() {
         $translate_dictionary_enabled, $translate_google_enabled,
         $translate_gpltrans_enabled, $translate_intertran_enabled,
         $translate_promt_enabled, $translate_otenet_enabled;
+    global $translate_custom_enabled;
+
 
     if (!$translate_show_read) {
         return;
@@ -73,44 +85,54 @@ function translate_read_form_function() {
     $translate_server_option='translate_' . $translate_server . '_enabled';
     if ($translate_server=='gpltrans' && $translate_gpltrans_url=='' ||
         ! $$translate_server_option || ! function_exists('translate_form_' . $translate_server)) {
-        error_box(_("Selected translation engine is disabled. Please update your translation preferences."),$color);
-       return;
+        error_box(_("Selected translation engine is disabled. Please update your translation preferences."));
+        return;
     }
     $translate_dir = 'to';
 
     $trans_ar = $message->findDisplayEntity(array(), array('text/plain'));
     $body = '';
-    if ($trans_ar[0] != '') {
+    $final_body = '';
+    if ( !empty($trans_ar[0]) ) {
         for ($i = 0; $i < count($trans_ar); $i++) {
-            $body .= formatBody($imapConnection, $message, $color, $wrap_at, $trans_ar[$i], $passed_id, $mailbox);
+            /* reduced version of formatBody and translateText functions */
+
+            // get message entity information
+            $body_message = getEntity($message, $trans_ar[$i]);
+            // get message body
+            $body = mime_fetch_body ($imapConnection, $passed_id, $trans_ar[$i]);
+            // convert encoded messages
+            $body = decodeBody($body, $body_message->header->encoding);
+
+            /*
+             * if message part is html formated - convert spaces, html line feeds,
+             * less than and greater than html entities and remove tags
+             */
+            if ($body_message->header->type1 == 'html') {
+                $entity_conv = array('&nbsp;' => ' ',
+                                     '<p>'    => "\n",
+                                     '<P>'    => "\n",
+                                     '<br>'   => "\n",
+                                     '<BR>'   => "\n",
+                                     '<br />' => "\n",
+                                     '<BR />' => "\n",
+                                     '&gt;'   => '>',
+                                     '&lt;'   => '<');
+                $body = strtr($body, $entity_conv);
+                $body = strip_tags($body);
+            }
+            // remove whitespace
+            $body = trim($body);
+            // save processed text and parse other entity
+            $final_body.= charset_decode($body_message->header->getParameter('charset'),$body);
         }
-        $hookResults = do_hook('message_body', $body);
-        $body = $hookResults[1];
-    } else {
-        $body = 'Message can\'t be translated';
-    }
 
-    $new_body = $body;
-    $pos = strpos($new_body,
-        '">'. _("Download this as a file") . '</a></center><br /></small>');
-    if (is_int($pos)) {
-        $new_body = substr($new_body, 0, $pos);
+        // add form if message is not empty
+        if (!empty($final_body)) {
+            $function = 'translate_form_' . $translate_server;
+            $function($final_body);
+        }
     }
-
-    $trans = get_html_translation_table(HTML_ENTITIES);
-    $trans[' '] = '&nbsp;';
-    $trans = array_flip($trans);
-    $new_body = strtr($new_body, $trans);
-
-    $new_body = urldecode($new_body);
-    $new_body = strip_tags($new_body);
-
-    /* I really don't like this next part ... */
-    $new_body = str_replace('"', "''", $new_body);
-    $new_body = strtr($new_body, "\n", ' ');
-
-    $function = 'translate_form_' . $translate_server;
-    $function($new_body);
 }
 
 /**
@@ -131,7 +153,7 @@ function translate_optpage_function() {
  * Gets user's translation preferences
  * @access private
  */
-function translate_pref_function() { 
+function translate_pref_function() {
     global $username, $data_dir;
     global $translate_server, $translate_location;
     global $translate_show_send, $translate_show_read;
@@ -139,10 +161,7 @@ function translate_pref_function() {
 
     $translate_server = getPref($data_dir, $username, 'translate_server',$translate_default_engine);
 
-    $translate_location = getPref($data_dir, $username, 'translate_location');
-    if ($translate_location == '') {
-        $translate_location = 'center';
-    }
+    $translate_location = getPref($data_dir, $username, 'translate_location','center');
 
     $translate_show_send = getPref($data_dir, $username, 'translate_show_send');
     $translate_show_read = getPref($data_dir, $username, 'translate_show_read');
@@ -163,24 +182,75 @@ function translate_button_function() {
     }
 }
 
+/**
+ * Save translation options
+ */
+function translate_save_function() {
+    global $username, $data_dir;
+    // Save preferences
+    if (sqgetGlobalVar('submit_translate',$tmp,SQ_POST)) {
+        if (sqgetGlobalVar('translate_translate_server',$translate_server,SQ_POST)) {
+            setPref($data_dir, $username, 'translate_server', $translate_server);
+        } else {
+            setPref($data_dir, $username, 'translate_server', $translate_default_engine);
+        }
+
+        if (sqgetGlobalVar('translate_translate_location',$translate_location,SQ_POST)) {
+            setPref($data_dir, $username, 'translate_location', $translate_location);
+        } else {
+            setPref($data_dir, $username, 'translate_location', 'center');
+        }
+
+        if (sqgetGlobalVar('translate_translate_show_read',$translate_show_read,SQ_POST)) {
+            setPref($data_dir, $username, 'translate_show_read', '1');
+        } else {
+            setPref($data_dir, $username, 'translate_show_read', '');
+        }
+
+        if (sqgetGlobalVar('translate_translate_show_send',$translate_show_send,SQ_POST)) {
+            setPref($data_dir, $username, 'translate_show_send', '1');
+        } else {
+            setPref($data_dir, $username, 'translate_show_send', '');
+        }
+
+        if (sqgetGlobalVar('translate_translate_same_window',$translate_same_windows,SQ_POST)) {
+            setPref($data_dir, $username, 'translate_same_window', '1');
+        } else {
+            setPref($data_dir, $username, 'translate_same_window', '');
+        }
+    }
+}
+
+/**
+ * Set option page name
+ * @access private
+ */
+function translate_set_loadinfo_function() {
+    global $optpage, $optpage_name;
+    if ($optpage=='translate') {
+        $optpage_name=_("Translation Preferences");
+    }
+}
+
 /** Option functions */
 
 /**
- *
+ * Creates server selection options
+ * @access private
  */
 function translate_showoption() {
     global $translate_babelfish_enabled, $translate_go_enabled,
         $translate_dictionary_enabled, $translate_google_enabled,
         $translate_gpltrans_enabled, $translate_intertran_enabled,
         $translate_promt_enabled, $translate_otenet_enabled;
-    global $translate_custom_enabled;
+    global $translate_custom_enabled, $translate_gpltrans_url;
 
     if ($translate_babelfish_enabled) translate_showoption_internal('server','babelfish', 'Babelfish');
     if ($translate_go_enabled) translate_showoption_internal('server','go', 'Go.com');
     if ($translate_dictionary_enabled) translate_showoption_internal('server','dictionary', 'Dictionary.com');
     if ($translate_google_enabled) translate_showoption_internal('server','google', 'Google Translate');
-    if ($translate_gpltrans_enabled && $translate_gpltrans_url!='') 
-        translate_showoption_internal('server','gpltrans', 'GPLTrans'); 
+    if ($translate_gpltrans_enabled && $translate_gpltrans_url!='')
+        translate_showoption_internal('server','gpltrans', 'GPLTrans');
     if ($translate_intertran_enabled) translate_showoption_internal('server','intertran', 'Intertran');
     if ($translate_otenet_enabled) translate_showoption_internal('server','otenet', 'OTEnet');
     if ($translate_promt_enabled) translate_showoption_internal('server','promt', 'PROMT');
@@ -190,7 +260,8 @@ function translate_showoption() {
 }
 
 /**
- *
+ * Displays comments about available translation engines
+ * @access private
  */
 function translate_showtrad() {
     global $translate_babelfish_enabled, $translate_go_enabled,
@@ -200,36 +271,36 @@ function translate_showtrad() {
     global $translate_gpltrans_url, $translate_custom_enabled;
 
     if ($translate_babelfish_enabled) translate_showtrad_internal( 'Babelfish',
-              _("Maximum of 1000 characters translated, powered by Systran").
-             "<br />".sprintf(_("Number of supported language pairs: %s"),"19")." " ,
+              _("Maximum of 150 words translated, powered by Systran").
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'36').' ' ,
               'http://babelfish.altavista.com/' );
     if ($translate_go_enabled) translate_showtrad_internal( 'Translator.Go.com',
               _("Maximum of 25 kilobytes translated, powered by Systran").
-         "<br />".sprintf(_("Number of supported language pairs: %s"),"10")." " ,
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'10').' ' ,
               'http://translator.go.com/' );
     if ($translate_dictionary_enabled) translate_showtrad_internal( 'Dictionary.com',
               _("No known limits, powered by Systran").
-             "<br />".sprintf(_("Number of supported language pairs: %s"),"24")." " ,
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'24').' ' ,
               'http://www.dictionary.com/translate' );
     if ($translate_google_enabled) translate_showtrad_internal( 'Google Translate',
               _("No known limits, powered by Systran").
-             "<br />".sprintf(_("Number of supported language pairs: %s"),"12")." " ,
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'20').' ' ,
               'http://www.google.com/translate' );
     if ($translate_gpltrans_enabled && $translate_gpltrans_url!='') translate_showtrad_internal( 'GPLTrans',
               _("No known limits, powered by GPLTrans (free, open source)").
-             "<br />".sprintf(_("Number of supported language pairs: %s"),"16")." " ,
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'16').' ' ,
               'http://www.translator.cx/' );
     if ($translate_intertran_enabled) translate_showtrad_internal( 'InterTran',
               _("No known limits, powered by Translation Experts' InterTran").
-             "<br />".sprintf(_("Number of supported languages: %s"),"29")." " ,
+              '<br />'.sprintf(_("Number of supported languages: %s"),'29').' ' ,
               'http://www.tranexp.com/' );
     if ($translate_otenet_enabled) translate_showtrad_internal( 'OTEnet',
               _("Hellenic translations, no known limits, powered by Systran").
-             "<br />".sprintf(_("Number of supported language pairs: %s"),"20")." " ,
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'20').' ' ,
               'http://systran.otenet.gr/' );
     if ($translate_promt_enabled) translate_showtrad_internal( 'PROMT',
               _("Russian translations, maximum of 500 characters translated").
-             "<br />".sprintf(_("Number of supported language pairs: %s"),"13")." " ,
+              '<br />'.sprintf(_("Number of supported language pairs: %s"),'16').' ' ,
               'http://www.online-translator.com/' );
 
     if ($translate_custom_enabled && function_exists('translate_custom_showtrad')) {
@@ -363,10 +434,12 @@ function translate_lang_opt($from, $to, $value, $text) {
  * Starts translation box
  *
  * @param string $action url that has to recieve message for translation
+ * @param string $charset (since sm 1.5.1) character set, that should be used
+ * to submit 8bit information.
  * @access private
  */
-function translate_new_form($action) {
-    global $translate_dir, $translate_new_window, $translate_location;
+function translate_new_form($action,$charset=null) {
+    global $translate_dir, $translate_location;
     global $color, $translate_same_window;
 
     echo '<form action="';
@@ -383,12 +456,15 @@ function translate_new_form($action) {
         echo ' target="_blank"';
     }
 
+    if (! is_null($charset))
+        echo ' accept-charset="'.htmlspecialchars($charset).'"';
+
     echo ">\n";
 
-    ?><table align="<?php echo $translate_location ?>" cellpadding=3 cellspacing=0 border=0 bgcolor=<?php echo $color[10] ?>>
+    ?><table align="<?php echo $translate_location; ?>" cellpadding="3" cellspacing="0" border="0" bgcolor="<?php echo $color[10]; ?>">
     <tr>
       <td>
-        <table cellpadding=2 cellspacing=1 border=0 bgcolor="<?php echo $color[5] ?>">
+        <table cellpadding="2" cellspacing="1" border="0" bgcolor="<?php echo $color[5]; ?>">
           <tr>
             <td><?php
 }
@@ -400,21 +476,29 @@ function translate_new_form($action) {
  * @access private
  */
 function translate_form_babelfish($message) {
-    translate_new_form('http://babelfish.altavista.com/babelfish/tr');
+    translate_new_form('http://babelfish.altavista.com/babelfish/tr','utf-8');
 ?>
     <input type="hidden" name="doit" value="done" />
     <input type="hidden" name="intl" value="1" />
     <input type="hidden" name="tt" value="urltext" />
     <input type="hidden" name="trtext" value="<?php echo $message; ?>" />
     <select name="lp"><?php
-        echo translate_lang_opt('en_US', 'zh_CN', 'en_zh',
-                                sprintf( _("%s to %s"),_("English"),_("Chinese Simplified"))) .
+        echo translate_lang_opt('zh_CN',  '',     'zh_en',
+                            sprintf( _("%s to %s"),_("Chinese, Simplified"),_("English"))) .
+         translate_lang_opt('zh_TW',  '',     'zt_en',
+                            sprintf( _("%s to %s"),_("Chinese, Traditional"),_("English"))) .
+         translate_lang_opt('en_US', 'zh_CN', 'en_zh',
+                            sprintf( _("%s to %s"),_("English"),_("Chinese, Simplified"))) .
          translate_lang_opt('en_US', 'zh_TW', 'en_zt',
-                            sprintf( _("%s to %s"),_("English"),_("Chinese Traditional"))) .
+                            sprintf( _("%s to %s"),_("English"),_("Chinese, Traditional"))) .
+         translate_lang_opt('en_US', 'nl_NL',  'en_nl',
+                            sprintf( _("%s to %s"),_("English"),_("Dutch"))) .
          translate_lang_opt('en_US', 'fr_FR',  'en_fr',
                             sprintf( _("%s to %s"),_("English"),_("French"))) .
          translate_lang_opt('en_US', 'de_DE', 'en_de',
                             sprintf( _("%s to %s"),_("English"),_("German"))) .
+         translate_lang_opt('en_US', 'el_GR',  'en_el',
+                            sprintf( _("%s to %s"),_("English"),_("Greek"))) .
          translate_lang_opt('en_US', 'it_IT', 'en_it',
                             sprintf( _("%s to %s"),_("English"),_("Italian"))) .
          translate_lang_opt('en_US', 'ja_JP', 'en_ja',
@@ -423,32 +507,54 @@ function translate_form_babelfish($message) {
                             sprintf( _("%s to %s"),_("English"),_("Korean"))) .
          translate_lang_opt('en_US', 'pt*',   'en_pt',
                             sprintf( _("%s to %s"),_("English"),_("Portuguese"))) .
+         translate_lang_opt('en_US', 'ru_RU',  'en_ru',
+                            sprintf( _("%s to %s"),_("English"),_("Russian"))) .
          translate_lang_opt('en_US', 'es_ES', 'en_es',
                             sprintf( _("%s to %s"),_("English"),_("Spanish"))) .
-         translate_lang_opt('zh_CN',  '',     'zh_en',
-                            sprintf( _("%s to %s"),_("Chinese Simplified"),_("English"))) .
-         translate_lang_opt('zh_TW',  '',     'zt_en',
-                            sprintf( _("%s to %s"),_("Chinese Traditional"),_("English"))) .
+         translate_lang_opt('nl_NL', '',      'nl_en',
+                            sprintf( _("%s to %s"),_("Dutch"),_("English"))) .
+         translate_lang_opt('nl_NL', '',      'nl_fr',
+                            sprintf( _("%s to %s"),_("Dutch"),_("French"))) .
          translate_lang_opt('fr_FR', '',      'fr_en',
                             sprintf( _("%s to %s"),_("French"),_("English"))) .
+         translate_lang_opt('fr_FR',  '',     'fr_de',
+                            sprintf( _("%s to %s"),_("French"),_("German"))) .
+         translate_lang_opt('fr_FR',  '',     'fr_el',
+                            sprintf( _("%s to %s"),_("French"),_("Greek"))) .
+         translate_lang_opt('fr_FR',  '',     'fr_it',
+                            sprintf( _("%s to %s"),_("French"),_("Italian"))) .
+         translate_lang_opt('fr_FR',  '',     'fr_pt',
+                            sprintf( _("%s to %s"),_("French"),_("Portuguese"))) .
+         translate_lang_opt('fr_FR',  '',     'fr_nl',
+                            sprintf( _("%s to %s"),_("French"),_("Dutch"))) .
+         translate_lang_opt('fr_FR',  '',     'fr_es',
+                            sprintf( _("%s to %s"),_("French"),_("Spanish"))) .
          translate_lang_opt('de_DE', 'en_US', 'de_en',
                             sprintf( _("%s to %s"),_("German"),_("English"))) .
+         translate_lang_opt('de_DE',  '',     'de_fr',
+                            sprintf( _("%s to %s"),_("German"),_("French"))) .
+         translate_lang_opt('el_GR', '',      'el_en',
+                            sprintf( _("%s to %s"),_("Greek"),_("English"))) .
+         translate_lang_opt('el_GR', '',      'el_fr',
+                            sprintf( _("%s to %s"),_("Greek"),_("French"))) .
          translate_lang_opt('it_IT', '',      'it_en',
                             sprintf( _("%s to %s"),_("Italian"),_("English"))) .
-         translate_lang_opt('ja_JP',  '',    'ja_en',
+         translate_lang_opt('it_IT', '',      'it_fr',
+                            sprintf( _("%s to %s"),_("Italian"),_("French"))) .
+         translate_lang_opt('ja_JP',  '',     'ja_en',
                             sprintf( _("%s to %s"),_("Japanese"),_("English"))) .
-         translate_lang_opt('ko_KR',  '',    'ko_en',
+         translate_lang_opt('ko_KR',  '',     'ko_en',
                             sprintf( _("%s to %s"),_("Korean"),_("English"))) .
-         translate_lang_opt('pt*',    '',    'pt_en',
+         translate_lang_opt('pt*',    '',     'pt_en',
                             sprintf( _("%s to %s"),_("Portuguese"),_("English"))) .
-         translate_lang_opt('es_ES',  '',    'es_en',
+         translate_lang_opt('pt*',    '',     'pt_fr',
+                            sprintf( _("%s to %s"),_("Portuguese"),_("French"))) .
+         translate_lang_opt('ru_RU',  '',     'ru_en',
+                            sprintf( _("%s to %s"),_("Russian"),_("English"))) .
+         translate_lang_opt('es_ES',  '',     'es_en',
                             sprintf( _("%s to %s"),_("Spanish"),_("English"))) .
-         translate_lang_opt('de_DE',  '',    'de_fr',
-                            sprintf( _("%s to %s"),_("German"),_("French"))) .
-         translate_lang_opt('fr_FR',  '',    'fr_de',
-                            sprintf( _("%s to %s"),_("French"),_("German"))) .
-         translate_lang_opt('ru_RU',  '',    'ru_en',
-                            sprintf( _("%s to %s"),_("Russian"),_("English")));
+         translate_lang_opt('es_ES',  '',     'es_fr',
+                            sprintf( _("%s to %s"),_("Spanish"),_("French")));
     echo '</select>'.
          'Babelfish: <input type="submit" value="' . _("Translate") . '" />';
 
@@ -500,9 +606,10 @@ function translate_form_go($message) {
  * @access private
  */
 function translate_form_intertran($message) {
-    translate_new_form('http://www.tranexp.com:2000/InterTran');
+    translate_new_form('http://intertran.tranexp.com/Translate/result.shtml');
     echo '<input type="hidden" name="topframe" value="yes" />'.
          '<input type="hidden" name="type" value="text" />'.
+         '<input type="hidden" name="keyb" value="non" />'.
          '<input type="hidden" name="text" value="'.$message.'" />';
 
     $left = '<select name="from">' .
@@ -581,7 +688,13 @@ function translate_form_intertran($message) {
  * @access private
  */
 function translate_form_gpltrans($message) {
-    translate_new_form('http://www.translator.cx/cgi-bin/gplTrans');
+    global $translate_gpltrans_url;
+
+    // make sure that it is not empty
+    if ($translate_gpltrans_url=='')
+        $translate_gpltrans_url='http://www.translator.cx/cgi-bin/gplTrans';
+
+    translate_new_form($translate_gpltrans_url);
     echo '<select name="language">'.
         translate_lang_opt('', 'nl_NL', 'dutch_dict',      _("Dutch")).
         translate_lang_opt('', 'fr_FR', 'french_dict',     _("French")).
@@ -609,15 +722,15 @@ function translate_form_gpltrans($message) {
  */
 function translate_form_dictionary($message) {
     translate_new_form('http://dictionary.reference.com/translate/text.html');
-    list($usec, $sec) = explode(" ",microtime());
+    list($usec, $sec) = explode(' ',microtime());
     $time = $sec . (float)$usec*100000000;
     echo '<input type="hidden" name="text" value="'.$message.'" />'.
-         '<input type="hidden" name="r" value="'.$time.'" />'.
+         '<input type="hidden" name="ts" value="'.$time.'" />'.
          '<select name="lp">'.
          translate_lang_opt('en_US', 'zh_CN', 'en_zh',
-                            sprintf( _("%s to %s"),_("English"),_("Simplified Chinese"))) .
+                            sprintf( _("%s to %s"),_("English"),_("Chinese, Simplified"))) .
          translate_lang_opt('en_US', 'zh_TW', 'en_zt',
-                            sprintf( _("%s to %s"),_("English"),_("Traditional Chinese"))) .
+                            sprintf( _("%s to %s"),_("English"),_("Chinese, Traditional"))) .
          translate_lang_opt('en_US', 'nl_NL', 'en_nl',
                             sprintf( _("%s to %s"),_("English"),_("Dutch"))) .
          translate_lang_opt('en_US', 'fr_FR', 'en_fr',
@@ -639,9 +752,9 @@ function translate_form_dictionary($message) {
          translate_lang_opt('en_US', 'es_ES', 'en_es',
                             sprintf( _("%s to %s"),_("English"),_("Spanish"))) .
          translate_lang_opt('zh_CN',  '',     'zh_en',
-                            sprintf( _("%s to %s"),_("Simplified Chinese"),_("English"))) .
+                            sprintf( _("%s to %s"),_("Chinese, Simplified"),_("English"))) .
          translate_lang_opt('zh_TW',  '',     'zt_en',
-                            sprintf( _("%s to %s"),_("Traditional Chinese"),_("English"))) .
+                            sprintf( _("%s to %s"),_("Chinese, Traditional"),_("English"))) .
          translate_lang_opt('nl_NL',  '',     'nl_en',
                             sprintf( _("%s to %s"),_("Dutch"),_("English"))) .
          translate_lang_opt('fr_FR',  '',     'fr_en',
@@ -675,7 +788,7 @@ function translate_form_dictionary($message) {
  * @access private
  */
 function translate_form_otenet($message) {
-    translate_new_form('http://systran.otenet.gr/cgi-bin/systran.cgi');
+    translate_new_form('http://trans.otenet.gr/systran/box','windows-1253');
 ?>
     <input type="hidden" name="doit" value="done" />
     <input type="hidden" name="partner" value="OTEnet-en" />
@@ -735,7 +848,7 @@ function translate_form_otenet($message) {
  * @access private
  */
 function translate_form_promt($message) {
-    translate_new_form('http://www.online-translator.com/text.asp#tr_form');
+    translate_new_form('http://www.online-translator.com/text.asp#tr_form','windows-1251');
     echo '<input type="hidden" name="status" value="translate" />';
     echo '<input type="hidden" name="source" value="'.$message.'" />';
     echo _("Interface language")." : ";
@@ -773,9 +886,16 @@ function translate_form_promt($message) {
             translate_lang_opt('en_US', '',      'es',
                                sprintf( _("%s to %s"),_("English"),_("Spanish"))) .
             translate_lang_opt('es_ES', '',  'se',
-                               sprintf( _("%s to %s"),_("Spanish"),_("English"))) ;
+                               sprintf( _("%s to %s"),_("Spanish"),_("English"))) .
+            translate_lang_opt('en_US', '',  'ef',
+                               sprintf( _("%s to %s"),_("English"),_("French"))) .
+            translate_lang_opt('fr_FR', '',  'fe',
+                               sprintf( _("%s to %s"),_("French"),_("English"))) .
+            translate_lang_opt('en_US', '',  'ep',
+                               sprintf( _("%s to %s"),_("English"),_("Portuguese")));
     echo "</select><br />\n";
     echo "<input type=\"hidden\" name=\"template\" value=\"General\" />\n";
+    echo _("Transliterate unknown words:") . '<input type="checkbox" id="transliterate" name="transliterate" /><br />';
     echo 'PROMT: <input type="submit" value="' . _("Translate") . '" />';
 
     translate_table_end();
@@ -788,15 +908,11 @@ function translate_form_promt($message) {
  * @access private
  */
 function translate_form_google($message) {
-    translate_new_form('http://www.google.com/translate_t');
-?>
-    <input type="hidden" name="ie" value="Unknown" />
-    <input type="hidden" name="oe" value="ASCII" />
-    <input type="hidden" name="hl" value="en" />
-    <input type="hidden" name="text" value="<?php echo $message; ?>" />
-    <select name="langpair"><?php
-        echo translate_lang_opt('en_US', 'de_DE', 'en|de',
-                                sprintf( _("%s to %s"),_("English"),_("German"))) .
+    translate_new_form('http://www.google.com/translate_t','utf-8');
+    echo '<input type="hidden" name="text" value="' . $message . '" />';
+    echo '<select name="langpair">'.
+         translate_lang_opt('en_US', 'de_DE', 'en|de',
+                            sprintf( _("%s to %s"),_("English"),_("German"))) .
          translate_lang_opt('en_US', 'es_ES',  'en|es',
                             sprintf( _("%s to %s"),_("English"),_("Spanish"))) .
          translate_lang_opt('en_US', 'fr_FR', 'en|fr',
@@ -805,6 +921,14 @@ function translate_form_google($message) {
                             sprintf( _("%s to %s"),_("English"),_("Italian"))) .
          translate_lang_opt('en_US', 'pt*',   'en|pt',
                             sprintf( _("%s to %s"),_("English"),_("Portuguese"))) .
+         translate_lang_opt('en_US', 'ar',    'en|ar',
+                            sprintf( _("%s to %s"),_("English"),_("Arabic"))) .
+         translate_lang_opt('en_US', 'ja_JP', 'en|ja',
+                            sprintf( _("%s to %s"),_("English"),_("Japanese"))) .
+         translate_lang_opt('en_US', 'ko_KR', 'en|ko',
+                            sprintf( _("%s to %s"),_("English"),_("Korean"))) .
+         translate_lang_opt('en_US', 'zh_CN', 'en|zh-CN',
+                            sprintf( _("%s to %s"),_("English"),_("Chinese (Simplified)"))) .
          translate_lang_opt('de_DE', 'en_US', 'de|en',
                             sprintf( _("%s to %s"),_("German"),_("English"))) .
          translate_lang_opt('de_DE', '', 'de|fr',
@@ -818,10 +942,20 @@ function translate_form_google($message) {
          translate_lang_opt('it_IT', '', 'it|en',
                             sprintf( _("%s to %s"),_("Italian"),_("English"))) .
          translate_lang_opt('pt*',   '', 'pt|en',
-                            sprintf( _("%s to %s"),_("Portuguese"),_("English")));
+                            sprintf( _("%s to %s"),_("Portuguese"),_("English"))).
+         translate_lang_opt('ar',    '', 'ar|en',
+                            sprintf( _("%s to %s"),_("Arabic"),_("English"))).
+         translate_lang_opt('ja_JP', '', 'ja|en',
+                            sprintf( _("%s to %s"),_("Japanese"),_("English"))).
+         translate_lang_opt('ko_KR', '', 'ko|en',
+                            sprintf( _("%s to %s"),_("Korean"),_("English"))).
+         translate_lang_opt('zh_CN', '', 'zh-CN|en',
+                            sprintf( _("%s to %s"),_("Chinese (Simplified)"),_("English")));
     echo '</select>'.
-         'Google: <input type="submit" value="' . _("Translate") . '" />';
+        '<input type="hidden" name="hl" value="en" />' .
+        '<input type="hidden" name="ie" value="UTF8" />' .
+        '<input type="hidden" name="oe" value="UTF8" />' .
+        'Google: <input type="submit" value="' . _("Translate") . '" />';
 
     translate_table_end();
 }
-?>
\ No newline at end of file