import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
public class GetTranslation {
private static String translate(String langpair,String text) {
/**********************************************************
* 要這一行動起來, 你要有一些相依的library才行
* commons-logging
* commons-codec
*/
HttpClient client = new HttpClient();
/***********************************************************
* 設定連線的站臺位置
* 請別在"站臺位置"加了多餘的protocol
* ex. setHost("http://tinyurl.com", 80, "http");
* 不然他就噴UnknownHostException給你:P
*/
client.getHostConfiguration().setHost("www.google.com", 80, "http");
/***********************************************************
* 觀察了表單內容是用post方法, 而使用的script name為create.php
*/
PostMethod post = new PostMethod("/translate_t");
//post.addParameter(new NameValuePair("url", url));
post.addParameter("langpair", langpair);
post.addParameter("text", text);
String s = null;
try {
/***********************************************************
* 透過http client來執行post/get方法
*/
client.executeMethod(post);
/***********************************************************
* 再用您選用的方法傳回response body
* 這裡偷懶了一下使用了getResponseBodyAsString()
* log上會發出警告
*
* 2006/5/18 上午 08:13:22 org.apache.commons.httpclient.HttpMethodBase getResponseBody
* 警告: Going to buffer response body of large or unknown size.
* Using getResponseBodyAsStream instead is recommended.
*/
InputStream in = post.getResponseBodyAsStream();
BufferedReader buf = new BufferedReader(new InputStreamReader(in));
Pattern p = Pattern.compile(".*id=\"*result_box\"*\\ *dir=\"*ltr\"*\\>");
Matcher m = null;
String line;
while ((line = buf.readLine()) != null) {
m = p.matcher(line);
//System.out.println(line);
if (m.find()) {
s = line.substring(m.end());
line = s;
p = Pattern.compile("\\<\\ */\\ *div\\ *\\>");
m = p.matcher(line);
if (m.find()) {
s = line.substring(0, m.start());
}
break;
}
}
//s = GetTranslation.instostr(in);
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
public static String instostr (InputStream in) throws IOException {
StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
return out.toString();
}
/** @param filePath the name of the file to open. Not sure if it can accept URLs or just filenames. Path handling could be better, and buffer sizes are hardcoded
*/
public static void translateFile(String langpair, String inPath,String outPath) {
BufferedReader reader=null;
BufferedWriter writer=null;
try {
reader = new BufferedReader(new FileReader(inPath));
writer = new BufferedWriter(new FileWriter(outPath));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Pattern p = Pattern.compile("=");
Matcher m = null;
int count=0;
String var=null, val=null;
String line=null, lines="", ret="";
try {
while ((line=reader.readLine())!=null) {
if (line.contains("=")) {
m = p.matcher(line);
if (m.find()) {
count++;
var = line.substring(0,m.start());
val = line.substring(m.end()+1,line.length()-1);
lines+=var+"="+val+"\n";
//System.out.println(var+"='"+GetTranslation.translate(langpair,val)+"'");
}
} else {
writer.write(line);
writer.newLine();
}
if (count==200) {
ret = GetTranslation.translate(langpair,lines);
ret = ret.replace("=", "=\"");
ret = ret.replace("
", "\"\n");
System.out.println(ret);
writer.write(ret);
lines="";
count=0;
Thread.sleep(5000);
}
}
if (count>0) {
ret=lines;
ret = GetTranslation.translate(langpair,lines);
ret = ret.replace("=", "=\"");
ret = ret.replace("
", "\"\n");
System.out.println(ret);
writer.write(ret);
lines="";
Thread.sleep(5000);
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws HttpException, IOException {
if(null == args || args.length < 3) {
System.out.println("Usage: java GetTranslation language_pair original_file translated_file");
System.out.println("Example: java GetTranslation \"en|zh-TW\" \"en_US\" \"zh_TW\"");
//String ret = GetTranslation.translate("en|zh-TW","hello");
//System.out.println("Return Value: "+ret);
System.exit(1);
}
//System.out.println(GetTranslation.translate("en|zh-TW","hello"));
//GetTranslation.translateFile("en|zh-TW","en_US","zh_TW");
GetTranslation.translateFile(args[0],args[1],args[2]);
//GetTranslation.translateFile("en|zh-TW","en_US","zh_TW");
//String ret = GetTranslation.translate("en|zh-TW","hello");
//System.out.println("Return Value: "+ret);
}
}