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