feat: devWeb - Create a translation system and his translations files

This commit is contained in:
kmitresse
2024-06-11 12:37:32 +02:00
parent 969a31d7b1
commit ac699b6de3
5 changed files with 247 additions and 0 deletions
@@ -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");
}
}
}
@@ -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;
}
}
@@ -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"); %>
<!DOCTYPE html>
<html class="has-navbar-fixed-top">
<head>
@@ -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."
}
}
@@ -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)
});