LibJF/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateService.java

83 lines
3.5 KiB
Java

package io.gitlab.jfronny.libjf.translate.impl.google;
import io.gitlab.jfronny.libjf.HttpUtils;
import io.gitlab.jfronny.libjf.translate.api.TranslateException;
import io.gitlab.jfronny.libjf.translate.api.TranslateService;
import org.apache.commons.lang3.StringEscapeUtils;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GoogleTranslateService implements TranslateService<GoogleTranslateLanguage> {
public static final GoogleTranslateService INSTANCE = new GoogleTranslateService();
private static final Pattern TRANSLATION_RESULT = Pattern.compile("class=\"result-container\">([^<]*)</div>", Pattern.MULTILINE);
private GoogleTranslateService() {
}
@Override
public String translate(String textToTranslate, GoogleTranslateLanguage translateFrom, GoogleTranslateLanguage translateTo) throws TranslateException {
if (textToTranslate == null) throw new TranslateException("textToTranslate must not be null");
if (translateFrom == null) translateFrom = GoogleTranslateLanguage.AUTO_DETECT;
if (translateTo == null) throw new TranslateException("translateTo must not be null");
String pageSource = "";
try {
pageSource = getPageSource(textToTranslate, translateFrom.id, translateTo.id);
Matcher matcher = TRANSLATION_RESULT.matcher(pageSource);
if (matcher.find()) {
String match = matcher.group(1);
if (match != null && !match.isEmpty()) {
return StringEscapeUtils.unescapeHtml4(match); //TODO use commons-text once that is shipped with Minecraft
}
}
throw new TranslateException("Could not translate \"" + textToTranslate + "\": result page couldn't be parsed");
} catch (Exception e) {
try {
Path p = Files.createTempFile("translater-pagedump-", ".html").toAbsolutePath();
Files.writeString(p, pageSource);
throw new TranslateException("Could not translate string, see dumped page at " + p, e);
} catch (IOException ioe) {
throw new TranslateException("Could not translate string and the page could not be dumped", ioe);
}
}
}
@Override
public GoogleTranslateLanguage detect(String text) throws TranslateException {
return GoogleTranslateLanguage.AUTO_DETECT;
}
@Override
public GoogleTranslateLanguage parseLang(String lang) {
return GoogleTranslateLanguage.byId(lang);
}
@Override
public List<GoogleTranslateLanguage> getAvailableLanguages() {
List<GoogleTranslateLanguage> langs = new ArrayList<>(Arrays.asList(GoogleTranslateLanguage.values()));
langs.remove(GoogleTranslateLanguage.AUTO_DETECT);
return langs;
}
@Override
public String getName() {
return "Google";
}
private static String getPageSource(String textToTranslate, String translateFrom, String translateTo) throws Exception {
if (textToTranslate == null)
return null;
String pageUrl = String.format("https://translate.google.com/m?hl=en&sl=%s&tl=%s&ie=UTF-8&prev=_m&q=%s",
translateFrom, translateTo, URLEncoder.encode(textToTranslate.trim(), StandardCharsets.UTF_8));
return HttpUtils.get(pageUrl).sendString();
}
}