/* * This file is part of the Illarion project. * * Copyright © 2015 - Illarion e.V. * * Illarion is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Illarion 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. */ package illarion.client.util.translation.mymemory; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; import com.google.gson.stream.JsonReader; import illarion.client.util.translation.TranslationDirection; import illarion.client.util.translation.TranslationProvider; import org.jetbrains.annotations.Contract; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.Charset; /** * @author Martin Karing <nitram@illarion.org> */ public class MyMemoryProvider implements TranslationProvider { @Nonnull private static final Logger log = LoggerFactory.getLogger(MyMemoryProvider.class); @Nullable private final URL serviceUrl; private boolean operational; public MyMemoryProvider() { URL url = null; try { url = new URL("http://api.mymemory.translated.net/get"); } catch (MalformedURLException e) { log.error("Failed to resolve the URL to the translator service. Service is not active.", e); } serviceUrl = url; operational = true; } @Nullable @Override public String getTranslation(@Nonnull String original, @Nonnull TranslationDirection direction) { StringBuilder queryBuilder = new StringBuilder(); queryBuilder.append(serviceUrl).append('?'); try { queryBuilder.append("q=").append(URLEncoder.encode(original, "UTF-8")); queryBuilder.append('&').append("langpair=").append(getLangPair(direction)); queryBuilder.append('&').append("of=json"); queryBuilder.append('&').append("de=").append(URLEncoder.encode("webmaster@illarion.org", "UTF-8")); URL queryUrl = new URL(queryBuilder.toString()); try (JsonReader rd = new JsonReader(new InputStreamReader(queryUrl.openStream(), Charset.forName("UTF-8")))) { Gson gson = new GsonBuilder() .setDateFormat("yyyy-MM-dd HH:mm:ss") .create(); Response response = gson.fromJson(rd, Response.class); if ((response != null) && (response.getResponseData() != null) && (response.getResponseData().getMatch() > 0.75)) { return response.getResponseData().getTranslatedText(); } } catch (IOException e) { log.error("Error while reading from the service.", e); } catch (JsonParseException e) { log.error("Unexpected error while decoding json", e); } } catch (UnsupportedEncodingException e) { log.error("Error while encoding the text for transfer to the MyMemory provider.", e); } catch (MalformedURLException e) { log.error("Generated URL for the query to MyMemory appears to have a invalid format.", e); } // The provider is not working anymore. That either happens because the provider is unreachable or because // the provider is not accepting any more requests. Either way to reduce overhead the provider may shut down for // this session to reduce the overhead. operational = false; return null; } @Nonnull @Contract(pure = true) private static String getLangPair(@Nonnull TranslationDirection direction) { switch (direction) { case GermanToEnglish: return "de|en"; case EnglishToGerman: return "en|de"; } throw new UnsupportedOperationException("Unexpected translation direction received."); } @Override public boolean isProviderWorking() { return (serviceUrl != null) && operational; } }