WedX - журнал о программировании и компьютерных науках

Возврат переведенного текста из действий Google Переводчика

Я разработал приложение для Android, которое запускает действие Google Translate, используя следующий код:

...
Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.putExtra("key_text_input", "What time is it?");
i.putExtra("key_text_output", "");
i.putExtra("key_language_from", "en");
i.putExtra("key_language_to", "es");
i.putExtra("key_suggest_translation", "");
i.putExtra("key_from_floating_window", false);
i.setComponent(new ComponentName("com.google.android.apps.translate",
    "com.google.android.apps.translate.translation.TranslateActivity"));
startActivityForResult(i, 0);
...

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("yoyo", "in onActivityResult()");
    // data is null
}

Родительский onActivityResult () вызывается в моем приложении из действия Google Translate, но data имеет значение null. Поэтому я предполагаю, что нет возможности вернуть переведенный текст из Google Translate обратно в мое приложение. Это верно?

Кроме того, если бы был способ сделать это, было бы это нарушением условий обслуживания API? Будет ли все еще нарушением использование языковых пакетов / переводов Google Translate в автономном режиме?

Если разработчик (сотрудник) Google случайно это увидит и сможет взвесить, я был бы признателен. Очень жду официального ответа.

Спасибо!


  • Похоже, вам действительно стоит использовать вместо этого Google Translate API (платно). 15.08.2013
  • Да, я согласен. Я хочу получить официальное подтверждение по вышеуказанному вопросу, чтобы удовлетворить запрос клиента. 15.08.2013

Ответы:


1

Мне также любопытно узнать, возможно ли это.

Между тем, если вам нужно перевести простой текст здесь, используйте класс, который оборачивает Google Translate Http Service.

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

Так что, если Google (сотрудник) ответит на ваш вопрос ... возможно, мог бы сообщить мне, законен ли этот подход.

Для удобства здесь простая AsyncTask, которая обертывает службу Google Translate Http:

    import java.io.IOException;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Locale;
    import java.util.Random;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;

    import com.lus.android.net.RESTClient;

    public class TranslatorTask extends AsyncTask<Bundle, Void, String> {

        static final private String TAG = "TRANSLATOR";

        static final private String[] UA_LIST = {
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:24.0) Gecko/20100101 Firefox/24.0",
            "Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2",
            "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:22.0) Gecko/20130328 Firefox/22.0",
            "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130405 Firefox/22.0",
            "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; InfoPath.1; SV1; .NET CLR 3.8.36217; WOW64; en-US)",
            "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; .NET CLR 2.7.58687; SLCC2; Media Center PC 5.0; Zune 3.4; Tablet PC 3.6; InfoPath.3)",
            "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)",
            "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)"
        };


        public interface OnTranslatorTaskListener {
            void onTextTranslated(String value);
        };

        private OnTranslatorTaskListener    mCallback = null;


        public void setOnTranslatorTaskListener(OnTranslatorTaskListener listener) {
            mCallback = listener;
        }

        @Override
        protected String doInBackground(Bundle... params) {
            if (params == null) return null;

            Collections.shuffle(Arrays.asList(UA_LIST));

            String json = null;

            RESTClient rest = null;
            try {
                rest = new RESTClient("https://translate.google.com/translate_a/t");
                rest.header("User-Agent", UA_LIST[new Random().nextInt(UA_LIST.length)]);
                rest.data("client", "j"); //t = TEXT
                rest.data("ie", "UTF-8");
                rest.data("oe", "UTF-8");

                rest.data("hl", params[0].getString("hl")); //, Locale.getDefault().getLanguage()));
                rest.data("sl", params[0].getString("sl")); 
                rest.data("tl", params[0].getString("tl"));
                rest.data("q", params[0].getString("text"));

                json = rest.execute();

            } catch (IOException ioe) {
                Log.e(TAG, ioe.getMessage(), ioe);

            } finally {
                if (rest != null) rest.shutdown();
            }

            if (json == null) return null;

            StringBuffer result = new StringBuffer();
            try {
                JSONObject jo = new JSONObject(json);
                if (jo.has("sentences")) {
                    JSONArray ja = jo.getJSONArray("sentences");
                    for (int i = 0; i < ja.length(); i++) {
                        JSONObject item = ja.getJSONObject(i);
                        if (item.has("trans"))
                            result.append(item.getString("trans"));
                    }
                }
            } catch (JSONException je) {
                Log.e(TAG, je.getMessage(), je);
            }

            return result.toString();
        }


        @Override
        protected void onPostExecute(String result) {
            if (result != null && mCallback != null)
                mCallback.onTextTranslated(result);
        }
    };

[Класс RESTClient] - это оболочка для HttpClient, вы можете найти исходный код здесь

С уважением,

Лука

09.08.2013
  • Привет, Лука. Отличный материал, но, похоже, это создает проблему: json = rest.execute (); Метод execute возвращает логическое значение. 10.08.2014
  • Спасибо @Yster, прошло много времени, может быть, API Google изменился (попробуйте сначала поиграть). Кроме того, используйте Android-залп вместо моего старого RESTClient. Если вы хотите регистрировать ответ, используйте: rest.setDebug (true); а затем из оболочки: ./adb shell setprop log.tag.org.apache.http VERBOSE ./adb shell setprop log.tag.org.apache.http.wire VERBOSE ./adb shell setprop log.tag.org.apache. http.headers ГЛАГОЛОВЫЕ 12.08.2014
  • Спасибо за ответ, Лука. Я посмотрю, смогу ли я что-нибудь придумать с залпом. 12.08.2014
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]