Question

J'essaie de passer de la version actuelle de MS Bing Translator à la nouvelle version Azure.

J'ai créé un jeton d'accès comme décrit dans la nouvelle documentation et bien que l'exemple suivant (pour Azure) fourni par Microsoft fonctionne correctement :

function translate() {

  var from = "en", to = "es", text = "hello world";
  var s = document.createElement("script");
  s.src = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate" +
            "?appId=" + settings.appID +
            "&from=" + encodeURIComponent(from) +
            "&to=" + encodeURIComponent(to) +
            "&text=" + encodeURIComponent(text) +
            "&oncomplete=mycallback";
  document.body.appendChild(s);
}

function mycallback(response) {
  alert(response); 
}

Je voudrais convertir le code ci-dessus en un appel jQuery.

J'ai modifié un appel ajax jQuery similaire de la version précédente qui fonctionnait, mais un parseerror-jQuery17206897480448242277_1343343577741 was not called est délivré :

  function jqueryTranslate() {
    var p = {};
    p.appid = settings.appID;
    p.to = "es";
    p.from = "en";
    p.text = "Goodbye Cruel World";
    p.contentType = 'text/html';
    $.ajax({
      url: 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate',
      data: p,
      dataType: 'jsonp',
      jsonp: 'oncomplete',
      complete: function (request, status) {
      },
      success: function (result, status) {
        alert(result);
      },
      error: function (a, b, c) {
        alert(b + '-' + c);
      }
    });
  }

J'apprécierais beaucoup et je comprendrais ce qui ne va pas, alors TIA pour votre temps.

Était-ce utile?

La solution

L'autre problème est que le mécanisme Bing AppID d'authentification auprès du traducteur est obsolète.

Microsoft a publié un article de blog détaillant le processus d'accès à Translator sur Windows Azure Marketplace ici :

http://blogs.msdn.com/b/translation/p/gettingstarted1.aspx

Il y a un exemple dans ASP.NET ici :http://blogs.msdn.com/b/translation/p/gettingstarted2.aspx

La recommandation est (au moins) de mettre votre code pour obtenir votre côté serveur de jetons dans ASP.NET, PHP, Node ou quelque chose de similaire afin que votre ID client et votre secret client ne soient pas exposés.

Une fois que vous avez obtenu le jeton d'accès, il doit être écrit dans les en-têtes HTTP de l'appel au service.L'exemple ASP.NET le montre et il devrait être relativement facile à adapter à JQuery.

Autres conseils

Pour utiliser Bing Translator avec des jetons d'authentification, vous avez d'abord besoin d'un script côté serveur comme ce script PHP, token.php.Il sera appelé toutes les 9 minutes depuis le javascript de votre page web.

<?php
$ClientID="your client id";
$ClientSecret="your client secret";

$ClientSecret = urlencode ($ClientSecret);
$ClientID = urlencode($ClientID);

// Get a 10-minute access token for Microsoft Translator API.
$url = "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13";
$postParams = "grant_type=client_credentials&client_id=$ClientID&client_secret=$ClientSecret&scope=http://api.microsofttranslator.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postParams);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
$rsp = curl_exec($ch); 

print $rsp;
?>

Ensuite, cette page HTML affichera une interface à deux cases qui traduit de l'anglais vers le français.

Note:une version antérieure de cet article manquait les 5 premières lignes et n'a donc pas réussi à charger jQuery.(Désolé pour ça @db1.) Le script de travail est en ligne ici :

http://www.johndimm.com/bingtrans/

<html>

<head>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

  <script language="javascript">
    var g_token = '';

    function onLoad() {
      // Get an access token now.  Good for 10 minutes.
      getToken();
      // Get a new one every 9 minutes.
      setInterval(getToken, 9 * 60 * 1000);
    }

    function getToken() {
      var requestStr = "/bingtrans/token.php";

      $.ajax({
        url: requestStr,
        type: "GET",
        cache: true,
        dataType: 'json',
        success: function (data) {
          g_token = data.access_token;
        }
      });
    }

    function translate(text, from, to) {
      var p = new Object;
      p.text = text;
      p.from = from;
      p.to = to;
      p.oncomplete = 'ajaxTranslateCallback'; // <-- a major puzzle solved.  Who would have guessed you register the jsonp callback as oncomplete?
      p.appId = "Bearer " + g_token; // <-- another major puzzle.  Instead of using the header, we stuff the token into the deprecated appId.
      var requestStr = "http://api.microsofttranslator.com/V2/Ajax.svc/Translate";

      window.ajaxTranslateCallback = function (response) {
        // Display translated text in the right textarea.
        $("#target").text(response);
      }

      $.ajax({
        url: requestStr,
        type: "GET",
        data: p,
        dataType: 'jsonp',
        cache: true
      });
    }


    function translateSourceTarget() {
      // Translate the text typed by the user into the left textarea.
      var src = $("#source").val();
      translate(src, "en", "fr");
    }
  </script>
  <style>
    #source,
    #target {
      float: left;
      width: 400px;
      height: 50px;
      padding: 10px;
      margin: 10px;
      border: 1px solid black;
    }
    #translateButton {
      float: left;
      margin: 10px;
      height: 50px;
    }
  </style>
</head>

<body onload="onLoad();">

  <textarea id="source">Text typed here will be translated.</textarea>
  <button id="translateButton" onclick="translateSourceTarget();">Translate English to French</button>
  <textarea id="target"></textarea>

</body>

</html>

Pourriez-vous essayer d'ajouter un jsonpCallback à votre appel et définissez une nouvelle fonction pour celui-ci.C'est ce qui semble manquer lorsque je compare votre code jQuery avec l'exemple de Microsoft.

  function jqueryTranslate() {
    var p = {};
    p.appid = settings.appID;
    p.to = "es";
    p.from = "en";
    p.text = "Goodbye Cruel World";
    p.contentType = 'text/html';
    $.ajax({
      url: 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate',
      data: p,
      dataType: 'jsonp',
      jsonp: 'oncomplete',
      jsonpCallback: 'onCompleteCallback',   <------------------ THIS LINE
      complete: function (request, status) {
      },
      success: function (result, status) {
        alert(result);
      },
      error: function (a, b, c) {
        alert(b + '-' + c);
      }
    });
  }

  function onCompleteCallback(response) {    <------------------- THIS FUNCTION
    alert('callback!'); 
  }

J'ai essayé le script soumis par John Dimm et cela n'a pas fonctionné pour moi.Renvoie une case vide et un statut 304 Non modifié.Au lieu de cela, j'ai utilisé le code du traducteur PHP avec Microsoft sur le blog msdn à ce lien http://blogs.msdn.com/b/translation/p/phptranslator.aspx et ça a fonctionné à merveille

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top