Google AJAX Language API... et ton Flex devient polyglotte !
Par Erick, dans [Dev] Flash / Flex / AIR... # 408
Je viens de tomber sur une API bien pratique : l'API de traduction de Google. Accessible via un HTTPService, elle permet d'effectuer des requêtes de traduction en plus de 30 langues. Voyons comment l'utiliser depuis une application Flex.
Requis : AS3 Corelib pour le traitement des données au format JSON
Fonctionnement : Dans le fichier MXML de mon application, TextInputs, une comboBox permettant la sélection des langues et un bouton d'envoi. L'appel au service est défini dans le fichier translator.as.
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal"> <mx:Script source="translator.as" /> <mx:TextInput id="toTranslate" text="hello"/> <mx:ComboBox id="langpairSelector" dataProvider="{langpairCollection}" /> <mx:TextInput id="translated" /> <mx:Button label="Traduire !!!" click="translate()" /> </mx:Application>
L'appel se fait via un HTTPService. L'url du service est : 'http://ajax.googleapis.com/ajax/services/language/translate'.
Des paramètres sont également à ajouter à la requête :
- v » la version : 1.0 ( c'est la seule existante )
- q » le mot ou expression à traduire
- langpair » l'identifiant de la langue à traduire et celui de la langue de destination ( séparées par un | ). Si une seule langue est indiquée, le service cherchera à deviner la langue du mot à traduire ( voir la liste des langues et des identifiants ).
Le service renvoie des données au format JSON, que nous transformons en object Actionscript via la classe JSON de la Corelib.
Les données reçues sont de la forme :
{"responseData": { "translatedText":"texte traduit" }, "responseDetails": null, "responseStatus": 200}
Si tout se passe bien la traduction est accessible via la propriété responseData.translatedText de l'objet reçu.
import mx.collections.ArrayCollection; import mx.collections.ArrayCollection; import com.adobe.serialization.json.JSON; import mx.rpc.http.HTTPService; import mx.rpc.events.ResultEvent; [Bindable] private var langpairCollection:ArrayCollection = new ArrayCollection( [ {label:"Traduire de " , value:''}, {label:"Anglais » Français" , value:'en|fr'}, {label :"Francais » Anglais", value:'fr|en'} ] ) // fonction de traduction : appel du service de google.language.translate private function translate():void { if ( langpairSelector.selectedItem.value ){ initResult(); var translator:HTTPService = new HTTPService(); translator.url = 'http://ajax.googleapis.com/ajax/services/language/translate'; translator.request.v = '1.0'; translator.request.q = toTranslate.text; translator.request.langpair= langpairSelector.selectedItem.value; translator.resultFormat = 'text'; translator.addEventListener(ResultEvent.RESULT, onResult); translator.send(); } } private function initResult():void{ translated.text = ''; } // à la réception : affichage du résultat depuis des données au format JSON private function onResult(event:ResultEvent):void { try { var trad:Object = JSON.decode(event.result as String); translated.htmlText = trad.responseData.translatedText ; } catch(ignored:Error) { trace ( 'erreur réception traduction : ' + ignored.toString() ); } }
Voilà pour un 1er essai... y a de quoi faire !

Commentaires
1. Le samedi 7 juin 2008 à 19:05, par dcz.switcher
2. Le samedi 7 juin 2008 à 19:22, par erick
3. Le dimanche 8 juin 2008 à 18:04, par Lionel
Allez soit pas timide ! Dis quelque chose...