[translate-v1] Fetch supported languages for Google Translate on startup
This commit is contained in:
parent
f916c68c00
commit
9b0f43e1a1
10
build.gradle
10
build.gradle
@ -26,13 +26,3 @@ allprojects {
|
||||
implementation("io.gitlab.jfronny:commons-slf4j:$rootProject.commons_version")
|
||||
}
|
||||
}
|
||||
|
||||
subprojects {
|
||||
dependencies {
|
||||
testmodImplementation sourceSets.main.output
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
testmod
|
||||
}
|
||||
|
@ -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
|
@ -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;
|
||||
|
@ -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() {
|
||||
|
@ -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&tl=([a-zA-Z\\-]+)&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;
|
||||
}
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user