/* * This file is part of TradutorGalego. * TradutorGalego is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * TradutorGalego is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with TradutorGalego. If not, see <http://www.gnu.org/licenses/>. */ package es.galapps.android.tradutorgalego.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.os.AsyncTask; import android.widget.Toast; import es.galapps.android.tradutorgalego.R; import es.galapps.android.tradutorgalego.model.HtmlTranslation; public abstract class TranslateTask extends AsyncTask<String, Void, HtmlTranslation> { protected static final String SERVER_URL = "http://www.xunta.es/tradutor/text.do"; protected static final String OPTIONS = "OPTIONS:"; protected static final String CONNECTION_ERROR = "CONNECTION_ERROR"; private final ProgressDialog dialog; private final Context context; public TranslateTask(Context context) { super(); this.context = context; this.dialog = new ProgressDialog(context); this.dialog.setCancelable(true); this.dialog.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface arg0) { TranslateTask.this.cancel(true); } }); this.dialog.setMessage(this.context.getString(R.string.loadingData)); } @Override protected void onPreExecute() { this.dialog.show(); } private String getLanguageCode(String language) { if (language.equals("GALICIAN")) { return "gl"; } if (language.equals("SPANISH")) { return "es"; } if (language.equals("ENGLISH")) { return "en"; } if (language.equals("CATALAN")) { return "cat"; } return "fr"; } private String getLanguage(String languageCode) { if (languageCode.equals("gl")) { return "GALICIAN"; } if (languageCode.equals("es")) { return "SPANISH"; } if (languageCode.equals("en")) { return "ENGLISH"; } if (languageCode.equals("cat")) { return "CATALAN"; } return "FRENCH"; } private String getTranslationDirection(String origin, String dest) { return this.getLanguage(origin) + "-" + this.getLanguage(dest); } @Override protected HtmlTranslation doInBackground(String... parameters) { try { String translationDirection = "GALICIAN-SPANISH"; if (parameters.length != 1) { translationDirection = this.getTranslationDirection( parameters[1], parameters[2]); } String pivotLanguage = ""; if (translationDirection.contains("FRENCH") || translationDirection.contains("CATALAN")) { pivotLanguage = "&DTS_PIVOT_LANGUAGE=" + URLEncoder.encode("SPANISH", "UTF-8"); } URL url; String data = "text=" + URLEncoder.encode(parameters[0], "UTF-8"); data += "&translationDirection=" + URLEncoder.encode(translationDirection, "UTF-8") + "&subjectArea=" + URLEncoder.encode("(GV)", "UTF-8") + pivotLanguage; url = new URL(SERVER_URL); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter( conn.getOutputStream()); wr.write(data); wr.flush(); // Get the response BufferedReader in = new BufferedReader(new InputStreamReader( conn.getInputStream())); StringBuffer sb = new StringBuffer(""); String line = ""; String NL = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line + NL); } in.close(); Document doc = Jsoup.parse(sb.toString()); Element translationElement = doc.select("IFRAME").first(); String translation = translationElement.text(); String translationHtml = translationElement.html(); translationHtml = translationHtml.replaceAll("&lt;", "<"); translationHtml = translationHtml.replaceAll("&gt;", ">"); translationHtml = translationHtml.replaceAll("¿", ""); translationHtml = translationHtml.replaceAll("¡", "¡"); translationHtml = translationHtml.replaceAll("class=unknown", "class=\"unknown\""); translationHtml = this.getPreTranslation(this .getLanguageCode(translationDirection.split("-")[1])) + translationHtml + this.getPostTranslation() + this.getPreOriginal(this .getLanguageCode(translationDirection.split("-")[0])) + encode(parameters[0]) + this.getPostOriginal(); boolean showDicionarioIcon = false; boolean showConxugalegoIcon = false; if (parameters.length == 1 || parameters[2].equals("gl")) { showDicionarioIcon = parameters[0].split(" ").length == 1; showConxugalegoIcon = VolgaChecker.exists(context, translation); } return new HtmlTranslation(decode(parameters[0]), translation, encode(translationHtml), showDicionarioIcon, showConxugalegoIcon); } catch (IOException e) { e.printStackTrace(); return new HtmlTranslation(decode(parameters[0]), CONNECTION_ERROR, CONNECTION_ERROR, false, false); } } private String getPreTranslation(String language) { String translationDrawableName = ResourceUtils.getDrawableName( language, true); return "<div class=\"translationHeader\"><div class=\"translationTitle\">" + this.context.getString(R.string.translatedText) + "</div><div class=\"translationImage\"><img src=\"file:///android_res/drawable/" + translationDrawableName + ".png\" ></div></div><div class=\"translation\">"; } private String getPostTranslation() { return "</div>"; } private String getPreOriginal(String language) { String translationDrawableName = ResourceUtils.getDrawableName( language, true); return "<div class=\"originalHeader\"><div class=\"originalTitle\">" + this.context.getString(R.string.originalText) + "</div><div class=\"originalImage\"><img src=\"file:///android_res/drawable/" + translationDrawableName + ".png\" ></div></div><div class=\"original\">"; } private String getPostOriginal() { return "</div>"; } protected boolean isNumber(String s) { try { Integer.valueOf(s); return true; } catch (NumberFormatException e) { return false; } } @Override protected void onPostExecute(HtmlTranslation result) { if (this.dialog.isShowing()) { this.dialog.dismiss(); } if (result.getTranslationHtml().equals(CONNECTION_ERROR)) { this.onPostExecuteConnectionError(); } else { this.onPostExecuteTranslation(result); } } protected abstract void onPostExecuteConnectionError(); protected abstract void onPostExecuteTranslation(HtmlTranslation result); @Override protected void onCancelled() { super.onCancelled(); Toast.makeText(this.context, R.string.cancelled, Toast.LENGTH_SHORT) .show(); } private String decode(String word) { return word.replace("á", "á").replace("é", "é") .replace("í", "í").replace("ó", "ó") .replace("ú", "ú").replace("Ü", "ü") .replace("ñ", "ñ"); } private String encode(String word) { return word.replace("á", "á").replace("é", "é") .replace("í", "í").replace("ó", "ó") .replace("ú", "ú").replace("ü", "Ü") .replace("ñ", "ñ").replace("&amp;", "&") .replace("%20", " ").replace("\n", "<br/>").replace("%3F", "?") .replace("¡", "¡"); } }