Parce qu’il faut bien mettre un petit peu en pratique de temps en temps, je me suis amusé à créer une class qui implémente un module de traduction à l’aide de BabelFish (le système de traduction de Yahoo). En résumé, j’ai plusieurs attributs qui déterminent les différents paramètres de la classe (url de la page de retour, url de BabelFish, langue du message à traduire, langue de la traduction), le constructeur permet de définir ces deux derniers, puisque ce sont les seules succeptible de changer assez souvent ! (pour pouvoir faire du Espagnol -> Anglais ou Grec -> Chinois) L’url pour traduire une phrase avec BabelFish se décompose de la manière suivante :
- http://fr.babelfish.yahoo.com/translate_txt : base de l’url
- lp : langues à utiliser (ex : fr_en)
- trtext : chaine de caractères à traduire. Les caractères accentués sont bien traités, mais les guillements et les espaces posent un problème. Il faut remplacer les espaces par des + ou des
%20
, quant aux guillemets, bah je n’arrive pas à savoir par quoi il fut les transformer, donc pour l’instant je bloque.
Et voilà, il n’y a plus qu’à faire un petit file_get_contents
pour récupérer la page chargée par cet url, et une petite regex pour ne récupérer que la traduction : et le tour est joué !
<?php class TranslateGoogle { protected $langueIn; protected $langueOut; protected $urlGoogle = 'http://fr.babelfish.yahoo.com/translate_txt?lp='; protected $urlAction = 'ClassTranslateGoogle.php'; // Constructeur function __construct($langueIn, $langueOut) { $this->langueIn = $langueIn; $this->langueOut = $langueOut; } // Mutator function setLangueIn($langueIn) { $this->langueIn = $langueIn; } function setLangueOut($langueOut) { $this->langueOut = $langueOut; } function setUrlGoogle($urlGoogle) { $this->urlGoogle = $urlGoogle; } function setUrlAction($urlAction) { $this->urlAction = $urlAction; } function afficherForm($aTraduire) { $form = '<form action="'.$this->urlAction.'" method="post">'."\n".' <label for="translate">Phrase à traduire</label><br />'."\n".' <input type="text" name="translate" id="translate" value="'.stripslashes($aTraduire).'" size="30" /><br />'."\n".' <input type="submit" value="Traduire" />'."\n".' </form>'; echo $form; } function parse($string) { $string = str_replace('\<em>, '%27', trim($string)); $string = str_replace(' ', '%20', $string); return $string; } function traduire($aTraduire) { $url = $this->urlGoogle.$this->langueIn.'_'.$this->langueOut.'&trtext='.$this->parse($aTraduire); $content = file_get_contents($url); $content = preg_replace('!^.*<div id="result"><div style="padding:0.6em;">(.*)</div></div>.*$!isU', '$1', $content); if (preg_match('!DOCTYPE!', $content)) // Si on n'a pas réussi à traduire echo </em>; echo 'Traduction de "'.stripslashes($aTraduire).'" : '.trim($content); } function main() { if (isset($_POST['translate']) && $_POST['translate']) $this->traduire($_POST['translate']); $this->afficherForm(@$_POST['translate']); } } $test = new TranslateGoogle('fr', 'en'); $test->main();
J’ai essayé d’utiliser Google qui fonctionnait bien mieux puisque l’on pouvait mettre n’importe quoi dans l’url, malheureusement ils font ça en Ajax du coup file_get_contents
renvoie la page chargée par le PHP (ou autre) mais ne s’occupe pas du Javascript, et donc on n’a pas la traduction… Dommage, l’url était pourtant joli : « http://translate.google.fr/translate_t#fr|en|Phrase à traduire ».
Quant à Voilà, l’url était aussi pas mal : « http://trans.voila.fr/traduction_voila.php?isText=1&translationDirection=fe&stext=Phrase à traduire », mais il n’y avait trop de problème avec les caractères accentués.
Voilà une petite classe qui, une fois améliorée, pourrait me servir dans certains projets !
One Response to Traduction instantannée avec BabelFish