2011-12-22 5 views
1

Раньше я использовал перевод V1 Google. В моем JavaScript я бы перебирал набор элементов после загрузки страницы, переводил текст и выводил результат в соответствующее текстовое поле. Я пытаюсь реализовать ту же функциональность в V2 платного API (биллинг включен).Обратный звонок с Google Translate 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. Версия 1.5 и далее позволяет использовать междоменные вызовы при использовании типа данных JASONP. Вот почему я получил сообщение «Отказано в доступе».

Второе изменение заключается в изменении dataType от jspn к 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

+0

Perfect !!! U спас мой день :-) – Zax

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