原文章:https://blog.csdn.net/pifutan/article/details/78554691。结合原文按照自己需求,实现功能。效果如下:

功能实现:

使用Android自带Spinner

<LinearLayoutandroid:id="@+id/ll_top_translate"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:gravity="center"android:orientation="horizontal"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@id/vv_top_translate_trans"><Spinnerandroid:layout_marginLeft="10dp"android:spinnerMode="dropdown"android:id="@+id/sp_untranslated"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"></Spinner><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/icon_switch_translate" /><Spinnerandroid:layout_marginRight="10dp"android:layout_weight="1"android:id="@+id/sp_translated"android:layout_width="0dp"android:layout_height="wrap_content"></Spinner>
</LinearLayout>

activity里面使用固定两组数组为Spinner绑定数据,一组负责显示,另一组负责根据选择的位置获取语言代码,两个数组是一一对应的

final String[] languageArr = {"Automatic", "Afrikaans", "Albanian", "Arabic", "Armenian", "Azerbaijani", "Basque", "Belarusian", "Bengali", "Bosnian", "Bulgarian", "Catalan", "Cebuano", "Chichewa", "Chinese Simplified", "Chinese Traditional", "Corsican", "Croatian", "Czech", "Danish", "Dutch", "English", "Esperanto", "Estonian", "Filipino", "Finnish", "French", "Frisian", "Galician", "Georgian", "German", "Greek", "Gujarati", "Haitian Creole", "Hausa", "Hawaiian", "Hebrew", "Hindi", "Hmong", "Hungarian", "Icelandic", "Igbo", "Indonesian", "Irish", "Italian", "Japanese", "Javanese", "Kannada", "Kazakh", "Khmer", "Korean", "Kurdish (Kurmanji)", "Kyrgyz", "Lao", "Latin", "Latvian", "Lithuanian", "Luxembourgish", "Macedonian", "Malagasy", "Malay", "Malayalam", "Maltese", "Maori", "Marathi", "Mongolian", "Myanmar (Burmese)", "Nepali", "Norwegian", "Pashto", "Persian", "Polish", "Portuguese", "Punjabi", "Romanian", "Russian", "Samoan", "Scots Gaelic", "Serbian", "Sesotho", "Shona", "Sindhi", "Sinhala", "Slovak", "Slovenian", "Somali", "Spanish","Sudanese", "Swahili", "Swedish", "Tajik", "Tamil", "Telugu", "Thai", "Turkish", "Ukrainian", "Urdu", "Uzbek", "Vietnamese", "Welsh", "Xhosa", "Yiddish", "Yoruba", "Zulu"
};final String[] languageCode = {"auto", "af", "sq", "ar", "hy", "az", "eu", "be", "bn", "bs", "bg", "ca", "ceb", "ny", "zh-cn", "zh-tw", "co", "hr", "cs", "da", "nl", "en", "eo", "et", "tl", "fi", "fr", "fy", "gl", "ka", "de", "el", "gu", "ht", "ha", "haw", "iw", "hi", "hmn", "hu", "is", "ig", "id", "ga", "it", "ja", "jw", "kn", "kk", "km", "ko", "ku", "ky", "lo", "la", "lv", "lt", "lb", "mk", "mg", "ms", "ml", "mt", "mi", "mr", "mn", "my", "ne", "no", "ps", "fa", "pl", "pt", "ma", "ro", "ru", "sm", "gd", "sr", "st", "sn", "sd", "si", "sk", "sl", "so", "es", "su", "sw", "sv", "tg", "ta", "te", "th", "tr", "uk", "ur", "uz", "vi", "cy", "xh", "yi", "yo", "zu"};
Spinner sp_untranslated = findViewById(R.id.sp_untranslated);
Spinner sp_translated = findViewById(R.id.sp_translated);

给Spinner设置adapter,adapter条目的布局是自己定义的

//创建ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.spinner_checked_text, languageArr) {@Overridepublic View getDropDownView(int position, View convertView,ViewGroup parent) {View view = inflate(getContext(), R.layout.spinner_item_layout,null);TextView label = (TextView) view.findViewById(R.id.spinner_item_label);label.setText(languageArr[position]);return view;}
};
adapter.setDropDownViewResource(R.layout.spinner_item_layout);sp_untranslated.setAdapter(adapter);
sp_translated.setAdapter(adapter);     /**输入选项监听*/sp_untranslated.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {if (languageCode[position] != null) {selectTranslatedCode = languageCode[position];//翻译的输入语言,定义的全局变量}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});/**输出选项监听*/sp_translated.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {if (languageCode[position] != null) {targetTranslatedCode = languageCode[position];//翻译的目标语言,定义的全局变量}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});

条目布局:spinner_item_layout

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white"android:padding="15dp" ><TextViewandroid:gravity="center_horizontal"android:id="@+id/spinner_item_label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical="true"android:textColor="@color/black"android:textSize="17sp" />
</RelativeLayout>

请求代码(拷贝原文的):

/**
 * 翻译回调
 */

public interface TranslateCallback{
    public void onTranslateDone(String result);
}
/**
 * 翻译工具类
 */

public class TranslateUtil {
    public static final String TRANSLATE_BASE_URL = "https://translate.google.cn/"; // 不需要翻墙即可使用
//    public static final String TRANSLATE_SINGLE_URL = "https://translate.google.cn/translate_a/single?client=gtx&sl=en&tl=zh&dt=t&q=Do%20not%20work%20overtime%20tonight";
    public static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36";

private static String LAN_AUTO = "auto";

/**
     * 翻译,包含http请求,需要异步,返回""则为翻译失败
     * @param sourceLan 源语言,如en,自动检测为auto
     * @param targetLan 目标语言如zh
     * @param content 翻译文本
     * @return ""为翻译失败,其余成功
     */
    public void translate(Context context, String sourceLan, String targetLan, String content, TranslateCallback callback) {
        TranslateTask task = new TranslateTask(context, sourceLan, targetLan, content, callback);
        task.executeOnExecutor(Executors.newCachedThreadPool());
    }

/**
     * 使用异步任务来翻译,翻译完成后回调callback
     */
    class TranslateTask extends AsyncTask<Void, Void, String> {
        String sourceLan;
        String targetLan;
        String content;
        Context context;
        TranslateCallback callback;
        private LoadingDalog loadingDalog = null; // 这个请自己定义加载中对话框,或者干脆不使用
        TranslateTask(Context context, String sourceLan, String targetLan, String content, TranslateCallback callback){
            this.context = context;
            this.content = content;
            this.callback = callback;
            this.sourceLan = sourceLan;
            this.targetLan = targetLan;
        }

@Override
        protected String doInBackground(Void... params) {
            String result = "";
            if (content == null || content.equals("")) {
                return result;
            }
            try {
                String googleResult = "";
                // 新建一个URL对象
                URL url = new URL(getTranslateUrl(sourceLan, targetLan, content));
                // 打开一个HttpURLConnection连接
                HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
                // 设置连接主机超时时间
                urlConn.setConnectTimeout(5 * 1000);
                //设置从主机读取数据超时
                urlConn.setReadTimeout(5 * 1000);
                // 设置是否使用缓存  默认是true
                urlConn.setUseCaches(false);
                // 设置为Post请求
                urlConn.setRequestMethod("GET");
                //urlConn设置请求头信息
                urlConn.setRequestProperty("User-Agent", USER_AGENT);
                //设置请求中的媒体类型信息。
//            urlConn.setRequestProperty("Content-Type", "application/json");
                //设置客户端与服务连接类型
//            urlConn.addRequestProperty("Connection", "Keep-Alive");
                // 开始连接
                urlConn.connect();
                // 判断请求是否成功
                int statusCode = urlConn.getResponseCode();
                if (statusCode == 200) {
                    // 获取返回的数据
                    googleResult = streamToString(urlConn.getInputStream());
                }
                // 关闭连接
                urlConn.disconnect();

// 处理返回结果,拼接
                JSONArray jsonArray = new JSONArray(googleResult).getJSONArray(0);
                for (int i = 0; i < jsonArray.length(); i++) {
                    result += jsonArray.getJSONArray(i).getString(0);
                }
            } catch (Exception e) {
//            result = "翻译失败";
                e.printStackTrace();
                result = "";
            }
            Log.d("TAG", "翻译结果:" + result);
            return result;
        }

@Override
        protected void onPostExecute(String result) {
            if (loadingDalog != null && loadingDalog.isShowing()) {
                loadingDalog.cancel();
            }
            if (callback != null){
                callback.onTranslateDone(result);
            }
            super.onPostExecute(result);
        }

@Override
        protected void onPreExecute() {
            super.onPreExecute();
            String str = context.getString(R.string.translating);
            try {
                loadingDalog = new LoadingDalog(context);// Dialog使用、初始化
                loadingDalog.setMessage(str);
                loadingDalog.show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

/**
     * 将输入流转换成字符串
     *
     * @param is 从网络获取的输入流
     * @return 字符串
     */
    public static String streamToString(InputStream is) {
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            out.close();
            is.close();
            byte[] byteArray = out.toByteArray();
            return new String(byteArray);
        } catch (Exception e) {
            return null;
        }
    }

public void translate(Context context, String targetLan, String content, TranslateCallback callback) {
        translate(context, LAN_AUTO, targetLan, content, callback);
    }

private static String getTranslateUrl(String sourceLan, String targetLan, String content) {
        try {
            return TRANSLATE_BASE_URL + "translate_a/single?client=gtx&sl=" + sourceLan + "&tl=" + targetLan + "&dt=t&q=" + URLEncoder.encode(content, "UTF-8");
        } catch (Exception e) {
            return TRANSLATE_BASE_URL + "translate_a/single?client=gtx&sl=" + sourceLan + "&tl=" + targetLan + "&dt=t&q=" + content;
        }
}

// 使用
TranslateCallback translateCallback = new TranslateCallback() {
    @Override
    public void onTranslateDone(String result) {
        // result是翻译结果,在这里使用翻译结果,比如使用对话框显示翻译结果
    }
}

调用时:

new TranslateUtil().translate(this, this.selectTranslatedCode, this.targetTranslatedCode, untranslatedText, translateCallback);

在上方TranslateCallback的onTranslateDone里面获取翻译结果显示到页面

-------------------------------------------------------------------------------------------------------------------------------------------

原文讲解:

例子: 
https://translate.google.cn/translate_a/single?client=gtx&sl=en&tl=zh&dt=t&q=Do%20not%20work%20overtime%20tonight

在浏览器打开会下载一个f.txt的文件,内容为: 
[[[“今晚不要加班”,”Do not work overtime tonight”,null,null,3]],null,”en”]。 
在android中使用流的方式接收,转化为json进行相应处理即可。

如果翻译很长比如: 
https://translate.google.cn/translate_a/single?client=gtx&sl=en&tl=zh&dt=t&q=The%20world%27s%20first%20railless%20train%20is%20tested%20in%20Zhuzhou,%20Central%20China%27s%20Hunan%20province,%20on%20Oct%2023,%202017.%20The%2030-meter%20train%20has%20three%20carriages%20and%20is%20developed%20by%20CRRC%20Zhuzhou%20Locomotive%20Co%20Ltd.%20The%20train%20can%20move%20at%20a%20speed%20of%2070%20km/h%20and%20can%20carry%20up%20to%20500%20passengers.

返回内容会是这个样子的: 
[[[“2017年10月23日,中国中部湖南省株洲市测试了世界上第一列无轨列车.30米长的列车有三个车厢,由中国中车株洲机车有限公司开发,列车时速可达70公里/”,”The world’s first railless train is tested in Zhuzhou, Central China’s Hunan province, on Oct 23, 2017. The 30-meter train has three carriages and is developed by CRRC Zhuzhou Locomotive Co Ltd. The train can move at a speed of 70 km/”,null,null,3],[“小时,可载500名乘客。”,”h and can carry up to 500 passengers.”,null,null,3]],null,”en”] 
只要进行相应处理与拼接即可。

sl=en 为source language,可设置为auto。 
tl=zh 为target language,设置为目标语言。 
注意在android中使用HttpURLConnection的话,需要设置User-Agent如:HttpURLConnection.setRequestProperty(“User-Agent”, “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36”);

支持的语言: 
“auto”:””Automatic”, 
“af”:”Afrikaans”, 
“sq”:”Albanian”, 
“ar”:”Arabic”, 
“hy”:”Armenian”, 
“az”:”Azerbaijani”, 
“eu”:”Basque”, 
“be”:”Belarusian”, 
“bn”:”Bengali”, 
“bs”:”Bosnian”, 
“bg”:”Bulgarian”, 
“ca”:”Catalan”, 
“ceb”:”Cebuano”, 
“ny”:”Chichewa”, 
“zh-cn”:”Chinese Simplified”, 
“zh-tw”:”Chinese Traditional”, 
“co”:”Corsican”, 
“hr”:”Croatian”, 
“cs”:”Czech”, 
“da”:”Danish”, 
“nl”:”Dutch”, 
“en”:”English”, 
“eo”:”Esperanto”, 
“et”:”Estonian”, 
“tl”:”Filipino”, 
“fi”:”Finnish”, 
“fr”:”French”, 
“fy”:”Frisian”, 
“gl”:”Galician”, 
“ka”:”Georgian”, 
“de”:”German”, 
“el”:”Greek”, 
“gu”:”Gujarati”, 
“ht”:”Haitian Creole”, 
“ha”:”Hausa”, 
“haw”:”Hawaiian”, 
“iw”:”Hebrew”, 
“hi”:”Hindi”, 
“hmn”:”Hmong”, 
“hu”:”Hungarian”, 
“is”:”Icelandic”, 
“ig”:”Igbo”, 
“id”:”Indonesian”, 
“ga”:”Irish”, 
“it”:”Italian”, 
“ja”:”Japanese”, 
“jw”:”Javanese”, 
“kn”:”Kannada”, 
“kk”:”Kazakh”, 
“km”:”Khmer”, 
“ko”:”Korean”, 
“ku”:”Kurdish (Kurmanji)”, 
“ky”:”Kyrgyz”, 
“lo”:”Lao”, 
“la”:”Latin”, 
“lv”:”Latvian”, 
“lt”:”Lithuanian”, 
“lb”:”Luxembourgish”, 
“mk”:”Macedonian”, 
“mg”:”Malagasy”, 
“ms”:”Malay”, 
“ml”:”Malayalam”, 
“mt”:”Maltese”, 
“mi”:”Maori”, 
“mr”:”Marathi”, 
“mn”:”Mongolian”, 
“my”:”Myanmar (Burmese)”, 
“ne”:”Nepali”, 
“no”:”Norwegian”, 
“ps”:”Pashto”, 
“fa”:”Persian”, 
“pl”:”Polish”, 
“pt”:”Portuguese”, 
“ma”:”Punjabi”, 
“ro”:”Romanian”, 
“ru”:”Russian”, 
“sm”:”Samoan”, 
“gd”:”Scots Gaelic”, 
“sr”:”Serbian”, 
“st”:”Sesotho”, 
“sn”:”Shona”, 
“sd”:”Sindhi”, 
“si”:”Sinhala”, 
“sk”:”Slovak”, 
“sl”:”Slovenian”, 
“so”:”Somali”, 
“es”:”Spanish”, 
“su”:”Sudanese”, 
“sw”:”Swahili”, 
“sv”:”Swedish”, 
“tg”:”Tajik”, 
“ta”:”Tamil”, 
“te”:”Telugu”, 
“th”:”Thai”, 
“tr”:”Turkish”, 
“uk”:”Ukrainian”, 
“ur”:”Urdu”, 
“uz”:”Uzbek”, 
“vi”:”Vietnamese”, 
“cy”:”Welsh”, 
“xh”:”Xhosa”, 
“yi”:”Yiddish”, 
“yo”:”Yoruba”, 
“zu”:”Zulu”

Android中谷歌翻译接口使用(使用谷歌翻译接口,App做文本翻译)相关推荐

  1. Android中实现为TextView添加多个可点击的文本

    这篇文章主要介绍了Android中实现为TextView添加多个可点击的文本,可实现类似Android社交软件显示点赞用户并通过用户名称进入该用户主页的功能,是非常实用的技巧,需要的朋友可以参考下.具 ...

  2. android 传递接口对象吗,android中Intent传递对象,需要实现Serializable接口或者Parcelable接口...

    Intent传递对象,有两种方法 1. 实现Serializable接口 类要生成序列化ID,并且不能是内部类 2. 实现Parcelable接口 参照Parcelable的doc文档 实现Seria ...

  3. android 和风天气 调用示例,Android中 GsonFormat插件解析Jason 数据+和风天气接口解析案例(示例代码)...

    首先 转载自http://www.cnblogs.com/androidsuperman/p/4579249.html     感谢 @西北野狼  同学. 第一部分: GsonFormat 插件基本使 ...

  4. android中如何使用一张图片适配不同尺寸的APP引导页

    在我们平常开发的过程中在做引导页适配的时候,有时候会犯难,怎么样作图可以将各种不同尺寸分辨率的手机都适配好也就是不变形不拉伸,官方给的说法也只是做多套图去适配不同的分辨率,遇到全屏展示引导这种问题的时 ...

  5. android 图片大小判断,android中如何使用一张图片适配不同尺寸的APP引导页

    在我们平常开发的过程中在做引导页适配的时候,有时候会犯难,怎么样作图可以将各种不同尺寸分辨率的手机都适配好也就是不变形不拉伸,官方给的说法也只是做多套图去适配不同的分辨率,遇到全屏展示引导这种问题的时 ...

  6. Android 中使用地图加载wms服务(高德地图,谷歌地图,天地图)

    转载请注明出处:http://blog.csdn.net/zkjthinking/article/details/77278838 由于公司需求需要在移动平台上加载自己发布的wms 服务: 高德地图加 ...

  7. android 英语论文,Android中Activity的生命周期英语论文+译文.doc

    Android中Activity的生命周期英语论文译文 北方民族大学 英文文献翻译 论文题目: Android环境及Activity介绍 院(部)名 称: 计算机科学与工程学院 学 生 姓 名: 陈 ...

  8. 如何在android中设置背景图片,在Android中设置窗口背景图

    Android窗口管理 在整个控件树的最顶端,是一个逻辑的树顶,ViewParent,在源码中的实现是ViewRoot(ViewRoot extends Handler implements View ...

  9. Android中的su命令使用

    Android开发工具系列目录 Android项目中Git工具的使用 史上最全Git命令使用手冊 史上最新最全的ADB命令行 Android中的su命令使用 Postman测试WebService接口 ...

最新文章

  1. anki 新的卡片类型_梁宝川:这一类型Anki卡片,你做了吗?
  2. python3 字符串、十六进制字符串、数字、字节之间的转换
  3. 邮件列表统计(网站推广)
  4. Visual Studio Online,带来四种开发模式,未来已来。
  5. java ha_java – Haproxy Bad Gateway 502
  6. 联想g510升级方案_联想智慧中国行,聚焦第一古城,助力企业智能升级
  7. java 10大常见异常
  8. Linux打包压缩.md
  9. android 4.4.4版本拍照预览,在Android5.1及以下版本的手机上无法预览
  10. Oracle 过程中检查数据表存在与否
  11. 《锋利的JQuery》notes
  12. idea导入项目出现乱码
  13. 软考中级软件设计师备考详细资料
  14. 前端基础之HTML5音视频标签(video/audio)讲解
  15. 无刷直流电机学习笔记5
  16. finecms aip.php漏洞,finecms 最新版v2.3.3前台getshell
  17. OneNET麒麟座应用开发之一:初识OneNET麒麟座
  18. Kali使用中文输入法
  19. Linux系列:linux中查看文件时显示行号
  20. SecurityContextHolder.getContext().getAuthentication()正常请求有时候获取authentioncation为空异常问题

热门文章

  1. 遭遇 Trojan.DL.Agent.cjy、ltnward.exe、34E0AE22.dll 等
  2. 如何解决安卓报错:android.content.ActivityNotFoundException: Unable to find explicit activity class
  3. Uncaught ReferenceError: URLSearchParams is not defined
  4. 若可框架,关于dicts字典的用法
  5. 校园心理网站html模板,基于SSM的校园心理咨询服务平台
  6. Win10重置网络后wifi没了
  7. linux安装FFMPEG库
  8. workbench应力应变曲线_ansys workbench怎样输出一条线上的应力值
  9. 电感啸叫原因与应对措施
  10. 当下互联网求职环境越来越差,作为初出茅庐的程序员感觉已凉,大厂面试成了炮灰...