2011-12-22 64 views
1

我曾經使用谷歌翻譯的V1。在我的JavaScript中,我將在頁面加載後循環訪問元素集合,翻譯文本並將結果輸出到相應的文本框中。 Im努力在付費API的V2中實現相同的功能(啓用計費)。用谷歌翻譯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); 
      } 

如果我能傳遞一個額外的參數到回調函數,然後我可以指定要更新的控制,但我不認爲這是可能使用這種方法。

回答

3

成功!

我設法使$.ajax()方法的工作,這使我可以爲每個單獨的翻譯元素創建一個回調函數。

第一個問題是我使用jQuery 1.4.x.使用JASONP數據類型時,版本1.5以上允許跨域調用。這就是爲什麼我得到「訪問被拒絕」的信息。

第二個變化是從jspndataType改爲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'); 
       } 
      }); 

希望這是一些使用他人的。

+0

什麼是查找文本和我們給數據的位置 – Raghurocks 2012-11-06 13:52:13

+0

完美!你保存了我的日子:-) – Zax 2015-05-22 07:53:50

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

+0

如果我還沒有發現解決方案,我會用這種方法。感謝您的高舉。 – SausageFingers 2011-12-22 16:17:32