From ac699b6de34f1009a0c016208a6042edfb10e463 Mon Sep 17 00:00:00 2001 From: kmitresse Date: Tue, 11 Jun 2024 12:37:32 +0200 Subject: [PATCH] feat: devWeb - Create a translation system and his translations files --- .../web/servlet/TranslationServlet.java | 26 ++++ .../project/web/translation/Translator.java | 60 ++++++++ .../main/webapp/WEB-INF/tags/layouts/base.tag | 3 + .../src/main/webapp/WEB-INF/translations.json | 142 ++++++++++++++++++ .../src/main/webapp/static/js/navbar.js | 16 ++ 5 files changed, 247 insertions(+) create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/TranslationServlet.java create mode 100644 S2/DevWeb/Projet/src/main/java/uppa/project/web/translation/Translator.java create mode 100644 S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/TranslationServlet.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/TranslationServlet.java new file mode 100644 index 0000000..27c6760 --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/servlet/TranslationServlet.java @@ -0,0 +1,26 @@ +package uppa.project.web.servlet; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import java.io.IOException; +import uppa.project.web.translation.Translator; + +@WebServlet(name = "translationServlet", value = "/translate") +public class TranslationServlet extends HttpServlet { + + public void init() { + } + + public void doPut(HttpServletRequest request, HttpServletResponse response) throws IOException { + System.out.println("\n ok \n"); + if (request.getParameter("language") != null) { + String language = request.getParameter("language"); + request.getSession().setAttribute("language", language); + Translator translator = Translator.generateTranslator(request.getSession(), request.getServletContext()); + request.getSession().setAttribute("translator", translator); + Translator sessionTranslator = (Translator) request.getSession().getAttribute("translator"); + } + } +} diff --git a/S2/DevWeb/Projet/src/main/java/uppa/project/web/translation/Translator.java b/S2/DevWeb/Projet/src/main/java/uppa/project/web/translation/Translator.java new file mode 100644 index 0000000..6d4d1cd --- /dev/null +++ b/S2/DevWeb/Projet/src/main/java/uppa/project/web/translation/Translator.java @@ -0,0 +1,60 @@ +package uppa.project.web.translation; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import jakarta.servlet.ServletContext; +import jakarta.servlet.http.HttpSession; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +public class Translator { + + private String language; + + private JsonParser parser = new JsonParser(); + + private JsonObject translations; + + public enum Language {EN, FR} + + public Translator(Language language) { + System.out.println("Creating translator for language: " + language.name()); + this.language = language.name(); + this.parser = new JsonParser(); + } + + public static Translator generateTranslator(HttpSession session , ServletContext context) throws IOException { + Translator translator; + System.out.println("null?" + session.getAttribute("language")); + System.out.println("language EN ??: " + session.getAttribute("language").equals(Translator.Language.EN.name())); + if (session.getAttribute("language") != null && session.getAttribute("language").equals(Translator.Language.EN.name())) { + translator = new Translator(Translator.Language.EN); + } else { + translator = new Translator(Translator.Language.FR); + } + translator.setJsonContent(context); + return translator; + } + + public void setJsonContent(ServletContext context) throws IOException { + JsonObject json = new JsonObject(); + InputStream is = context.getResourceAsStream("/WEB-INF/translations.json"); + BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + //Parse the File as a JSON Object + JsonElement fileElement = parser.parse(reader); + this.translations = fileElement.getAsJsonObject(); + } + + public String translate(String text) { + System.out.println("Translating: " + text); + System.out.println("langue: " + this.language); + return this.translations.get(text).getAsJsonObject().get(this.language).getAsString(); + } + + public String getLanguage() { + return language; + } +} diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/layouts/base.tag b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/layouts/base.tag index 7a9a422..6906518 100644 --- a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/layouts/base.tag +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/tags/layouts/base.tag @@ -1,10 +1,13 @@ <%@tag description="layout/base" pageEncoding="UTF-8" %> <%@tag import="uppa.project.Global" %> +<%@ tag import="uppa.project.web.translation.Translator" %> <%@attribute name="title"%> <%@attribute name="head" fragment="true" %> <%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %> +<% Translator translator =(Translator) session.getAttribute("translator"); %> + diff --git a/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json new file mode 100644 index 0000000..04ae7cf --- /dev/null +++ b/S2/DevWeb/Projet/src/main/webapp/WEB-INF/translations.json @@ -0,0 +1,142 @@ +{ + "index_main" : { + "EN" : "Dive into the excitement of CardRush!", + "FR" : "Plongez dans l'excitation de CardRush!" + }, + "index_description" : { + "EN": "Challenge your reactivity and dominate the game with friends in this fast-paced card race! Join now to experience the adrenaline.", + "FR": "Défiez votre réactivité et dominez le jeu avec des amis dans cette course effrénée aux cartes ! Rejoignez maintenant pour vivre l'adrénaline." + }, + "navbar_login" : { + "EN": "Login", + "FR": "Se connecter" + }, + "navbar_register" : { + "EN": "Register", + "FR": "S'inscrire" + }, + "navbar_logout" : { + "EN": "Logout", + "FR": "Se déconnecter" + }, + "navbar_profile" : { + "EN": "Profile", + "FR": "Profil" + }, + "user_username" : { + "EN": "Username", + "FR": "Nom d'utilisateur" + }, + "user_password" : { + "EN": "Password", + "FR": "Mot de passe" + }, + "user_email" : { + "EN": "Email", + "FR": "Email" + }, + "user_confirm_password" : { + "EN": "Confirm Password", + "FR": "Confirmer le mot de passe" + }, + "user_confirm_password_input" : { + "EN": "Repeat your password", + "FR": "Répéter votre mot de passe" + }, + "user_birthdate" : { + "EN": "Birthdate", + "FR": "Date de naissance" + }, + "user_gender" : { + "EN": "Gender", + "FR": "Genre" + }, + "user_gender_select_option" : { + "EN": "Choose an option", + "FR": "Choisir une option" + }, + "user_gender_male" : { + "EN": "Male", + "FR": "Homme" + }, + "user_gender_female" : { + "EN": "Female", + "FR": "Femme" + }, + "user_gender_other" : { + "EN": "Other", + "FR": "Autre" + }, + "login_title" : { + "EN": "Login", + "FR": "Se connecter" + }, + "login_forgotten_password" : { + "EN": "Forgotten password?", + "FR": "Mot de passe oublié?" + }, + "login_submit" : { + "EN": "Login", + "FR": "Se connecter" + }, + "login_not_registered" : { + "EN": "Not registered?", + "FR": "Pas encore de compte?" + }, + "login_register" : { + "EN": "Register now!", + "FR": "S'inscrire" + }, + "login_error" : { + "EN": "Invalid username or password", + "FR": "Nom d'utilisateur ou mot de passe invalide" + }, + "register_title" : { + "EN": "Register", + "FR": "S'inscrire" + }, + "register_submit" : { + "EN": "Register", + "FR": "S'inscrire" + }, + "register_already_registered" : { + "EN": "Already registered?", + "FR": "Déjà inscrit?" + }, + "register_login" : { + "EN": "Login now!", + "FR": "Se connecter" + }, + "register_error_username" : { + "EN": "Username already taken", + "FR": "Nom d'utilisateur déjà pris" + }, + "register_error_email" : { + "EN": "Email already taken", + "FR": "Email déjà utilisé" + }, + "register_error_password" : { + "EN": "Passwords do not match", + "FR": "Les mots de passe ne correspondent pas" + }, + "forgotten_title" : { + "EN": "Forgotten password", + "FR": "Mot de passe oublié" + }, + "forgotten_submit" : { + "EN": "Send email", + "FR": "Envoyer l'email" + }, + "forgotten_error" : { + "EN": "The email entered is not associated with any account", + "FR": "L'email renseigné n'est associé à aucun compte" + }, + "forgotten_success" : { + "EN": "Email sent successfully", + "FR": "Email envoyé avec succès" + }, + "forgotten_email_description" : { + "EN": "Enter the email address associated with your account to receive a password reset link.", + "FR": "Entrez l'adresse email associée à votre compte pour recevoir un lien de réinitialisation de mot de passe." + } +} diff --git a/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js b/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js index ed1c469..4add707 100644 --- a/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js +++ b/S2/DevWeb/Projet/src/main/webapp/static/js/navbar.js @@ -14,3 +14,19 @@ $navbarBurgers.forEach(el => { $target.classList.toggle('is-active'); }); }); + +let languageSelector = document.getElementById('language-select'); + +languageSelector.addEventListener('change', function() { + const contextPath = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1); + const action = contextPath + "/translate"; + console.log(action); + const method = "PUT"; + + const url = new URL(action); + url.searchParams.append("language", languageSelector.value); + + fetch(url, {headers: {"Content-Type": "application/json"}, method}) + .then(() => window.location.href = window.location.href) + +});