--- /dev/null
+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<>();
+ }
+ }
+}
@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
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);
};
}
}
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,