Microsoft Azure Translator Ajax APIが働いていません
-
12-12-2019 - |
質問
MS Bingトランスレータの現在のバージョンから新しいAzure 1に変換しようとしています。
新しいドキュメントで説明されているようにアクセストークンを作成し、マイクロソフトによって提供される次の例(Azure用)は正しく機能します。
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);
}
});
}
.
私は何が間違っているのか、それほど忠実なことを非常に感謝し、あなたの時間のために理解します。
解決
その他の問題は、翻訳者に対して認証するためのBing AppIDメカニズムが推奨されていないことです。
マイクロソフトには、Windows Azure Marketplaceの翻訳者にアクセスするためのプロセスを詳細に説明しています。
ASP.NETに例があります。 > http://blogs.msdn.com/b/translation/p/gettingStarted2.aspx.
推奨事項は、クライアントIDとクライアントの秘密が露出していないように、ASP.NET、PHP、ノード、または類似のものでトークンサーバーを取得するためのコードを(少なくとも)入力することができます。
アクセストークンを取得したら、サービスへの呼び出しのHTTPヘッダーに書き込む必要があります。ASP.NETサンプルは、jQueryに適応するのが比較的簡単であることを示しています。
他のヒント
認証トークンでBingトランスレータを使用するには、まずこのPHPスクリプト、token.phpのようなサーバーサイドスクリプトが必要です。WebページのJavaScriptから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ページには、英語からフランス語に翻訳される2ボックスインタフェースが表示されます。
注:この投稿の以前のバージョンには上位5行がなく、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コードをマイクロソフトからの例で比較すると、行方不明のようです。
. 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!');
}
John Dimmから提出されたスクリプトを試してみて、それは私のために働かなかった。空白ボックスとステータス304を変更しない。代わりに、このリンクのMSDNブログでMicrosoftトランスレータコードでPHPを使用していました。 http://blogs.msdn.com/b/translation/p/phptranslator.aspx とそれは美しく働いていました