org.codehaus.mojo.pml10n.GoogleInterpreter.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.pml10n.GoogleInterpreter.java

Source

package org.codehaus.mojo.pml10n;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*  http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

import org.apache.commons.lang.StringEscapeUtils;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.List;
import java.util.ArrayList;

/**
 * An interpreter that uses Google's Translation API to translate text.
 *
 * @author Stephen Connolly
 * @since 03-Oct-2009 14:23:01
 */
public class GoogleInterpreter implements Interpreter {
    private static final Map/*<Locale, String>*/ googleLanguages = getLocaleLanguageMap();

    private static final Map/*<Locale, String>*/ getLocaleLanguageMap() {
        Map/*<Locale, String>*/ result = new HashMap/*<Locale, String>*/();
        result.put(new Locale("af"), "af"); // AFRIKAANS
        result.put(new Locale("sq"), "sq"); // ALBANIAN
        result.put(new Locale("am"), "am"); // AMHARIC
        result.put(new Locale("ar"), "ar"); // ARABIC 
        result.put(new Locale("hy"), "hy"); // ARMENIAN 
        result.put(new Locale("az"), "az"); // AZERBAIJANI
        result.put(new Locale("eu"), "eu"); // BASQUE
        result.put(new Locale("be"), "be"); // BELARUSIAN
        result.put(new Locale("bn"), "bn"); // BENGALI
        result.put(new Locale("bh"), "bh"); // BIHARI
        result.put(new Locale("bg"), "bg"); // BULGARIAN
        result.put(new Locale("my"), "my"); // BURMESE
        result.put(new Locale("ca"), "ca"); // CATALAN
        result.put(new Locale("chr"), "chr"); // CHEROKEE
        result.put(new Locale("zh"), "zh"); // CHINESE 
        result.put(new Locale("zh", "CN"), "zh-CN"); // CHINESE_SIMPLIFIED
        result.put(new Locale("zh", "TW"), "zh-TW"); // CHINESE_TRADITIONAL
        result.put(new Locale("hr"), "hr"); // CROATIAN 
        result.put(new Locale("cs"), "cs"); // CZECH 
        result.put(new Locale("da"), "da"); // DANISH 
        result.put(new Locale("dv"), "dv"); // DHIVEHI 
        result.put(new Locale("nl"), "nl"); // DUTCH 
        result.put(new Locale("en"), "en"); // ENGLISH 
        result.put(new Locale("eo"), "eo"); // ESPERANTO 
        result.put(new Locale("et"), "et"); // ESTONIAN 
        result.put(new Locale("tl"), "tl"); // FILIPINO 
        result.put(new Locale("fi"), "fi"); // FINNISH 
        result.put(new Locale("fr"), "fr"); // FRENCH 
        result.put(new Locale("gl"), "gl"); // GALACIAN 
        result.put(new Locale("ka"), "ka"); // GEORGIAN 
        result.put(new Locale("de"), "de"); // GERMAN 
        result.put(new Locale("el"), "el"); // GREEK 
        result.put(new Locale("gn"), "gn"); // GUARANI 
        result.put(new Locale("gu"), "gu"); // GUJARATI 
        result.put(new Locale("iw"), "iw"); // HEBREW 
        result.put(new Locale("hi"), "hi"); // HINDI
        result.put(new Locale("hu"), "hu"); // HUNGARIAN 
        result.put(new Locale("is"), "is"); // ICELANDIC 
        result.put(new Locale("id"), "id"); // INDONESIAN 
        result.put(new Locale("iu"), "iu"); // INUKTITUT 
        result.put(new Locale("ga"), "ga"); // IRISH 
        result.put(new Locale("it"), "it"); // ITALIAN 
        result.put(new Locale("ja"), "ja"); // JAPANESE 
        result.put(new Locale("kn"), "kn"); // KANNADA 
        result.put(new Locale("kk"), "kk"); // KAZAKH 
        result.put(new Locale("km"), "km"); // KHMER 
        result.put(new Locale("ko"), "ko"); // KOREAN 
        result.put(new Locale("ku"), "ku"); // KURDISH 
        result.put(new Locale("ky"), "ky"); // KYRGYZ 
        result.put(new Locale("lo"), "lo"); // LAOTHIAN 
        result.put(new Locale("lv"), "lv"); // LATVIAN 
        result.put(new Locale("lt"), "lt"); // LITHUANIAN 
        result.put(new Locale("mk"), "mk"); // MACEDONIAN 
        result.put(new Locale("ms"), "ms"); // MALAY 
        result.put(new Locale("ml"), "ml"); // MALAYALAM 
        result.put(new Locale("mt"), "mt"); // MALTESE 
        result.put(new Locale("mr"), "mr"); // MARATHI 
        result.put(new Locale("mn"), "mn"); // MONGOLIAN 
        result.put(new Locale("ne"), "ne"); // NEPALI 
        result.put(new Locale("no"), "no"); // NORWEGIAN 
        result.put(new Locale("or"), "or"); // ORIYA 
        result.put(new Locale("ps"), "ps"); // PASHTO 
        result.put(new Locale("fa"), "fa"); // PERSIAN 
        result.put(new Locale("pl"), "pl"); // POLISH 
        result.put(new Locale("pt"), "pt"); // PORTUGUESE 
        result.put(new Locale("pa"), "pa"); // PUNJABI 
        result.put(new Locale("ro"), "ro"); // ROMANIAN                                                 
        result.put(new Locale("ru"), "ru"); // RUSSIAN 
        result.put(new Locale("sa"), "sa"); // SANSKRIT 
        result.put(new Locale("sr"), "srf"); // SERBIAN 
        result.put(new Locale("sd"), "sd"); // SINDHI 
        result.put(new Locale("si"), "si"); // SINHALESE 
        result.put(new Locale("sk"), "sk"); // SLOVAK 
        result.put(new Locale("sl"), "sl"); // SLOVENIAN 
        result.put(new Locale("es"), "es"); // SPANISH 
        result.put(new Locale("sw"), "sw"); // SWAHILI 
        result.put(new Locale("sv"), "sv"); // SWEDISH 
        result.put(new Locale("tg"), "tg"); // TAJIK 
        result.put(new Locale("ta"), "ta"); // TAMIL 
        result.put(new Locale("tl"), "tl"); // TAGALOG 
        result.put(new Locale("te"), "te"); // TELUGU 
        result.put(new Locale("th"), "th"); // THAI 
        result.put(new Locale("bo"), "bo"); // TIBETAN 
        result.put(new Locale("tr"), "tr"); // TURKISH 
        result.put(new Locale("uk"), "uk"); // UKRANIAN 
        result.put(new Locale("ur"), "ur"); // URDU 
        result.put(new Locale("uz"), "uz"); // UZBEK 
        result.put(new Locale("ug"), "ug"); // UIGHUR 
        result.put(new Locale("vi"), "vi"); // VIETNAMESE 
        result.put(new Locale("cy"), "cy"); // WELSH 
        result.put(new Locale("yi"), "yi"); // YIDDISH 
        return result;
    }

    private final String referrer;

    private final String urlPattern;

    private static final String UTF8 = "UTF-8";

    public GoogleInterpreter(String referrer) throws IOException {
        this.referrer = referrer;
        final Properties properties = new Properties();
        final InputStream inputStream = getClass().getResourceAsStream(getClass().getSimpleName() + ".properties");
        try {
            properties.load(inputStream);
        } finally {
            inputStream.close();
        }
        urlPattern = properties.getProperty("url");
    }

    public String translate(String text, Locale source, Locale destination) throws IOException {
        List parameters = new ArrayList();
        StringBuffer textBuffer = new StringBuffer(text.length());
        int i0 = 0;
        int i1 = text.indexOf('{', i0);
        int i2;
        while (i1 != -1 && (i2 = text.indexOf('}', i1)) != -1) {
            textBuffer.append(text.substring(i0, i1));
            textBuffer.append("____");
            textBuffer.append(parameters.size());
            textBuffer.append("____");
            parameters.add(text.substring(i1, i2 + 1));
            i0 = i2 + 1;
            i1 = text.indexOf('{', i0);
        }
        textBuffer.append(text.substring(i0));

        System.out.println(textBuffer);

        URL url = new URL(MessageFormat.format(urlPattern,
                new Object[] { URLEncoder.encode(fromLocale(source), UTF8),
                        URLEncoder.encode(fromLocale(destination), UTF8),
                        URLEncoder.encode(textBuffer.toString(), UTF8) }));
        JSONObject response = retrieveJSON(url);
        try {
            if (response == null || response.getInt("responseStatus") != 200) {
                throw new IOException("Invalid response");
            }

            String result = StringEscapeUtils.unescapeHtml(
                    URLDecoder.decode(response.getJSONObject("responseData").getString("translatedText"), UTF8));
            for (int i = 0; i < parameters.size(); i++) {
                result = StringUtils.replace(result, "____" + i + "____", (String) parameters.get(i));
            }
            return result;
        } catch (JSONException e) {
            IOException ioe = new IOException(e.getMessage());
            ioe.initCause(e);
            throw ioe;
        }
    }

    private String fromLocale(Locale source) {
        String googleLanguage = (String) googleLanguages.get(source);
        if (googleLanguage == null) {
            googleLanguage = (String) googleLanguages.get(new Locale(source.getLanguage(), source.getCountry()));
        }
        if (googleLanguage == null) {
            googleLanguage = (String) googleLanguages.get(new Locale(source.getLanguage()));
        }
        return googleLanguage;
    }

    JSONObject retrieveJSON(final URL url) throws IOException {
        final HttpURLConnection uc = (HttpURLConnection) url.openConnection();
        uc.setRequestProperty("referer", referrer);
        uc.setDoOutput(false);
        try {
            return new JSONObject(IOUtil.toString(uc.getInputStream()));
        } catch (JSONException e) {
            IOException ioe = new IOException(e.getMessage());
            ioe.initCause(e);
            throw ioe;
        } finally {
            uc.getInputStream().close();
            if (uc.getErrorStream() != null) {
                uc.getErrorStream().close();
            }
        }
    }

}