4

次のコードを使用して、Google 翻訳アクティビティを起動する Android アプリケーションを開発しました。

...
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 翻訳アクティビティから呼び出されますが、datanull です。したがって、Google 翻訳から翻訳されたテキストをアプリケーションに戻す方法はないと思います。これは正しいです?

また、これを行う方法があった場合、API の利用規約に違反しますか? Google 翻訳のオフライン言語パック/翻訳を使用しても違反になりますか?

Google の開発者 (従業員) がたまたまこれを見て、意見を述べていただけると幸いです。私は本当に公式の応答を探しています。

ありがとう!

4

1 に答える 1

1

これが可能かどうかも知りたいです。

一方、ここで単純なテキストを翻訳する必要がある場合は、 Google Translate Http Serviceをラップするクラスを使用します。

合法かどうかわからないので、本番環境で使用したことはありません(リリースされたアプリを読んでください)。

したがって、Google(従業員)があなたの質問に答える場合..このアプローチが合法であるかどうかを教えてくれるかもしれません.

便宜上、Google Translate Http Service をラップする単純な AsyncTask を次に示します。

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

[RESTClient クラス] は HttpClient のラッパーです。ソース コードはここにあります。

よろしく、

ルカ

于 2013-08-09T19:39:31.557 に答える