一种小型的翻译集合工具,这里 是一个使用示例。 目前仅支持汉英互译,支持的翻译来源:
将仓库的lib目录下的所有jar添加到classpath中。并确保ide的编码方式是**【UTF-8】**。
import com.lsj.trans.LANG;
import com.lsj.trans.factory.TFactory;
import com.lsj.trans.factory.TranslatorFactory;
public class Main {
public static void main(String[] args) throws Exception {
TFactory factory = new TranslatorFactory();
System.out.println(factory.get("google").trans(LANG.EN, LANG.ZH, "hello world"));
}
}
引入所需要的package。
import com.lsj.trans.LANG; /* 翻译的语言支持 */
import com.lsj.trans.factory.TFactory; /* 工厂接口 */
import com.lsj.trans.factory.TranslatorFactory; /* 翻译工厂 */
在实际进行翻译之前,需要初始化翻译工厂,该工厂提供不同类型的翻译实例。
TFactory factory = new TranslatorFactory();
有各种不同的翻译实例,不同的实例有不同的翻译能力。由工厂管理。工厂在初始化的时候会将用注解标注了的翻译类加载到工厂缓存中,工厂相同的情况,使用相同id获得的翻译实例是完全相同的,相当于单例模式。
Translator lator = factory.get("google");
String zhResult = lator.trans(LANG.EN, LANG.ZH, "Learn Git and GitHub without any code!"); //英文翻译为中文
String enResult = lator.trans(LANG.ZH, LANG.EN, "希拉里败选后大哭"); //中文翻译为英文
翻译是通过发送HTTP请求到指定服务器,服务器回应数据并解析结果来实现的。若解析成功,trans方法直接返回翻译结果,但若解析失败将会trans方法将会返回服务器回应的原始数据,以便调试。
该工具提供的API相当简单:
lator = factory.get("google");
lator = factory.get("baidu");
lator = factory.get("youdao");
lator = factory.get("jinshan");
lator = factory.get("tencent");
lator = factory.get("omi");
/*
*fromLang 和 toLang 用于指定源语言 与 目标翻译语言
*中文 LANG.ZH
*英文 LANG.EN
*
*/
lator.trans(LANG fromLang, LANG toLang, string);
扩展这里介绍如何使用本项目提供的构架扩展翻译源。只要用户知道翻译所需要发送的http请求的详细信息以及返回数据的解析方式,那么用户就可以通过继承Dispatch类和使用HttpParams类来完成自己的翻译实体类。作自行扩展主要需要知道以下类:
这是一个接口,它提供三个方法put() send2InputStream() send2String()
,分布用于添加待发送的数据以及进行发送。
当前支持有限,只支持两种子类实现。
HttpParams postParams = new HttpPostParams(); //用来添加并保存Post的数据
HttpParams getParams = new HttpGetParams(); //用来添加并保存Get的数据
HttpParams mimeParams = new HttpMimeParams(); //用来添加并保存Multipart/form数据
都只使用了最简单的情况,以key-value的方式将数据进行保存。需要注意的是, put方法是会返回对象本身的,因此可以通过链式方式进行数据的添加,这样代码更为美观,更少冗余。
Params.put("from", langMap.get(from))
.put("to", langMap.get(targ))
.put("query", query)
.put("transtype", "translang")
.put("simple_means_flag", "3");
请求的数据添加好后,就可以调用send2String()方法发送请求数据,并且得到一个String类型的返回数据。
String baseUrl = "http://....";
String strResponse = Params.send2String(baseUrl);
服务器的响应也可以用更底层的InputStream来获取
String baseUrl = "http://....";
InputStream is = Params.send2InputStream(baseUrl);
HttpParams抽象类只是个工具类,可以单独抽取出来使用。为了更方便我们的开发,提供了AbstractOnlineTranslator抽象类,我们开发新的在线翻译类都应该继承于该抽象类。除此外还需关注一下几点
类定义需要增加一个注解,注解里面是该翻译类的id。翻译工厂在实例化的时候会将标注了注解的类实例化,并存放在工程的缓存中,用户通过id可以获得该实例,正如之前所看到的代码。下面是一个类定义的示例
@TranslatorComponent(id = "translator-id")
final public class UserTranslator extends AbstractOnlineTranslator {
}
在trans方法中,就进行具体的翻译工作。提供翻译在线api所需要的参数,再将其发送过去获取回应后再解析即可。
@Override
public String getResponse(String from, String targ, String query) throws Exception{
String jsonString = new HttpPostParams()
.put(key, value)
.send2String("http://...");
return ParseJsonString(jsonString);
}
不同的翻译网站返回的结果的数据类型、数据结构都是不同的。例如有的数据类型是json,有的数据类型是xml,而数据结构更是大相径庭。为了适应这多变的情况,需要开发人员熟悉具体的数据类型和结构,自行做解析数据并提取出需要的内容。
@Override
protected String ParseJsonString(String jsonString){
JSONObject jsonObject = JSONObject.fromObject(jsonString); //将json字符串转换为json对象
....
return ... ;
}
以上就是一个完整的在自定义在线翻译类的开发方式,这里 可以参考一个Dispatch子类的实现。