Pregunta

Estoy intentando realizar la conversión de la versión actual de MS Bing Translator a la nueva de Azure.

Creé un token de acceso como se describe en la nueva documentación y aunque el siguiente ejemplo (para Azure) proporcionado por Microsoft funciona correctamente:

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); 
}

Me gustaría convertir el código anterior en una llamada jQuery.

Modifiqué una llamada jQuery ajax similar de la versión anterior que funcionó, pero parseerror-jQuery17206897480448242277_1343343577741 was not called se emite:

  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);
      }
    });
  }

Apreciaría mucho mi comprensión sobre lo que está yendo mal, así que TIA por su tiempo.

¿Fue útil?

Solución

El otro problema es que el mecanismo Bing AppID para autenticarse contra el traductor ha quedado obsoleto.

Microsoft tiene una publicación de blog que detalla el proceso para obtener acceso a Translator en Windows Azure Marketplace aquí:

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

Hay un ejemplo en ASP.NET aquí:http://blogs.msdn.com/b/translation/p/gettingstarted2.aspx

La recomendación es (al menos) colocar su código para obtener el lado del servidor de token en ASP.NET, PHP, Node o algo similar para que su ID de cliente y su secreto de cliente no queden expuestos.

Una vez que haya obtenido el token de acceso, deberá escribirlo en los encabezados HTTP de la llamada al servicio.El ejemplo de ASP.NET lo muestra y debería ser relativamente fácil de adaptar a JQuery.

Otros consejos

Para utilizar Bing Translator con tokens de autenticación, primero necesita un script del lado del servidor como este script PHP, token.php.Se llamará cada 9 minutos desde el javascript de su página 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;
?>

Luego, esta página html mostrará una interfaz de dos cuadros que se traduce del inglés al francés.

Nota:A una versión anterior de esta publicación le faltaban las 5 líneas superiores y, por lo tanto, no se pudo cargar jQuery.(Lo siento @db1.) El script de trabajo está en línea aquí:

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>

¿Podrías intentar agregar un jsonpDevolución de llamada a su llamada y defina una nueva función para ella.Esto es lo que parece faltar cuando comparo su código jQuery con el ejemplo 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!'); 
  }

Probé el guión enviado por John Dimm y no funcionó para mí.Devuelve un cuadro en blanco y un estado 304 No modificado.En su lugar, utilicé PHP con el código del traductor de Microsoft en el blog de msdn en este enlace http://blogs.msdn.com/b/translation/p/phptranslator.aspx y funcionó maravillosamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top