如何使用谷歌翻译应用程序

时间:2011-02-08 09:10:54

标签: android google-translate

我编写了关于字典句子的程序,我希望在我的应用程序中有“google translator”应用程序的功能

我如何使用它,我应该导入任何东西吗?

6 个答案:

答案 0 :(得分:7)

据我所知,谷歌翻译Android应用程序没有公开你可以使用的任何标准Intent(这是一个很小的,但它同时很奇怪。你会认为谷歌会鼓励这个应用程序之间的交互类型..无论如何)。

但是,Google似乎已经通过web service打开了翻译API。这样,您就可以自己进行翻译并在应用中显示。这是一项更多的工作,但它应该做的工作。

如果您不想编写API包装器,可以查看google-api-translate-java

答案 1 :(得分:6)

我有同样的问题。最初,我尝试使用谷歌翻译Ajax API,但由于谷歌已弃用API版本1并将版本2作为付费服务,我的代码停止工作。然后,我反编译了谷歌翻译应用程序,查看了Smali代码并得到了一些关于其内部逻辑的提示。使用此代码,它适用于我:

private void callGoogleTranslateApps(String word, String fromLang, String toLang) {
    Intent i = new Intent();

    i.setAction(Intent.ACTION_VIEW);
    i.putExtra("key_text_input", word);
    i.putExtra("key_text_output", "");
    i.putExtra("key_language_from", fromLang);
    i.putExtra("key_language_to", toLang);
    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.TranslateActivity"));
    startActivity(i);
}

答案 2 :(得分:6)

Van Pho Ngoc的answer太棒了,谢谢你。

然而它最初对我来说并不起作用,在调查Translate apk之后,看起来他们已经略微修改了它们的文件结构,所以ComponentName现在应该是:

i.setComponent(
    new ComponentName(
        "com.google.android.apps.translate",
        "com.google.android.apps.translate.translation.TranslateActivity"));

不同之处在于“TranslateActivity”之前已经添加了“翻译”

所以我的最终版本,包括从西班牙语到英语的硬编码翻译,是:

Intent i = new Intent();
i.setAction(Intent.ACTION_VIEW);
i.putExtra("key_text_input", "Me gusta la cerveza");
i.putExtra("key_text_output", "");
i.putExtra("key_language_from", "es");
i.putExtra("key_language_to", "en");
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"));
startActivity(i);

答案 3 :(得分:5)

OMG!他们又一次改变了!它们使它看起来更合理,但与之前的版本不兼容。

Intent i = new Intent();
i.setAction(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_TEXT, "What is going on?");
i.putExtra("key_text_input", "Oh my God!");
i.putExtra("from", "en");
i.putExtra("to", "zh-CN");
i.setComponent(new ComponentName("com.google.android.apps.translate",
                "com.google.android.apps.translate.HomeActivity"));

看起来这是一个SEND意图,有两个额外的(BTW,可选)参数,“to”和“from”。

有一个问题:“key_text_input”优先于Intent.EXTRA_TEXT,“to”和“from”只能使用“key_text_input”。

对于那些使用每个新版本更改API的人来说,将“key_text_input”重命名为“text_input”只是合理的,所以我们期待下一个版本......

为了安全起见,我建议将Intent.EXTRA_TEXT和“key_text_input”设置为相同的值。

答案 4 :(得分:2)

添加以上答案:

传递 两个字母的 语言代码非常重要。使用3个字母的代码,它可能看起来像谷歌翻译应用程序没有收到任何数据。

此外,如果Intent.ACTION_VIEW不起作用,您可以使用Intent.ACTION_SEND

        intent = new Intent();
        //intent.setAction(Intent.ACTION_VIEW); // this did not work for me initially
        intent.setAction(Intent.ACTION_SEND);
        intent.putExtra(Intent.EXTRA_TEXT, m_text);
        intent.putExtra("key_text_input", m_text);
        intent.putExtra("key_text_output", "");
        intent.putExtra("key_language_from", m_language);
        intent.putExtra("key_language_to", lang_to);
        intent.putExtra("key_suggest_translation", "");
        intent.putExtra("key_from_floating_window", false);
        intent.setComponent(
            new ComponentName(
                "com.google.android.apps.translate",
                "com.google.android.apps.translate.HomeActivity"
                ));
    //try {
        startActivityForResult(intent, REQUEST_CODE_TRANSLATE);
    //...

答案 5 :(得分:0)

Google Translate活动名称会随着时间而变化,如果对它们进行硬编码,则代码将变得脆弱。

这是一种可与当前版本的Google翻译配合使用并会继续用于将来的更新的方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    for (ResolveInfo resolveInfo : getPackageManager().queryIntentActivities(new Intent().setAction(Intent.ACTION_PROCESS_TEXT).setType("text/plain"), 0)) {
        if (resolveInfo.activityInfo.packageName.equals("com.google.android.apps.translate")) {
            String activityName = resolveInfo.activityInfo.name;
            String packageName = resolveInfo.activityInfo.packageName;

            Intent intent = new Intent().setPackage(packageName)
                    .setClassName(packageName, activityName)
                    .setAction(Intent.ACTION_PROCESS_TEXT)
                    .setType("text/plain")
                    .putExtra(Intent.EXTRA_PROCESS_TEXT, "Nobody expects the Spanish Inquisition!")
                    .putExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, true);

            startActivity(intent);
        }
    }
} else {
    // >>> deprecated code from other answers goes here <<<
}