Android 在线翻译

来源:互联网 发布:13年总决赛格林数据 编辑:程序博客网 时间:2024/06/14 05:03

之前安装了各种翻译软件后,因其频繁的广告,不得已而删除。而自己只是想要一个简易的翻译功能,帮助自己完成阅读。

今天做一个属于自己的翻译工具,只有简单的翻译功能 (包含百度翻译和谷歌翻译两种翻译方式),界面比较简单,没有优化。

下面先来看一下词典效果:          

一. 百度在线翻译

百度翻译可以通过HTTP访问

GET请求方式:http://openapi.baidu.com/public/2.0/bmt/translate?client_id=YourApiKey&q=today&from=auto&to=auto

得到Json格式的翻译结果:

"from":"en","to":"zh","trans_result":[{"src":"hello world","dst":"你好世界"}]}

Utils.java 工具类
package com.why.demo.transla;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;public class Utils {private static final String PATH = "http://openapi.baidu.com/public/2.0/bmt/translate";private static String API_KEY = "<span style="font-family: Verdana, Arial, Helvetica, sans-serif;">YourApiKey</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif;">"; // 自己的app_id</span>    public static String upLoad(String requestText,String from, String to){    String result = "";try {List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("client_id", API_KEY));params.add(new BasicNameValuePair("q",requestText));params.add(new BasicNameValuePair("from", from));params.add(new BasicNameValuePair("to", to));HttpPost request = new HttpPost(PATH); request.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));HttpResponse response = new DefaultHttpClient().execute(request);if(response.getStatusLine().getStatusCode()==200){result = EntityUtils.toString(response.getEntity(),HTTP.UTF_8);result = getResult(result);}} catch (Exception e) {e.printStackTrace();}return result;}        /** 解析Json,获取翻页后的内容*/    public static String getResult(String result){    try {JSONObject object = new JSONObject(result);JSONArray arr = object.getJSONArray("trans_result");JSONObject obj = (JSONObject) arr.get(0);result = obj.get("dst").toString();} catch (JSONException e) {e.printStackTrace();}    return result;    }}
创建主类:MainActivity.java

package com.why.demo.transla;import com.why.demo.transla.TranslateUtil;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.widget.EditText;import android.widget.Toast;import com.why.demo.transla.R;public class MainActivity extends Activity {private EditText src_lang = null, target_lang = null;private Handler handler = new Handler();private String result = "";private String from = "auto";  // enprivate String to = "auto"; // zh@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);src_lang = (EditText) findViewById(R.id.src_lang);target_lang = (EditText) findViewById(R.id.target_lang);}/** * 百度翻译 * @param v */public void baidu (View v) {if (src_lang.getText().toString().trim()==null|| src_lang.getText().toString().trim().equals("")) {Toast.makeText(MainActivity.this, "请先输入文字!", Toast.LENGTH_SHORT).show();}else {new Thread(baidu).start();   //在4.0以后网络的代码不能写在主线程中了, 需重开线程, 异步加载的方式加载数据}}/** * google翻译 * @param v */public void google (View v) {if (src_lang.getText().toString().trim()==null|| src_lang.getText().toString().trim().equals("")) {Toast.makeText(MainActivity.this, "请输入文字!", Toast.LENGTH_SHORT).show();}else {new Thread(google).start();}}Runnable baidu = new Runnable() {@Overridepublic void run() {result = Utils.upLoad(src_lang.getText().toString(), from, to);handler.post(new Runnable() {@Overridepublic void run() {target_lang.setText(result);  // 子线程刷新界面}});}};Runnable google = new Runnable() {@Overridepublic void run() {try { String originWord = src_lang.getText().toString().trim();  char c = originWord.charAt(0);    if(((c>='a'&&c<='z') || (c>='A'&&c<='Z'))) {  result = TranslateUtil.translate(originWord, from, "zh-CN");  // android.os.NetworkOnMainThreadException异常, 需重开线程, 异步加载的方式加载数据  } else {  result = TranslateUtil.translate(originWord, from, "en");}  handler.post(new Runnable() {@Overridepublic void run() {target_lang.setText(result);}});} catch (Exception e) {e.printStackTrace();}}};}

创建布局文件main.xml ,界面可以在这里优化

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical"    android:weightSum="8" >    <EditText        android:id="@+id/src_lang"        android:layout_width="fill_parent"        android:layout_height="0dp"        android:layout_weight="3"        android:gravity="top"        android:inputType="textMultiLine"        android:textSize="20dp" />    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center" >        <Button            android:id="@+id/tran1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="百度翻译"            android:textSize="20dp"            android:onClick="baidu" />        <Button            android:id="@+id/tran2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_toRightOf="@+id/tran1"            android:text="谷歌翻译"            android:textSize="20dp"            android:onClick="google" />    </RelativeLayout>    <EditText        android:id="@+id/target_lang"        android:layout_width="fill_parent"        android:layout_height="0dp"        android:layout_weight="3"        android:gravity="top"        android:inputType="textMultiLine"        android:textSize="20dp" /></LinearLayout>

二. 谷歌翻译

首先用httpclient 发送请求,再用jsoup 来解析html, 得到翻译结果的文字 

先创建HttpClientUtil类 发送请求

package com.why.demo.transla;import java.io.BufferedInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.util.Map;import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpVersion;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpRequestBase;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.PlainSocketFactory;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.entity.BufferedHttpEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;public class HttpClientUtil {protected static HttpClient httpclient = null;protected static String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7";static {if (httpclient == null) {HttpParams params = new BasicHttpParams();          HttpProtocolParams.setContentCharset(params, "utf-8");          HttpProtocolParams.setHttpElementCharset(params, "utf-8");          HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);          HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");            HttpConnectionParams.setConnectionTimeout(params, 5 * 1000);          HttpConnectionParams.setSoTimeout(params, 5 * 1000);          SchemeRegistry reg = new SchemeRegistry();reg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));reg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params,reg); httpclient = new DefaultHttpClient(connectionManager, params);  }}public static InputStream downloadAsStream(String url) throws Exception {InputStream is = (InputStream) download(url, null, null, false);return is;}@SuppressWarnings("finally")public static Object download(final String url, final File saveFile, final Map<String, String> params,final boolean isPost) throws Exception {boolean saveToFile = saveFile != null;if (saveToFile && saveFile.getParentFile().exists() == false) {saveFile.getParentFile().mkdirs();}Exception err = null;HttpRequestBase request = null;HttpResponse response = null;HttpEntity entity = null;FileOutputStream fos = null;Object result = null;try {if (isPost) {request = new HttpPost(url);} else {request = new HttpGet(url);}addHeaderAndParams(request, params); // add header & paramsresponse = httpclient.execute(request);  // connectentity = response.getEntity();entity = new BufferedHttpEntity(entity);if (saveToFile) {fos = new FileOutputStream(saveFile);IOUtils.copy(entity.getContent(), fos);result = saveFile;} else {result = new BufferedInputStream(entity.getContent());}} catch (Exception e) {err = e;} finally {IOUtils.closeQuietly(fos);  // closerequest = null;  // clearresponse = null;entity = null;if (err != null) {throw err;}return result;}}/** * add params * @param request * @param params */protected static void addHeaderAndParams(final HttpRequestBase request, final Map<String, String> params) {request.addHeader("User-Agent", userAgent); // add default headerif (params != null) {// map --> HttpParamsBasicHttpParams myParams = new BasicHttpParams();for (String key : params.keySet()) {myParams.setParameter(key, params.get(key));}request.setParams(myParams);}}}
创建TranslateUtil.java 类 用jsoup 来解析html

package com.why.demo.transla;import java.io.InputStream;import java.net.URLEncoder;import java.text.MessageFormat;import org.apache.commons.io.IOUtils;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;/** * TranslateUtil */public class TranslateUtil {protected static final String URL_TEMPLATE = "http://translate.google.cn/?langpair={0}&text={1}";protected static final String ID_RESULTBOX = "result_box";protected static final String ENCODING = "UTF-8";/** * <pre>Google翻译</pre> */public static String translate(final String text, final String src_lang, final String target_lang)throws Exception {InputStream is = null;Document doc = null;Element ele = null;try {String url = MessageFormat.format(URL_TEMPLATE,URLEncoder.encode(src_lang + "|" + target_lang, ENCODING),URLEncoder.encode(text, ENCODING));is = HttpClientUtil.downloadAsStream(url);doc = Jsoup.parse(is, ENCODING, ""); // parse html by Jsoupele = doc.getElementById(ID_RESULTBOX);String result = ele.text();return result;} finally {IOUtils.closeQuietly(is);is = null;doc = null;ele = null;}}}

通过以上代码,可以自制适合自己的翻译工具, 界面部分可以在main.xml 文件中优化,添加自己喜欢的布局, 也可以继续拓展其他功能,比如:复制翻译结果,存储到笔记到,方便以后的调用等等一些功能,在此不再介绍,以后可能会完善。

稍微说下,其实复制文字功能很简单,系统为我们提供了clipboardManager 接口,把需要复制的内容传递到clip中即可:

ClipboardManager cmb = (ClipboardManager) getSystemService(context.CLIPBOARD_SERVICE);ClipData clip = ClipData.newPlainText("simple", result);cmb.setPrimaryClip(clip);

参考:http://www.oschina.net/code/snippet_101410_11675

0 0