使用Google Translate V2回拨

时间:2011-12-22 12:02:46

标签: javascript jquery ajax google-api google-translate

我曾经使用过谷歌的V1翻译。在我的JavaScript中,我会在页面加载后循环遍历元素集合,翻译文本并将结果输出到相应的文本框中。我很难在付费API的V2中实现相同的功能(启用计费)。

这就是我在V1中所做的,在循环中:

google.language.translate(lookupText, 'gb', 'fr', function (result) {
if (!result.error) {
ctlSuggestion.innerText = result.translation;
}
});

这很好用,因为回调函数嵌入在请求中,所以我可以在结果返回后更新正确元素的innerText。

在V2中似乎没有类似方法的相似之处。我尝试使用jQuery Ajax,但我得到了一个“访问被拒绝”的消息,我认为这是因为它是一个跨域调用或者其他东西:

  $.ajax({
          type: "GET",
          url: "https://www.googleapis.com/language/translate/v2",
          data: { key: "API-KEY", source: "en", target: "fr", q: lookupText },
          dataType: 'json',
          success: function (data) {
                     alert(data.data.translations[0].translatedText);
                    },
          error: function (data) {
                   alert('fail');
                 }
          });

我可以使用REST方法,但在回调函数中无法知道请求来自哪个控件:

 var newScript = document.createElement('script');
            newScript.type = 'text/javascript';
            var sourceText = "Hello World"
            var source = 'https://www.googleapis.com/language/translate/v2?key=API-KEY=en&target=de&callback=translateText&q=' + sourceText;
            newScript.src = source;

            // When we add this script to the head, the request is sent off.
            document.getElementsByTagName('head')[0].appendChild(newScript);


            function translateText(response) {
                alert(response.data.translations[0].translatedText);
            }

如果我可以将额外的参数传递给回调函数,那么我可以指定要更新的控件,但我不认为使用此方法是可行的。

2 个答案:

答案 0 :(得分:3)

好吧,您可以为要翻译的每个元素创建一个“新”回调函数,并在完成后删除该函数。即:像:

function translateElement(elementID) {

    var element = document.getElementsById(elementID);

    // this is a temporary function for updating this particular element
    window['translate'+elementID] = function(response) {
        document.getElementsById(elementID).innerHTML = response.data.translations[0].translatedText;
        setTimeout(function() {
            // remove the temporary function
            window['translate'+elementID] = null;
        }, 1000);
    };

    var newScript = document.createElement('script');
    newScript.type = 'text/javascript';
    var sourceText = "Hello World"
    var source = 'https://www.googleapis.com/language/translate/v2?key=API-KEY=en&target=de&'+
    'callback=translate'+elementID+'&q=' + sourceText;
    newScript.src = source;

    // When we add this script to the head, the request is sent off.
    document.getElementsByTagName('head')[0].appendChild(newScript);
}

然后,对于每个元素,您可以调用translateElement(<id>)

答案 1 :(得分:2)

成功!

我设法使$.ajax()方法工作,这使我可以为每个单独的翻译元素创建一个回调函数。

第一个问题是我使用的是jQuery 1.4.x.使用JASONP数据类型时,1.5版以后版本允许跨域调用。这就是为什么我收到“访问被拒绝”的消息。

第二项更改是将dataTypejspn更改为jsonp

$.ajax({
          type: "GET",
          url: "https://www.googleapis.com/language/translate/v2",
          data: { key: "API-KEY", source: "en", target: "fr", q: lookupText },
          dataType: 'jsonp',
          success: function (data) {
                     alert(data.data.translations[0].translatedText);
                    },
          error: function (data) {
                   alert('fail');
                 }
          });

希望这对其他人有用。