Как стать автором
Обновить

Еще один способ перевода документов с помощью GoogleTranslate

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

Введение:
Первым делом посмотрим в сторону 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 текст, который можно перевести вышеуказанным способом.
Вот и вся магия. Пользуйтесь на здоровье.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.