package com.translatemodule;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.translatemodule.bean.TransBean;
import com.translatemodule.bean.TranslationBean;
import com.yutils.JsonManager;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import retrofit2.Retrofit;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by yangc on 2017/5/7.
* E-Mail:yangchaojiang@outlook.com
* Deprecated: 百度和有道集成翻译管理类
*/
public class TranslateManager {
public static final String TAG = "TranslateManager";
private static final String BAIUD_API = "http://api.fanyi.baidu.com/";
private static final String YOUDAO_API = "http://fanyi.youdao.com/";
// private String baiDuAppId = "20170507000046511";
// private String securityKey = "d302ZyY9lAXS52_yg3aG";
// private String youDaoKey = "36078788";
// private String youDaoSecurityKey = "yangchaojang";
private String baiDuAppId = null;
private String securityKey = null;
private String youDaoKey = null;
private String youDaoSecurityKey = null;
// public static void main(String[] args) {
// String query = "高度";
// TranslateManager translateManager = new TranslateManager();
// translateManager.getBaiDu(query, "auto", "en");
// // System.out.println(api.getTransResult(query, "auto", "en"));
//
// }
/****
* 百度 api
*
* @param appId 百度appId
* @param securityKey 密钥
*****/
public void initBaidu(String appId, String securityKey) {
this.baiDuAppId = appId;
this.securityKey = securityKey;
}
/****
* 有道 api
*
* @param youDaoKey youDaoKey
* @param securityKey 有道秘钥
*****/
public void initYouDao(String youDaoKey, String securityKey) {
this.youDaoKey = youDaoKey;
this.youDaoSecurityKey = securityKey;
}
/****
* 百度翻译
*
* @param body 翻译的内容
* @param from 要翻译的语言
* @param to 翻译成的语言 百度
***/
public Observable<TransBean> getBaiDu(String body, String from, String to) {
Retrofit retrofit = new Retrofit.Builder().baseUrl(BAIUD_API).build();
return retrofit.create(TranslateService.class)
.getBaiDu(buildBaiParams(body, from, to))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/*****
* 百度翻译 翻译成英语
*
* @param body 翻译的内容
* @return Observable
****/
public Observable<TransBean> getBaiDuEn(String body) {
return getBaiDu(body, "auto", "en");
}
/*****
* 百度翻译 翻译成汉语
*
* @param body 翻译的内容
* @return Observable
****/
public Observable<TransBean> getBaiDuZh(String body) {
return getBaiDu(body, "auto", "zh");
}
/****
* 有道翻译
*
* @param query 要翻译的语言 必须是UTF-8编码 自动检测语言 ,目前支持中英文
***/
public Observable<TranslationBean> getYouDao(String query) throws UnsupportedEncodingException {
return getYouDao(query, "translate").map(new Func1<String, TranslationBean>() {
@Override
public TranslationBean call(String s) {
if (s.isEmpty()) return null;
return JsonManager.jsonToBean(s, TranslationBean.class);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/****
* 有道翻译
*
* @param query 要翻译的语言 必须是UTF-8编码 自动检测语言 ,目前支持中英文
* @param only 可选参数,dict表示只获取词典数据,translate表示只获取翻译数据,默认为都获取
* @return Observable<String>
***/
private Observable<String> getYouDao(String query, String only) throws UnsupportedEncodingException {
Retrofit retrofit = new Retrofit.Builder().baseUrl(YOUDAO_API).build();
return retrofit.create(TranslateService.class)
.getYouDaoString(buildYouParams(query, only))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/****
* 有道翻译
*
* @param query 要翻译的语言 必须是UTF-8编码 自动检测语言 ,目前支持中英文
* @param only 可选参数,dict表示只获取词典数据,translate表示只获取翻译数据,默认为都获取
* @return Observable<JSONObject>
***/
public Observable<JSONObject> getYouDaoJson(String query, String only) throws UnsupportedEncodingException {
return getYouDao(query, only).map(new Func1<String, JSONObject>() {
@Override
public JSONObject call(String s) {
if (s.isEmpty()) return null;
return JSON.parseObject(s);
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
/****
* 封装参数
*
* @param query 查询内容
* @param from 要翻译的语言
* @param to 翻译成的语言 百度
* @param to 翻译成的语言 百度
* @return Map<String, String>
***/
private Map<String, String> buildBaiParams(String query, String from, String to) {
Map<String, String> params = new HashMap<>();
params.put("q", query);
params.put("from", from);
params.put("to", to);
params.put("appid", baiDuAppId);
// 随机数
String salt = String.valueOf(System.currentTimeMillis());
params.put("salt", salt);
// 签名
String src = baiDuAppId + query + salt + securityKey; // 加密前的原文
params.put("sign", get32MD5(src));
return params;
}
/****
* 封装参数
*
* @param query 要翻译的语言 必须是UTF-8编码 自动检测语言 ,目前支持中英文
* @return Map<String,String>
***/
private Map<String, String> buildYouParams(String query, String only) throws UnsupportedEncodingException {
Map<String, String> params = new HashMap<>();
params.put("type", "data");
params.put("doctype", "json");
params.put("version", "1.1");
params.put("keyfrom", youDaoKey);
params.put("key", youDaoSecurityKey);
params.put("q", URLEncoder.encode(query, "UTF-8"));// 要翻译的文本,必须是UTF-8编码,字符长度不能超过200个字符,需要进行urlencode编码
params.put("only", only);//dict表示只获取词典数据,translate表示只获取翻译数据,默认为都获取
return params;
}
/**
* MD5 32位加密方法一 小写
*
* @param string
* @return
*/
public static String get32MD5(String string) {
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] strTemp = string.getBytes();
// 使用MD5创建MessageDigest对象
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte b = md[i];
str[k++] = hexDigits[b >> 4 & 0xf];
str[k++] = hexDigits[b & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
}