From: Alexander Goussas Date: Tue, 2 Jun 2026 17:12:00 +0000 (-0500) Subject: feat: add leo source for german translations X-Git-Url: http://git.frustrated-labs.net/?a=commitdiff_plain;h=0f41c478ad38a01414d844bf451eb75b80dbd55e;p=larousseapi feat: add leo source for german translations --- diff --git a/src/main/java/net/frustratedfunctor/translations/GermanWordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/GermanWordTranslationRepository.java new file mode 100644 index 0000000..0d7d37b --- /dev/null +++ b/src/main/java/net/frustratedfunctor/translations/GermanWordTranslationRepository.java @@ -0,0 +1,38 @@ +package net.frustratedfunctor.translations; + +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@ApplicationScoped +public class GermanWordTranslationRepository implements WordTranslationRepository { + @Override + public List translationsForWord(String word) { + try { + final var url = URI.create("https://dict.leo.org/german-english/" + word).toURL(); + final var doc = Jsoup.parse(url, 10_000); + return doc + .select("div[aria-label=\"Suchergebnisse in der Kategorie Nouns\"]") + .select("td[lang=\"en\"]") + .stream() + .map( + el -> Optional.ofNullable(el.selectFirst("samp")).map(Element::ownText).orElse("") + + " " + + el.selectStream("a") + .map(Element::ownText) + .collect(Collectors.joining(" ")) + ) + .toList(); + } catch (Exception e) { + Log.error("Error while fetching german translations", e); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java b/src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java index 7727fde..ada29c3 100644 --- a/src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java +++ b/src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java @@ -8,9 +8,11 @@ import java.util.List; @ApplicationScoped public class LanguageAwareTranslationsRepository implements WordTranslationRepository { private final FrenchWordTranslationRepository french; + private final GermanWordTranslationRepository german; - public LanguageAwareTranslationsRepository(FrenchWordTranslationRepository french) { + public LanguageAwareTranslationsRepository(FrenchWordTranslationRepository french, GermanWordTranslationRepository german) { this.french = french; + this.german = german; } @Override @@ -21,7 +23,7 @@ public class LanguageAwareTranslationsRepository implements WordTranslationRepos public List translationsForWord(String word, Lang lang) { return switch (lang) { case French -> french.translationsForWord(word); - case German -> List.of("NOT IMPLEMENTED"); + case German -> german.translationsForWord(word); }; } } diff --git a/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java index 88b2eb5..c77b25b 100644 --- a/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java +++ b/src/main/java/net/frustratedfunctor/translations/WordTranslationService.java @@ -18,7 +18,12 @@ public class WordTranslationService { throw new InvalidWordException("The word cannot be empty:" + word); } - final var wordDefs = repository.translationsForWord(word, Lang.parseOrDefault(lang)); + final var wordDefs = repository + .translationsForWord(word, Lang.parseOrDefault(lang)) + .stream() + .distinct() + .limit(5) + .toList(); return new WordTranslation( word,