]> git.frustrated-labs.net Git - larousseapi/commitdiff
feat: enable multi lingual word translations
authorAlexander Goussas <[email protected]>
Tue, 2 Jun 2026 16:41:34 +0000 (11:41 -0500)
committerAlexander Goussas <[email protected]>
Tue, 2 Jun 2026 16:41:34 +0000 (11:41 -0500)
src/main/java/net/frustratedfunctor/definitions/LanguageAwareDefinitionsRepository.java
src/main/java/net/frustratedfunctor/translations/FrenchWordTranslationRepository.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java [deleted file]
src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java [new file with mode: 0644]
src/main/java/net/frustratedfunctor/translations/WordTranslationResource.java
src/main/java/net/frustratedfunctor/translations/WordTranslationService.java
src/main/java/net/frustratedfunctor/ui/UiResource.java

index a2059e1eed774bbed20b1ae45a7287147696ab23..b7b8f2cdb376752bfef9f2467a5573dd62265158 100644 (file)
@@ -1,12 +1,10 @@
 package net.frustratedfunctor.definitions;
 
-import jakarta.annotation.Priority;
 import jakarta.enterprise.context.ApplicationScoped;
 import net.frustratedfunctor.core.Lang;
 
 import java.util.List;
 
-@Priority(1)
 @ApplicationScoped
 public class LanguageAwareDefinitionsRepository implements WordDefinitionRepository {
     private final FrenchWordDefinitionRepository french;
diff --git a/src/main/java/net/frustratedfunctor/translations/FrenchWordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/FrenchWordTranslationRepository.java
new file mode 100644 (file)
index 0000000..4d4ac05
--- /dev/null
@@ -0,0 +1,36 @@
+package net.frustratedfunctor.translations;
+
+import io.quarkus.logging.Log;
+import jakarta.enterprise.context.ApplicationScoped;
+import org.jsoup.Jsoup;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+@ApplicationScoped
+public class FrenchWordTranslationRepository implements WordTranslationRepository {
+
+    @Override
+    public List<String> translationsForWord(String word) {
+        try {
+            final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais-anglais/" + word).toURL();
+            final var doc = Jsoup.parse(larousseUrl, 10_000);
+
+            final var defs = doc.select("li.itemZONESEM");
+            final var wordDefs = new ArrayList<String>();
+
+            for (final var def : defs) {
+                final var translation = def.selectFirst("span.Traduction");
+                if (translation != null) {
+                    wordDefs.add(translation.text());
+                }
+            }
+
+            return wordDefs;
+        } catch (Exception e) {
+            Log.error("", e);
+            return new ArrayList<>();
+        }
+    }
+}
diff --git a/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java b/src/main/java/net/frustratedfunctor/translations/JsoupWordTranslationRepository.java
deleted file mode 100644 (file)
index 553b645..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package net.frustratedfunctor.translations;
-
-import io.quarkus.logging.Log;
-import jakarta.enterprise.context.ApplicationScoped;
-import org.jsoup.Jsoup;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-@ApplicationScoped
-public class JsoupWordTranslationRepository implements WordTranslationRepository {
-
-    @Override
-    public List<String> translationsForWord(String word) {
-        try {
-            final var larousseUrl = URI.create("https://www.larousse.fr/dictionnaires/francais-anglais/" + word).toURL();
-            final var doc = Jsoup.parse(larousseUrl, 10_000);
-
-            final var defs = doc.select("li.itemZONESEM");
-            final var wordDefs = new ArrayList<String>();
-
-            for (final var def : defs) {
-                final var translation = def.selectFirst("span.Traduction");
-                if (translation != null) {
-                    wordDefs.add(translation.text());
-                }
-            }
-
-            return wordDefs;
-        } catch (Exception e) {
-            Log.error("", e);
-            return new ArrayList<>();
-        }
-    }
-}
diff --git a/src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java b/src/main/java/net/frustratedfunctor/translations/LanguageAwareTranslationsRepository.java
new file mode 100644 (file)
index 0000000..7727fde
--- /dev/null
@@ -0,0 +1,27 @@
+package net.frustratedfunctor.translations;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import net.frustratedfunctor.core.Lang;
+
+import java.util.List;
+
+@ApplicationScoped
+public class LanguageAwareTranslationsRepository implements WordTranslationRepository {
+    private final FrenchWordTranslationRepository french;
+
+    public LanguageAwareTranslationsRepository(FrenchWordTranslationRepository french) {
+        this.french = french;
+    }
+
+    @Override
+    public List<String> translationsForWord(String word) {
+        return translationsForWord(word, Lang.DEFAULT);
+    }
+
+    public List<String> translationsForWord(String word, Lang lang) {
+        return switch (lang) {
+            case French -> french.translationsForWord(word);
+            case German -> List.of("NOT IMPLEMENTED");
+        };
+    }
+}
index b1b2cae51d125a408cabd74f96d697c7d80b6999..0c185fa19e876242bf8879fa05da3dc03f114440 100644 (file)
@@ -1,10 +1,7 @@
 package net.frustratedfunctor.translations;
 
 
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.*;
 import jakarta.ws.rs.core.MediaType;
 
 @Path("/words")
@@ -19,8 +16,11 @@ public class WordTranslationResource {
     @Path("/{word}/translation")
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    public WordTranslation translation(@PathParam("word") String word) {
-        return words.translate(word);
+    public WordTranslation translation(
+            @PathParam("word") String word,
+            @QueryParam("lang") String lang
+    ) {
+        return words.translate(word, lang);
     }
 
 }
index 6f547f99e9001a462a626c10f061c0328745184c..88b2eb57f238f61943662e44e50e6069ab74c375 100644 (file)
@@ -2,22 +2,23 @@ package net.frustratedfunctor.translations;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import net.frustratedfunctor.InvalidWordException;
+import net.frustratedfunctor.core.Lang;
 
 @ApplicationScoped
 public class WordTranslationService {
 
-    private final WordTranslationRepository repository;
+    private final LanguageAwareTranslationsRepository repository;
 
-    public WordTranslationService(WordTranslationRepository repository) {
+    public WordTranslationService(LanguageAwareTranslationsRepository repository) {
         this.repository = repository;
     }
 
-    public WordTranslation translate(String word) {
+    public WordTranslation translate(String word, String lang) {
         if (word == null || word.isEmpty()) {
             throw new InvalidWordException("The word cannot be empty:" + word);
         }
 
-        final var wordDefs = repository.translationsForWord(word);
+        final var wordDefs = repository.translationsForWord(word, Lang.parseOrDefault(lang));
 
         return new WordTranslation(
                 word,
index 06b07e7d3161348ba98c338c9063ebd9d0d864b7..589b11dbb36b2cb493855b58269b84940d964712 100644 (file)
@@ -40,7 +40,7 @@ public class UiResource {
             @FormParam("lang") String lang
     ) throws Exception {
         final var encodedWord = URLEncoder.encode(word, StandardCharsets.UTF_8);
-        final var f1 = exec.submit(() -> translations.translate(encodedWord).translations());
+        final var f1 = exec.submit(() -> translations.translate(encodedWord, lang).translations());
         final var f2 = exec.submit(() -> definitions.define(encodedWord, lang).definitions());
         // TODO: Handle error
         final var data = new WordTranslationsDefinitions(f1.get(), f2.get());