Google AJAX Transliteration API: - Как мне перевести много элементов на странице на один язык за один раз? - PullRequest
1 голос
/ 02 мая 2010

У меня много элементов на странице, и я хочу перевести их на какой-нибудь язык. Язык не одинаков для всех полей, то есть для 1-го поля он может быть fr, а для третьего поля он может быть en, а затем для 7-го поля может быть pa.

В основном я написал код, и он работает: -

    <script type="text/javascript">
         //<![CDATA[
          google.load("language", "1");

            window.onload = function(){
               var elemPostTitles = document.getElementsByTagName("h4");
               var flag = true;

               for(var i = 0 ; i < elemPostTitles.length ; i++){
                    while(flag == false){

                    }
                   var postTitleElem = elemPostTitles[i];
                   var postContentElem = document.getElementById("postContent_" + i);

                   var postTitle = postTitleElem.innerHTML;
                   var postContent = postContentElem.innerHTML;
                   var languageCode = document.getElementById("languageCode_" + i).value;


                   google.language.detect(postTitle, function(result) {
                        if (!result.error && result.language) {
                            google.language.translate(postTitle, result.language, languageCode,
                            function(result) {
                            flag = true;
                            if (result.translation) {
                                    postTitleElem.innerHTML = result.translation;

                                }
                            });
                        }
                    });
                    flag = false;
               }

Как видите, я пытаюсь ограничить прохождение цикла до тех пор, пока не будет получен результат предыдущего вызова ajax. Если я этого не сделаю, будет переведено только последнее поле. Мой код работает хорошо, но из-за бесконечного цикла я продолжаю получать ошибки от Mozilla, чтобы «прекратить выполнение сценариев». Как мне избавиться от этого? Кроме того, мой подход правильный? Или есть какая-то встроенная функция, которая может облегчить мою задачу? Заранее спасибо:)

Ответы [ 2 ]

2 голосов
/ 02 мая 2010

Почему бы вам не вызвать функцию для рекурсивной проверки следующего h4 из обнаруженных / преобразованных завершенных обратных вызовов. Отправьте следующую рекурсию следующему h4, используя что-то вроде функции next () JQuery. Вы выполняете бесконечный цикл в том же потоке, что и внешний цикл.

1 голос
/ 02 мая 2010

Я предлагаю вам в следующий раз опубликовать более полный вопрос и код, чтобы люди, которые любят давать рабочие ответы, не тратили время на угадывание того, что вы пытаетесь сделать.

Вот рабочий пример использования рекурсии. Если у вас нет тысячи предметов, хвост должен быть терпимым.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>

    <script type="text/javascript" src="http://www.google.com/jsapi">
    </script>

    <script type="text/javascript">

        google.load("language", "1");

        function initialize() {

            var elemPostTitles = document.getElementsByTagName("h4");
            var index = elemPostTitles.length - 1;
            foo(index);

            function foo(index) {

                var postTitleElem = elemPostTitles[index];
                var postTitle = postTitleElem.innerHTML;

                var postContentElem = document.getElementById("postContent_" + index);
                var postContent = postContentElem.innerHTML;

                var languageCode = document.getElementById("languageCode_" + index).value;


                google.language.detect(postTitle, function(result) {
                    if (!result.error && result.language) {
                        google.language.translate(postTitle, result.language, languageCode,
                            function(result) {

                                if (result.translation) {
                                    postTitleElem.innerHTML = result.translation;
                                }

                                if (--index > -1) {
                                    foo(index);
                                }
                            });
                    }
                });
            };

        }



        google.setOnLoadCallback(initialize);
    </script>

</head>
<body>
    <h4>
        this is some text</h4>
    <h4>
        this is some text</h4>
    <h4>
        this is some text</h4>
    <h4>
        this is some text</h4>
    <h4>
        this is some text</h4>
    <input type="text" id="languageCode_0" value="en" />
    <div id="postContent_0">
    </div>
    <input type="text" id="languageCode_1" value="hi" />
    <div id="postContent_1">
    </div>
    <input type="text" id="languageCode_2" value="es" />
    <div id="postContent_2">
    </div>
    <input type="text" id="languageCode_3" value="fr" />
    <div id="postContent_3">
    </div>
    <input type="text" id="languageCode_4" value="ar" />
    <div id="postContent_4">
    </div>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...