83 lines
3.5 KiB
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();
|
|
}
|
|
}
|