From 9b0f43e1a1def64486ca1f8428731c677a889996 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sat, 4 Jun 2022 16:18:18 +0200 Subject: [PATCH] [translate-v1] Fetch supported languages for Google Translate on startup --- build.gradle | 10 ---- gradle.properties | 2 +- .../libjf/translate/api/TranslateService.java | 25 ++++++--- .../impl/google/GoogleTranslateLanguage.java | 33 +----------- .../impl/google/GoogleTranslateService.java | 53 ++++++++++++------- .../libjf/translate/test/TestEntrypoint.java | 12 ++--- 6 files changed, 60 insertions(+), 75 deletions(-) diff --git a/build.gradle b/build.gradle index 91fdda2..f3a282d 100644 --- a/build.gradle +++ b/build.gradle @@ -26,13 +26,3 @@ allprojects { implementation("io.gitlab.jfronny:commons-slf4j:$rootProject.commons_version") } } - -subprojects { - dependencies { - testmodImplementation sourceSets.main.output - } -} - -sourceSets { - testmod -} diff --git a/gradle.properties b/gradle.properties index 0274763..c1063f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,4 +13,4 @@ modrinth_optional_dependencies=P7dR8mSH curseforge_id=482600 curseforge_optional_dependencies=fabric-api -commons_version=2022.6.3+18-31-48 \ No newline at end of file +commons_version=2022.6.4+10-10-24 \ No newline at end of file diff --git a/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/api/TranslateService.java b/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/api/TranslateService.java index 2285002..6f86cb7 100644 --- a/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/api/TranslateService.java +++ b/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/api/TranslateService.java @@ -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 { 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 { } static List> getAvailable() { - LibreTranslateService lts = null; + List> 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; diff --git a/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateLanguage.java b/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateLanguage.java index 687cc64..5eb43de 100644 --- a/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateLanguage.java +++ b/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateLanguage.java @@ -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 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() { diff --git a/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateService.java b/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateService.java index 753d510..1061eaf 100644 --- a/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateService.java +++ b/libjf-translate-v1/src/main/java/io/gitlab/jfronny/libjf/translate/impl/google/GoogleTranslateService.java @@ -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 { - public static final GoogleTranslateService INSTANCE = new GoogleTranslateService(); + private static GoogleTranslateService INSTANCE; private static final Pattern TRANSLATION_RESULT = Pattern.compile("class=\"result-container\">([^<]*)", Pattern.MULTILINE); + private static final Pattern LANGUAGE_KEY = Pattern.compile("", Pattern.MULTILINE); + private final Map knownLanguages; - private GoogleTranslateService() { + public static GoogleTranslateService get() throws URISyntaxException, IOException { + if (INSTANCE == null) { + INSTANCE = new GoogleTranslateService(); + } + return INSTANCE; + } + + private GoogleTranslateService() throws URISyntaxException, IOException { + Map 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 getAvailableLanguages() { - List langs = new ArrayList<>(Arrays.asList(GoogleTranslateLanguage.values())); + List langs = new ArrayList<>(knownLanguages.values()); langs.remove(GoogleTranslateLanguage.AUTO_DETECT); return langs; } diff --git a/libjf-translate-v1/src/testmod/java/io/gitlab/jfronny/libjf/translate/test/TestEntrypoint.java b/libjf-translate-v1/src/testmod/java/io/gitlab/jfronny/libjf/translate/test/TestEntrypoint.java index 43e1ebd..9f625e5 100644 --- a/libjf-translate-v1/src/testmod/java/io/gitlab/jfronny/libjf/translate/test/TestEntrypoint.java +++ b/libjf-translate-v1/src/testmod/java/io/gitlab/jfronny/libjf/translate/test/TestEntrypoint.java @@ -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());