[translate-v1] Fetch supported languages for Google Translate on startup

This commit is contained in:
Johannes Frohnmeyer 2022-06-04 16:18:18 +02:00
parent f916c68c00
commit 9b0f43e1a1
Signed by: Johannes
GPG Key ID: E76429612C2929F4
6 changed files with 60 additions and 75 deletions

View File

@ -26,13 +26,3 @@ allprojects {
implementation("io.gitlab.jfronny:commons-slf4j:$rootProject.commons_version")
}
}
subprojects {
dependencies {
testmodImplementation sourceSets.main.output
}
}
sourceSets {
testmod
}

View File

@ -13,4 +13,4 @@ modrinth_optional_dependencies=P7dR8mSH
curseforge_id=482600
curseforge_optional_dependencies=fabric-api
commons_version=2022.6.3+18-31-48
commons_version=2022.6.4+10-10-24

View File

@ -6,13 +6,22 @@ import io.gitlab.jfronny.libjf.translate.impl.google.GoogleTranslateService;
import io.gitlab.jfronny.libjf.translate.impl.libretranslate.LibreTranslateService;
import io.gitlab.jfronny.libjf.translate.impl.noop.NoopTranslateService;
import java.util.List;
import java.io.*;
import java.net.*;
import java.util.*;
public interface TranslateService<T extends Language> {
static TranslateService<?> getConfigured() {
return switch (TranslateConfig.translationService) {
case Noop -> NoopTranslateService.INSTANCE;
case Google -> GoogleTranslateService.INSTANCE;
case Google -> {
try {
yield GoogleTranslateService.get();
} catch (URISyntaxException | IOException e) {
LibJf.LOGGER.error("Could not create google translate service");
yield NoopTranslateService.INSTANCE;
}
}
case LibreTranslate -> {
try {
yield LibreTranslateService.get(TranslateConfig.libreTranslateHost);
@ -25,14 +34,16 @@ public interface TranslateService<T extends Language> {
}
static List<TranslateService<?>> getAvailable() {
LibreTranslateService lts = null;
List<TranslateService<?>> result = new LinkedList<>();
try {
lts = LibreTranslateService.get(TranslateConfig.libreTranslateHost);
result.add(GoogleTranslateService.get());
} catch (URISyntaxException | IOException ignored) {
}
try {
result.add(LibreTranslateService.get(TranslateConfig.libreTranslateHost));
} catch (TranslateException ignored) {
}
return lts == null
? List.of(GoogleTranslateService.INSTANCE, NoopTranslateService.INSTANCE)
: List.of(GoogleTranslateService.INSTANCE, lts, NoopTranslateService.INSTANCE);
return List.copyOf(result);
}
String translate(String textToTranslate, T translateFrom, T translateTo) throws TranslateException;

View File

@ -1,36 +1,7 @@
package io.gitlab.jfronny.libjf.translate.impl.google;
import java.util.HashMap;
import java.util.Map;
public enum GoogleTranslateLanguage implements io.gitlab.jfronny.libjf.translate.api.Language {
AUTO_DETECT("AUTO_DETECT", "auto"), ARABIC("ARABIC", "ar"), CHINESE_SIMPLIFIED("CHINESE_SIMPLIFIED", "zh-CN"),
CHINESE_TRADITIONAL("CHINESE_TRADITIONAL", "zh-TW"), ENGLISH("ENGLISH", "en"), FILIPINO("FILIPINO", "tl"),
FRENCH("FRENCH", "fr"), GERMAN("GERMAN", "de"), GREEK("GREEK", "el"), INDONESIAN("INDONESIAN", "id"),
IRISH("IRISH", "ga"), ITALIAN("ITALIAN", "it"), JAPANESE("JAPANESE", "ja"), JAVANESE("JAVANESE", "jw"),
KOREAN("KOREAN", "ko"), LATIN("LATIN", "la"), POLISH("POLISH", "pl"), PORTUGUESE("PORTUGUESE", "pt"),
RUSSIAN("RUSSIAN", "ru"), SPANISH("SPANISH", "es"), SWEDISH("SWEDISH", "sv"), THAI("THAI", "th"),
VIETNAMESE("VIETNAMESE", "vi");
private static final Map<String, GoogleTranslateLanguage> LANGUAGE_BY_ID = new HashMap<>();
static {
for (GoogleTranslateLanguage language : GoogleTranslateLanguage.values()) {
LANGUAGE_BY_ID.put(language.id, language);
}
}
public static GoogleTranslateLanguage byId(String value) {
return LANGUAGE_BY_ID.getOrDefault(value, AUTO_DETECT);
}
public final String name;
public final String id;
GoogleTranslateLanguage(String name, String id) {
this.name = name;
this.id = id;
}
public record GoogleTranslateLanguage(String name, String id) implements io.gitlab.jfronny.libjf.translate.api.Language {
public static final GoogleTranslateLanguage AUTO_DETECT = new GoogleTranslateLanguage("Auto-Detect", "auto");
@Override
public String toString() {

View File

@ -1,27 +1,40 @@
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 org.apache.commons.lang3.StringUtils;
import io.gitlab.jfronny.libjf.*;
import io.gitlab.jfronny.libjf.translate.api.*;
import org.apache.commons.lang3.*;
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;
import java.io.*;
import java.net.*;
import java.nio.charset.*;
import java.nio.file.*;
import java.util.*;
import java.util.regex.*;
public class GoogleTranslateService implements TranslateService<GoogleTranslateLanguage> {
public static final GoogleTranslateService INSTANCE = new GoogleTranslateService();
private static GoogleTranslateService INSTANCE;
private static final Pattern TRANSLATION_RESULT = Pattern.compile("class=\"result-container\">([^<]*)</div>", Pattern.MULTILINE);
private static final Pattern LANGUAGE_KEY = Pattern.compile("<div class=\"language-item\"><a href=\"\\./m\\?sl&amp;tl=([a-zA-Z\\-]+)&amp;hl=[a-zA-Z\\-]+\">([^<]+)</a></div>", Pattern.MULTILINE);
private final Map<String, GoogleTranslateLanguage> knownLanguages;
private GoogleTranslateService() {
public static GoogleTranslateService get() throws URISyntaxException, IOException {
if (INSTANCE == null) {
INSTANCE = new GoogleTranslateService();
}
return INSTANCE;
}
private GoogleTranslateService() throws URISyntaxException, IOException {
Map<String, GoogleTranslateLanguage> knownLanguages = new HashMap<>();
Matcher matcher = LANGUAGE_KEY.matcher(HttpUtils.get("https://translate.google.com/m?mui=tl").sendString());
while (matcher.find()) {
String id = matcher.group(1);
String name = matcher.group(2);
knownLanguages.put(id, new GoogleTranslateLanguage(name, id));
}
if (knownLanguages.isEmpty())
throw new IOException("Could not detect languages, Google likely changed the site. Please inform the maintainer of LibJF");
this.knownLanguages = Map.copyOf(knownLanguages);
}
@Override
@ -31,7 +44,7 @@ public class GoogleTranslateService implements TranslateService<GoogleTranslateL
if (translateTo == null) throw new TranslateException("translateTo must not be null");
String pageSource = "";
try {
pageSource = getPageSource(textToTranslate, translateFrom.id, translateTo.id);
pageSource = getPageSource(textToTranslate, translateFrom.getIdentifier(), translateTo.getIdentifier());
Matcher matcher = TRANSLATION_RESULT.matcher(pageSource);
if (matcher.find()) {
String match = matcher.group(1);
@ -58,12 +71,12 @@ public class GoogleTranslateService implements TranslateService<GoogleTranslateL
@Override
public GoogleTranslateLanguage parseLang(String lang) {
return GoogleTranslateLanguage.byId(lang);
return knownLanguages.getOrDefault(lang, GoogleTranslateLanguage.AUTO_DETECT);
}
@Override
public List<GoogleTranslateLanguage> getAvailableLanguages() {
List<GoogleTranslateLanguage> langs = new ArrayList<>(Arrays.asList(GoogleTranslateLanguage.values()));
List<GoogleTranslateLanguage> langs = new ArrayList<>(knownLanguages.values());
langs.remove(GoogleTranslateLanguage.AUTO_DETECT);
return langs;
}

View File

@ -1,18 +1,18 @@
package io.gitlab.jfronny.libjf.translate.test;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.translate.impl.google.GoogleTranslateService;
import io.gitlab.jfronny.libjf.translate.impl.libretranslate.LibreTranslateService;
import net.fabricmc.api.ModInitializer;
import io.gitlab.jfronny.libjf.*;
import io.gitlab.jfronny.libjf.translate.impl.google.*;
import io.gitlab.jfronny.libjf.translate.impl.libretranslate.*;
import net.fabricmc.api.*;
import java.util.Objects;
import java.util.*;
public class TestEntrypoint implements ModInitializer {
@Override
public void onInitialize() {
try {
{
GoogleTranslateService ts = GoogleTranslateService.INSTANCE;
GoogleTranslateService ts = GoogleTranslateService.get();
LibJf.LOGGER.info("Testing Google Translate");
final String sourceLA = "Cogito, ergo sum";
assertEqual("auto", ts.detect(sourceLA).getIdentifier());