Иногда возникает необходимость быстро перевести документ, будь то мануал или табличка. Есть конечно GoogleDrive/GoogleDocs и прочие сервисы. Но мы рассмотрим как это сделать самим с помощью GoogleTranslate.

Кликнув по ссылке попадаем на страничку с формой загрузки документов. Открываем консоль в браузере и загружаем документ. Попадаем на страничку с переведенным текстом. ОК, нужные данные для работы мы увидели и пора самим сделать что-то подобное. Но для начале заглянем что же он умеет переводить. Справка говорит нам что мы можем переводить PDF, TXT, DOC, PPT, XLS и RTF. Если нам нужны DOCX или ODT, то мы научим Google переводить и их, немного обманув его.
Сначала напишем код для выгрузки файлов на сервер (код работает и на j2me/Blackberry, только класс HttpURLConnection нужно заменить на HttpConnection, специально так написан).
ОК, файлы выгружать мы можем, теперь напишем код отправки файла на сервер
В итоге мы получили html с переведенным текстом. Как его отобразить или распарсить решать уже вам.
Теперь вернемся к DOCX и ODT. На Хабре есть уже статья как из этих форматов файлов извлекать содержимое, точнее текст. Но там пример для PHP. Переведем его в JAVA. Для Android импортируем java.util.zip.*; для j2me net.sf.zipme.*;
И мы получаем обычный PLAIN текст, который можно перевести вышеуказанным способом.
Вот и вся магия. Пользуйтесь на здоровье.
Введение:
Первым делом посмотрим в сторону GoogleTranslate API. К сожалению нужного функционала мы там не увидим. Нужен ключ, да и вообще он переводит только переданный в запросе текст. Идем на сайт GoogleTranslate. Там видим то что нам нужно
Кликнув по ссылке попадаем на страничку с формой загрузки документов. Открываем консоль в браузере и загружаем документ. Попадаем на страничку с переведенным текстом. ОК, нужные данные для работы мы увидели и пора самим сделать что-то подобное. Но для начале заглянем что же он умеет переводить. Справка говорит нам что мы можем переводить PDF, TXT, DOC, PPT, XLS и RTF. Если нам нужны DOCX или ODT, то мы научим Google переводить и их, немного обманув его.
Ну что ж, начнем ваять.
Писать будем для Android и java mobile.Сначала напишем код для выгрузки файлов на сервер (код работает и на j2me/Blackberry, только класс HttpURLConnection нужно заменить на HttpConnection, специально так написан).
package com.google;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.util.Enumeration;
import java.util.Hashtable;
import translate.Translator;
//import javax.microedition.io.Connector;
//import javax.microedition.io.HttpConnection;
public class HttpMultipartRequest {
static final String BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy";
byte[] postBytes = null;
String url = null;
public HttpMultipartRequest(String url, Hashtable params, String fileField, String fileName, String fileType, byte[] fileBytes) throws Exception {
this.url = url;
String boundary = getBoundaryString();
String boundaryMessage = getBoundaryMessage(boundary, params, fileField, fileName, fileType);
String endBoundary = "\r\n--" + boundary + "--\r\n";
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(boundaryMessage.getBytes());
bos.write(fileBytes);
bos.write(endBoundary.getBytes());
this.postBytes = bos.toByteArray();
bos.close();
}
String getBoundaryString() {
return BOUNDARY;
}
String getBoundaryMessage(String boundary, Hashtable params, String fileField, String fileName, String fileType) {
StringBuffer res = new StringBuffer("--").append(boundary).append("\r\n");
Enumeration keys = params.keys();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = (String) params.get(key);
res.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n")
.append("\r\n").append(value).append("\r\n")
.append("--").append(boundary).append("\r\n");
}
res.append("Content-Disposition: form-data; name=\"").append(fileField).append("\"; filename=\"").append(fileName).append("\"\r\n")
.append("Content-Type: ").append(fileType).append("\r\n\r\n");
return res.toString();
}
public byte[] send() throws Exception {
InputStream is = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] res = null;
try {
/* 4Android */
HttpURLConnection hc = null;
java.net.URL urls = new java.net.URL(url);
hc = (java.net.HttpURLConnection) urls.openConnection();
hc.setAllowUserInteraction(false);
hc.setInstanceFollowRedirects(true);
hc.setDoInput(true);
hc.setDoOutput(true);
/* j2me
HttpConnection hc = null;
hc = (HttpConnection) Connector.open(url);
*/
hc.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110304 Firefox/3.6.15");
hc.setRequestProperty("Accept-Charset", "utf-8");
hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + getBoundaryString());
hc.setRequestMethod("POST");
OutputStream dout = hc.getOutputStream(); // hc.openOutputStream();
dout.write(postBytes);
dout.close();
is = hc.getInputStream(); // hc.openInputStream();
byte[] buffer = new byte[1024];
int read;
while ((read = is.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, read);
}
bos.flush();
System.out.println("__size " + bos.size());
res = bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bos != null) {
bos.close();
}
if (is != null) {
is.close();
}
if (hc != null) {
// hc.close();
hc.disconnect();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return res;
}
}
ОК, файлы выгружать мы можем, теперь напишем код отправки файла на сервер
byte[] bin; //наш файл
String file; //название файла в фс
String mime;
if (file.endsWith(".ppt")) {
mime = ("application/vnd.ms-powerpoint");
} else if (file.endsWith(".pdf")) {
mime = ("application/pdf");
} else if (file.endsWith("doc")) {
mime = ("application/msword");
} else if (file.endsWith(".txt")) {
mime = ("text/plain");
} else if (file.endsWith(".rtf")) {
mime = ("application/rtf");
} else if (file.endsWith(".xls")) {
mime = ("application/vnd.ms-excel");
} else {
mime = ("application/octet-stream");
}
Hashtable params = new Hashtable();
params.put("old_sl", source); //исходный язык
params.put("sl", source);
params.put("old_tl", lang);//необходимый язык
params.put("tl", lang);
String actionUri = "http://translate.googleusercontent.com/translate_f";
HttpMultipartRequest req = new HttpMultipartRequest(actionUri,
params, "file", file.substring(file.lastIndexOf('/')),
mime, bin);
bin = req.send();
String parse =new String(bin, "UTF-8");
В итоге мы получили html с переведенным текстом. Как его отобразить или распарсить решать уже вам.
Теперь вернемся к DOCX и ODT. На Хабре есть уже статья как из этих форматов файлов извлекать содержимое, точнее текст. Но там пример для PHP. Переведем его в JAVA. Для Android импортируем java.util.zip.*; для j2me net.sf.zipme.*;
public String docx2text(InputStream is) {
return getText(is, "word/document.xml");
}
public String odt2text(InputStream is) {
return getText(is, "content.xml");
}
public String getText(InputStream is, String fileName) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String result;
try {
ZipInputStream zis = new ZipInputStream(is);
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
if (ze.getName().equals(fileName)) {
byte ch;
boolean add = false;
while ((ch = (byte) zis.read()) != -1) {
if (ch == '<') {
add = false;
} else if (ch == '>') {
add = true;
} else if (add) {
bos.write(ch);
}
}
break;
}
}
zis.close();
result =new String(bos.toByteArray(), "UTF-8");
bos.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return result;
}
И мы получаем обычный PLAIN текст, который можно перевести вышеуказанным способом.
Вот и вся магия. Пользуйтесь на здоровье.