[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")
|
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_id=482600
|
||||||
curseforge_optional_dependencies=fabric-api
|
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.libretranslate.LibreTranslateService;
|
||||||
import io.gitlab.jfronny.libjf.translate.impl.noop.NoopTranslateService;
|
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> {
|
public interface TranslateService<T extends Language> {
|
||||||
static TranslateService<?> getConfigured() {
|
static TranslateService<?> getConfigured() {
|
||||||
return switch (TranslateConfig.translationService) {
|
return switch (TranslateConfig.translationService) {
|
||||||
case Noop -> NoopTranslateService.INSTANCE;
|
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 -> {
|
case LibreTranslate -> {
|
||||||
try {
|
try {
|
||||||
yield LibreTranslateService.get(TranslateConfig.libreTranslateHost);
|
yield LibreTranslateService.get(TranslateConfig.libreTranslateHost);
|
||||||
@ -25,14 +34,16 @@ public interface TranslateService<T extends Language> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static List<TranslateService<?>> getAvailable() {
|
static List<TranslateService<?>> getAvailable() {
|
||||||
LibreTranslateService lts = null;
|
List<TranslateService<?>> result = new LinkedList<>();
|
||||||
try {
|
try {
|
||||||
lts = LibreTranslateService.get(TranslateConfig.libreTranslateHost);
|
result.add(GoogleTranslateService.get());
|
||||||
|
} catch (URISyntaxException | IOException ignored) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
result.add(LibreTranslateService.get(TranslateConfig.libreTranslateHost));
|
||||||
} catch (TranslateException ignored) {
|
} catch (TranslateException ignored) {
|
||||||
}
|
}
|
||||||
return lts == null
|
return List.copyOf(result);
|
||||||
? List.of(GoogleTranslateService.INSTANCE, NoopTranslateService.INSTANCE)
|
|
||||||
: List.of(GoogleTranslateService.INSTANCE, lts, NoopTranslateService.INSTANCE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String translate(String textToTranslate, T translateFrom, T translateTo) throws TranslateException;
|
String translate(String textToTranslate, T translateFrom, T translateTo) throws TranslateException;
|
||||||
|
@ -1,36 +1,7 @@
|
|||||||
package io.gitlab.jfronny.libjf.translate.impl.google;
|
package io.gitlab.jfronny.libjf.translate.impl.google;
|
||||||
|
|
||||||
import java.util.HashMap;
|
public record GoogleTranslateLanguage(String name, String id) implements io.gitlab.jfronny.libjf.translate.api.Language {
|
||||||
import java.util.Map;
|
public static final GoogleTranslateLanguage AUTO_DETECT = new GoogleTranslateLanguage("Auto-Detect", "auto");
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
|
@ -1,27 +1,40 @@
|
|||||||
package io.gitlab.jfronny.libjf.translate.impl.google;
|
package io.gitlab.jfronny.libjf.translate.impl.google;
|
||||||
|
|
||||||
import io.gitlab.jfronny.libjf.HttpUtils;
|
import io.gitlab.jfronny.libjf.*;
|
||||||
import io.gitlab.jfronny.libjf.translate.api.TranslateException;
|
import io.gitlab.jfronny.libjf.translate.api.*;
|
||||||
import io.gitlab.jfronny.libjf.translate.api.TranslateService;
|
import org.apache.commons.lang3.*;
|
||||||
import org.apache.commons.lang3.StringEscapeUtils;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.net.URLEncoder;
|
import java.net.*;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.*;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.*;
|
||||||
import java.nio.file.Path;
|
import java.util.*;
|
||||||
import java.util.ArrayList;
|
import java.util.regex.*;
|
||||||
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 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 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
|
@Override
|
||||||
@ -31,7 +44,7 @@ public class GoogleTranslateService implements TranslateService<GoogleTranslateL
|
|||||||
if (translateTo == null) throw new TranslateException("translateTo must not be null");
|
if (translateTo == null) throw new TranslateException("translateTo must not be null");
|
||||||
String pageSource = "";
|
String pageSource = "";
|
||||||
try {
|
try {
|
||||||
pageSource = getPageSource(textToTranslate, translateFrom.id, translateTo.id);
|
pageSource = getPageSource(textToTranslate, translateFrom.getIdentifier(), translateTo.getIdentifier());
|
||||||
Matcher matcher = TRANSLATION_RESULT.matcher(pageSource);
|
Matcher matcher = TRANSLATION_RESULT.matcher(pageSource);
|
||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
String match = matcher.group(1);
|
String match = matcher.group(1);
|
||||||
@ -58,12 +71,12 @@ public class GoogleTranslateService implements TranslateService<GoogleTranslateL
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GoogleTranslateLanguage parseLang(String lang) {
|
public GoogleTranslateLanguage parseLang(String lang) {
|
||||||
return GoogleTranslateLanguage.byId(lang);
|
return knownLanguages.getOrDefault(lang, GoogleTranslateLanguage.AUTO_DETECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<GoogleTranslateLanguage> getAvailableLanguages() {
|
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);
|
langs.remove(GoogleTranslateLanguage.AUTO_DETECT);
|
||||||
return langs;
|
return langs;
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
package io.gitlab.jfronny.libjf.translate.test;
|
package io.gitlab.jfronny.libjf.translate.test;
|
||||||
|
|
||||||
import io.gitlab.jfronny.libjf.LibJf;
|
import io.gitlab.jfronny.libjf.*;
|
||||||
import io.gitlab.jfronny.libjf.translate.impl.google.GoogleTranslateService;
|
import io.gitlab.jfronny.libjf.translate.impl.google.*;
|
||||||
import io.gitlab.jfronny.libjf.translate.impl.libretranslate.LibreTranslateService;
|
import io.gitlab.jfronny.libjf.translate.impl.libretranslate.*;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.*;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.*;
|
||||||
|
|
||||||
public class TestEntrypoint implements ModInitializer {
|
public class TestEntrypoint implements ModInitializer {
|
||||||
@Override
|
@Override
|
||||||
public void onInitialize() {
|
public void onInitialize() {
|
||||||
try {
|
try {
|
||||||
{
|
{
|
||||||
GoogleTranslateService ts = GoogleTranslateService.INSTANCE;
|
GoogleTranslateService ts = GoogleTranslateService.get();
|
||||||
LibJf.LOGGER.info("Testing Google Translate");
|
LibJf.LOGGER.info("Testing Google Translate");
|
||||||
final String sourceLA = "Cogito, ergo sum";
|
final String sourceLA = "Cogito, ergo sum";
|
||||||
assertEqual("auto", ts.detect(sourceLA).getIdentifier());
|
assertEqual("auto", ts.detect(sourceLA).getIdentifier());
|
||||||
|
Loading…
Reference in New Issue
Block a user