Returning Translated Text from Google Translate Activity
Asked Answered
H

1

4

I have developed an Android application that launches a Google Translate Activity using the following code:

...
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
}

The parent onActivityResult() is called in my application from the Google Translate Activity, but data is null. Therefore, I assume that there is no way to return any translated text from Google Translate back into my application. Is this correct?

Also, if there was a way to do this, would it be a violation of the API's terms of service? Would it still be a violation if using the Google Translate offline language packs/translation?

If a Google developer (employee) happens to see this and could weigh in, I would appreciate it. I'm really looking for an official response.

Thanks!

Hyperboloid answered 6/8, 2013 at 13:51 Comment(2)
Sounds like you really should be using Google Translate API (not free) instead.Seethe
Yes, I agree. I'm looking to receive official confirmation on the question above in order to satisfy a client's inquiry.Hyperboloid
M
1

I also am curious to know if this is possible.

Meanwhile, if you need to translate simple text here a class that wrap the Google Translate Http Service.

I've never used it in a production enviroment (read a released app) becouse I'm not sure if it's legal.

So if a Google (employee) will answer to your question..maybe could let me know if this approach is legal.

For convenience here the simple AsyncTask that wrap the Google Translate Http Service:

    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("http://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);
        }
    };

The [RESTClient class] is a wrapper to HttpClient, you can found the source code here

Regards,

luca

Maltose answered 9/8, 2013 at 19:39 Comment(3)
Hi Luca. Great stuff, but it seems this giving a problem: json = rest.execute(); The execute method returns a boolean.Bumpy
Thanks @Bumpy it's been long time, maybe google apis changed (try to play with it first). Besides use android volley in place of my old RESTClient. If you want to log response use: rest.setDebug(true); and then from shell: ./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 VERBOSEMaltose
Thanks for the reply, Luca. I'll see if I can figure something out with volley.Bumpy

© 2022 - 2024 — McMap. All rights reserved.