Frage

Ich versuche, von der aktuellen Version des MS Bing Translator auf die neue Azure-Version zu konvertieren.

Ich habe ein Zugriffstoken erstellt, wie in der neuen Dokumentation beschrieben, und obwohl das folgende von Microsoft bereitgestellte Beispiel (für Azure) korrekt funktioniert:

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

Ich möchte den obigen Code in einen jQuery-Aufruf konvertieren.

Ich habe einen ähnlichen jQuery-Ajax-Aufruf aus der vorherigen Version geändert, der funktioniert hat, aber a parseerror-jQuery17206897480448242277_1343343577741 was not called wird ausgegeben:

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

Ich würde mich sehr freuen und verstehen, was schief läuft, also TIA für Ihre Zeit.

War es hilfreich?

Lösung

Das andere Problem besteht darin, dass der Bing AppID-Mechanismus zur Authentifizierung gegenüber dem Übersetzer veraltet ist.

Microsoft hat hier einen Blog-Beitrag veröffentlicht, in dem der Prozess für den Zugriff auf Translator im Windows Azure Marketplace detailliert beschrieben wird:

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

Ein Beispiel in ASP.NET gibt es hier:http://blogs.msdn.com/b/translation/p/gettingstarted2.aspx

Die Empfehlung lautet (zumindest), Ihren Code zum Abrufen Ihrer Token-Serverseite in ASP.NET, PHP, Node oder etwas Ähnliches einzufügen, damit Ihre Client-ID und Ihr Client-Geheimnis nicht offengelegt werden.

Sobald Sie das Zugriffstoken erhalten haben, muss es in die HTTP-Header des Aufrufs des Dienstes geschrieben werden.Das ASP.NET-Beispiel zeigt dies und es sollte relativ einfach an JQuery anzupassen sein.

Andere Tipps

Um den Bing Translator mit Authentifizierungstokens zu verwenden, benötigen Sie zunächst ein serverseitiges Skript wie dieses PHP-Skript token.php.Es wird alle 9 Minuten vom Javascript auf Ihrer Webseite aufgerufen.

<?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;
?>

Dann zeigt diese HTML-Seite eine Zwei-Box-Oberfläche an, die vom Englischen ins Französische übersetzt.

Notiz:In einer früheren Version dieses Beitrags fehlten die ersten fünf Zeilen und daher konnte jQuery nicht geladen werden.(Tut mir leid @db1.) Das Arbeitsskript ist hier online:

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>

Könnten Sie versuchen, ein hinzuzufügen jsonpCallback zu Ihrem Aufruf hinzufügen und eine neue Funktion dafür definieren.Das scheint zu fehlen, wenn ich Ihren jQuery-Code mit dem Beispiel von Microsoft vergleiche.

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

Ich habe das von John Dimm eingereichte Skript ausprobiert und es hat bei mir nicht funktioniert.Gibt ein leeres Feld und den Status 304 Nicht geändert zurück.Stattdessen habe ich PHP mit Microsoft-Übersetzercode im msdn-Blog unter diesem Link verwendet http://blogs.msdn.com/b/translation/p/phptranslator.aspx und es hat wunderbar funktioniert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top