Changeset 105924 in spip-zone


Ignore:
Timestamp:
Aug 24, 2017, 5:20:45 PM (3 years ago)
Author:
marcimat@…
Message:
  • Test de trans en ligne de commande validé (avec traduire()).
  • Le découpage des paragraphes longs doit utiliser mb_strpos !
  • Log à chaque traduction du nom du traducteur et du début du texte, mais pas de l’ensemble à traduire.
Location:
_plugins_/traduire_texte/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/traduire_texte/trunk/inc/traduire_texte.php

    r105923 r105924  
    88        /** @var string Clé d’api */
    99        public $apikey;
    10         /** @var string Chemin éventuel */
    11         public $path;
    1210        /** @var int Maximum de caractères traitables en un coup */
    1311        public $maxlen;
     
    2119        }
    2220
    23         abstract public function traduire($texte, $destLang = 'fr', $srcLang = 'en');
    24 }
    25 
     21        public function traduire($texte, $destLang = 'fr', $srcLang = 'en') {
     22                if (strlen(trim($texte)) == 0) {
     23                        return '';
     24                }
     25                $len =  mb_strlen($texte);
     26                $extrait =  mb_substr($texte, 0, 40);
     27                spip_log('Trad:' . $this->type . ' ' . $len . 'c. : ' . $extrait . ($len > 40 ? '...' : ''), 'translate');
     28                return $this->_traduire($texte, $destLang, $srcLang);
     29        }
     30
     31        abstract protected function _traduire($texte, $destLang, $srcLang);
     32}
     33
     34/**
     35 * Traduire avec Bing
     36 */
    2637class TT_Traducteur_Bing extends TT_Traducteur {
    2738        public $type = 'bing';
    2839        public $maxlen = 10000;
    29         function traduire($texte, $destLang = 'fr', $srcLang = 'en') {
    30                 return translate_requestCurl_bing($this->apikey, $texte, $srcLang, $destLang);
    31         }
    32 }
    33 
     40
     41        protected function _traduire($texte, $destLang, $srcLang) {
     42                // Bon sang, si tu n'utilises pas .NET, ce truc est documenté par les corbeaux
     43                // attaquer le machin en SOAP (la méthode HTTP ne convient que pour des textes très courts (GET, pas POST)
     44                try {
     45                        $client = new \SoapClient("http://api.microsofttranslator.com/V2/Soap.svc");
     46                        $params = array(
     47                                'appId' => $this->apikey,
     48                                'text' => $texte,
     49                                'from' => $srcLang,
     50                                'to' => $destLang
     51                        );
     52                        $translation = $client->translate($params);
     53                } catch (Exception $e) {
     54                        spip_log($e->getMessage(), 'translate');
     55                        return false;
     56                }
     57
     58                return $translation->TranslateResult;
     59        }
     60}
     61
     62/**
     63 * Traduire avec Google Translate
     64 */
    3465class TT_Traducteur_GGTranslate extends TT_Traducteur {
    3566        public $type = 'google';
    3667        public $maxlen = 4500;
    37         function traduire($texte, $destLang = 'fr', $srcLang = 'en') {
     68
     69        protected function _traduire($texte, $destLang = 'fr', $srcLang = 'en') {
    3870                $destLang = urlencode($destLang);
    3971                $srcLang = urlencode($srcLang);
    40                 return translate_requestCurl("key=" . $this->apikey . "&source=$srcLang&target=$destLang&q=" . rawurlencode($texte));
     72
     73                $url_page = "https://www.googleapis.com/language/translate/v2?";
     74                $parameters = "key=" . $this->apikey . "&source=$srcLang&target=$destLang&q=" . rawurlencode($texte);
     75
     76                # $parameters_explode = explode("&", $parameters);
     77                # $nombre_param = count($parameters_explode);
     78
     79                $ch = curl_init();
     80                curl_setopt($ch, CURLOPT_URL, $url_page);
     81                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     82                curl_setopt($ch, CURLOPT_REFERER, !empty($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "");
     83                #curl_setopt($ch, CURLOPT_POST, nombre_param);
     84                curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
     85                curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: GET'));
     86                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
     87                $body = curl_exec($ch);
     88                curl_close($ch);
     89
     90                $json = json_decode($body, true);
     91
     92                if (isset($json["error"])) {
     93                        spip_log($json, 'translate');
     94                        return false;
     95                }
     96
     97                return urldecode($json["data"]["translations"][0]["translatedText"]);
    4198        }
    4299}
     
    46103        public $type = 'shell';
    47104        public $maxlen = 1000;
    48         function traduire($texte, $destLang = 'fr', $srcLang = 'en') {
    49                 return translate_shell($texte, $destLang);
    50         }
     105
     106        public function _traduire($texte, $destLang = 'fr', $srcLang = 'en') {
     107                if (!defined('_TRANSLATESHELL_CMD')) {
     108                        spip_log('chemin de Translate shell non défini', 'translate.' . _LOG_ERREUR);
     109                        return false;
     110                }
     111                return $this->translate_line($texte, $destLang);
     112
     113                /*
     114                // Équivalent ~ de l’ancien fonctionnement. (qui supprimait les tags html)
     115                $liste = TT_decouper_texte($texte, $this->maxlen);
     116                foreach ($liste as $l) {
     117                        spip_log("IN: " . $l, 'translate');
     118                        $trad = $this->translate_line($l, $destLang);
     119                        spip_log("OUT: " . $trad, 'translate');
     120                        $trans[] = $trad;
     121                }
     122                return join(" ", $trans);
     123                */
     124        }
     125
     126        public function translate_line($texte, $destLang) {
     127                if (strlen(trim($texte)) == 0) {
     128                        return '';
     129                }
     130                $descriptorspec = array(
     131                        0 => array("pipe", "r"),
     132                        1 => array("pipe", "w")
     133                );
     134                $cmd = _TRANSLATESHELL_CMD . ' -b ' . ':' . escapeshellarg($destLang);
     135                $cmdr = proc_open($cmd, $descriptorspec, $pipes);
     136                if (is_resource($cmdr)) {
     137                        fwrite($pipes[0], $texte) && fclose($pipes[0]);
     138                        $trad = stream_get_contents($pipes[1]);
     139                        fclose($pipes[1]);
     140                }
     141                return $trad;
     142        }
     143
    51144}
    52145
     
    65158                } elseif (defined('_TRANSLATESHELL_CMD')) {
    66159                        $traducteur = new TT_Traducteur_Shell();
    67                         $traducteur->path = _TRANSLATESHELL_CMD;
    68160                } elseif ($k = lire_config('traduiretexte/cle_bing')) {
    69161                        $traducteur = new TT_Traducteur_Bing($k);
     
    75167        }
    76168        return $traducteur;
    77 }
    78 
    79 function translate_requestCurl($parameters) {
    80         # $url_page = "https://ajax.googleapis.com/ajax/services/language/translate?";
    81         $url_page = "https://www.googleapis.com/language/translate/v2?";
    82 
    83         # $parameters_explode = explode("&", $parameters);
    84         # $nombre_param = count($parameters_explode);
    85 
    86         $ch = curl_init();
    87         curl_setopt($ch, CURLOPT_URL, $url_page);
    88         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    89         curl_setopt($ch, CURLOPT_REFERER, !empty($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "");
    90         #curl_setopt($ch, CURLOPT_POST, nombre_param);
    91         curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
    92         curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: GET'));
    93         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    94         $body = curl_exec($ch);
    95         curl_close($ch);
    96 
    97         $json = json_decode($body, true);
    98 
    99         if (isset($json["error"])) {
    100                 spip_log($json, 'translate');
    101                 return false;
    102         }
    103         return urldecode($json["data"]["translations"][0]["translatedText"]);
    104 }
    105 
    106 function translate_requestCurl_bing($apikey, $text, $srcLang, $destLang) {
    107         // Bon sang, si tu n'utilises pas .NET, ce truc est documenté par les corbeaux
    108         // attaquer le machin en SOAP (la méthode HTTP ne convient que pour des textes très courts (GET, pas POST)
    109 
    110         if (strlen(trim($text)) == 0) return '';
    111         $client = new SoapClient("http://api.microsofttranslator.com/V2/Soap.svc");
    112 
    113         $params = array(
    114                 'appId' => $apikey,
    115                 'text' => $text,
    116                 'from' => $srcLang,
    117                 'to' => $destLang);
    118         try {
    119                 $translation = $client->translate($params);
    120         } catch (Exception $e) {
    121                 return false;
    122         }
    123 
    124         return $translation->TranslateResult;
    125 }
    126 
    127 
    128 function translate_shell($text, $destLang = 'fr') {
    129         if (strlen(trim($text)) == 0) return '';
    130         $prep = str_replace("\n", " ", html2unicode($text));
    131         $prep = preg_split(",<p\b[^>]*>,i", $prep);
    132         $trans = array();
    133         foreach ($prep as $k => $line) {
    134                 if ($k > 0) $trans[] = '<p>';
    135                 $line = preg_replace(",<[^>]*>,i", " ", $line);
    136                 // max line = 1000 chars
    137                 $a = array();
    138                 while (mb_strlen($line) > 1000) {
    139                         $debut = mb_substr($line, 0, 600);
    140                         $suite = mb_substr($line, 600);
    141                         $point = strpos($suite, '.');
    142 
    143                         // chercher une fin de phrase pas trop loin
    144                         // ou a defaut, une virgule ; au pire un espace
    145                         if ($point === false) {
    146                                 $point = strpos(preg_replace('/[,;?:!]/', ' ', $suite), ' ');
    147                         }
    148                         if ($point === false) {
    149                                 $point = strpos($suite, ' ');
    150                         }
    151                         if ($point === false) {
    152                                 $point = 0;
    153                         }
    154                         $a[] = trim($debut . mb_substr($suite, 0, 1 + $point));
    155                         $line = mb_substr($line, 600 + 1 + $point);
    156                 }
    157                 $a[] = trim($line);
    158                 foreach ($a as $l) {
    159                         spip_log("IN: " . $l, 'translate');
    160                         $trad = translate_line($l, $destLang);
    161                         spip_log("OUT: " . $trad, 'translate');
    162                         $trans[] = $trad;
    163                 }
    164         }
    165 
    166         return join("\n", $trans);
    167 }
    168 
    169 function translate_line($text, $destLang) {
    170         if (strlen(trim($text)) == 0) return '';
    171         $descriptorspec = array(
    172                 0 => array("pipe", "r"),
    173                 1 => array("pipe", "w")
    174         );
    175         $cmd = _TRANSLATESHELL_CMD . ' -b ' . ':' . escapeshellarg($destLang);
    176         $cmdr = proc_open($cmd, $descriptorspec, $pipes);
    177         if (is_resource($cmdr)) {
    178                 fwrite($pipes[0], $text) && fclose($pipes[0]);
    179                 $trad = stream_get_contents($pipes[1]);
    180                 fclose($pipes[1]);
    181         }
    182         return $trad;
    183169}
    184170
     
    233219                                $debut = mb_substr($line, 0, $len);
    234220                                $suite = mb_substr($line, $len);
    235                                 $point = strpos($suite, '.');
     221                                $point = mb_strpos($suite, '.');
    236222
    237223                                // chercher une fin de phrase pas trop loin
    238224                                // ou a defaut, une virgule ; au pire un espace
    239225                                if ($point === false) {
    240                                         $point = strpos(preg_replace('/[,;?:!]/', ' ', $suite), ' ');
     226                                        $point = mb_strpos(preg_replace('/[,;?:!]/', ' ', $suite), ' ');
    241227                                }
    242228                                if ($point === false) {
    243                                         $point = strpos($suite, ' ');
     229                                        $point = mb_strpos($suite, ' ');
    244230                                }
    245231                                if ($point === false) {
     
    349335                $trad = $traducteur->traduire($paragraphe, $destLang, $srcLang);
    350336                if ($trad) {
    351                         spip_log('[' . $destLang . "] $paragraphe \n === $trad", 'translate');
    352337                        $traductions[$hash] = $trad;
    353338                        $inserts[] = array(
  • _plugins_/traduire_texte/trunk/paquet.xml

    r105923 r105924  
    22        prefix="traduiretexte"
    33        categorie="outil"
    4         version="0.3.0"
     4        version="0.4.0"
    55        etat="dev"
    66        compatibilite="[3.0.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.