]> git.frustrated-labs.net Git - larousseapi/commitdiff
feat: add leo source for german translations
authorAlexander Goussas <[email protected]>
Tue, 2 Jun 2026 17:12:00 +0000 (12:12 -0500)
committerAlexander Goussas <[email protected]>
Tue, 2 Jun 2026 17:12:00 +0000 (12:12 -0500)
src/main/java/net/frustratedfunctor/translations/GermanWordTranslationRepository.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java
src/main/java/net/frustratedfunctor/translations/WordTranslationService.java

diff --git a/src/main/java/net/frustratedfunctor/translations/GermanWordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/GermanWordTranslationRepository.java
new file mode 100644 (file)
index 0000000..0d7d37b
--- /dev/null
@@ -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<String> 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<>();
+        }
+    }
+}
index 7727fde9705a839953758b753957dd13d59a6424..ada29c311aed63a75507697db9f13d4140aec7b7 100644 (file)
@@ -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<String> translationsForWord(String word, Lang lang) {
         return switch (lang) {
             case French -> french.translationsForWord(word);
-            case German -> List.of("NOT IMPLEMENTED");
+            case German -> german.translationsForWord(word);
         };
     }
 }
index 88b2eb57f238f61943662e44e50e6069ab74c375..c77b25bf4b4695df20875d389d99be16d1dd99bf 100644 (file)
@@ -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,