سؤال

أحاول التحويل من الإصدار الحالي من MS Bing Translator إلى الإصدار الجديد من Azure.

لقد قمت بإنشاء رمز وصول كما هو موضح في الوثائق الجديدة وعلى الرغم من أن المثال التالي (لـ Azure) الذي توفره Microsoft يعمل بشكل صحيح:

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

أرغب في تحويل الكود أعلاه إلى استدعاء jQuery.

لقد قمت بتعديل استدعاء jQuery ajax مماثل من الإصدار السابق والذي نجح، ولكن أ parseerror-jQuery17206897480448242277_1343343577741 was not called تم إصدار:

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

سأكون ممتنًا جدًا وأتفهم ما يحدث من خطأ، لذا TIA لوقتك.

هل كانت مفيدة؟

المحلول

المشكلة الأخرى هي أنه تم إهمال آلية Bing AppID للمصادقة ضد المترجم.

لدى Microsoft منشور مدونة يوضح بالتفصيل عملية الوصول إلى المترجم في Windows Azure Marketplace هنا:

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

يوجد مثال في ASP.NET هنا:http://blogs.msdn.com/b/translation/p/gettingstarted2.aspx

التوصية (على الأقل) هي وضع الكود الخاص بك للحصول على جانب خادم الرمز المميز الخاص بك في ASP.NET أو PHP أو Node أو شيء مشابه حتى لا يتم كشف معرف العميل وسر العميل.

بمجرد حصولك على رمز الوصول، يجب كتابته في رؤوس HTTP لاستدعاء الخدمة.يوضح نموذج ASP.NET ذلك، ويجب أن يكون من السهل نسبيًا التكيف مع JQuery.

نصائح أخرى

لاستخدام مترجم Bing مع رموز المصادقة، تحتاج أولاً إلى برنامج نصي من جانب الخادم مثل برنامج PHP النصي هذا، token.php.سيتم استدعاؤه كل 9 دقائق من جافا سكريبت على صفحة الويب الخاصة بك.

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

بعد ذلك ستعرض صفحة html هذه واجهة مكونة من صندوقين تترجم من الإنجليزية إلى الفرنسية.

ملحوظة:كان هناك إصدار سابق من هذا المنشور يفتقد الأسطر الخمسة الأولى وبالتالي فشل في تحميل jQuery.(آسف لذلك @db1.) نص العمل موجود على الإنترنت هنا:

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>

هل يمكنك محاولة إضافة أ jsonpCallback لمكالمتك وتحديد وظيفة جديدة لها.هذا ما يبدو مفقودًا عندما أقارن رمز jQuery الخاص بك بالمثال من 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!'); 
  }

جربت النص المقدم من جون ديم ولم ينجح معي.تقوم بإرجاع مربع فارغ والحالة 304 غير معدلة.بدلاً من ذلك، استخدمت PHP مع رمز مترجم Microsoft في مدونة msdn على هذا الرابط http://blogs.msdn.com/b/translation/p/phptranslator.aspx وعملت بشكل جميل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top