Ajout page permettant de lister et sauvegarder ses résultats aux quizs.

This commit is contained in:
Fabrice PENHOËT 2022-03-23 18:58:13 +01:00
parent 7e609c9cdb
commit b4c6a9d440
13 changed files with 149 additions and 149 deletions

View File

@ -9,7 +9,7 @@ import { availableLangs } from "../../../config/instance.js";
const lang=availableLangs[0];
// Textes :
const { localDBNotReady }=require("../../../lang/"+lang+"/answer");
const { localDBNotReady, localFileFail, localFileImportOK, wantToSaveResultsDatas }=require("../../../lang/"+lang+"/answer");
const { serverError }=require("../../../lang/"+lang+"/general");
// Fonctions :
@ -22,11 +22,9 @@ import { loadMatomo } from "./tools/matomo.js";
import { userQuizsResults} from "./tools/userQuizsResults";
// Éléments du DOM manipulés :
//const btnSave=document.getElementById("want2Save");
//const btnSubmit=document.getElementById("checkResponses");
//const propose2Save=document.getElementById("propose2Save");
//const responseTxt=document.getElementById("response");
const datas2Restore=document.getElementById("datas2Restore");
const quizsList=document.getElementById("quizsList");
const responseTxt=document.getElementById("response");
let userDB, allPreviousAnswers=[], myResults;
const initialise = async () =>
@ -34,10 +32,14 @@ const initialise = async () =>
try
{
// Instanciation de la classe s'occupant du stockage des résultats aux quizs :
myResults=await userQuizsResults.initialise("myResults", 1);
myResults=await userQuizsResults.initialise("myResults", 2);
// Si la base de données est fonctionnel et que des résultats sont déjà enregistrés, on affiche la liste des quizs ayant une réponse connue :
if(myResults.dbIsReady !== false)
await myResults.showMyQuizs();
{
myResults.showMyQuizs();
if(myResults.allResults.length !== 0)
myResults.saveMyQuizs("quizsSave", wantToSaveResultsDatas, ["button"]);
}
else
addElement(quizsList, "p", localDBNotReady);
// Statistiques :
@ -50,143 +52,44 @@ const initialise = async () =>
}
initialise();
helloDev();
/*
// Fonction affichant le quiz, quand il est caché par défaut+ déclenchant le chronomètre mesurant la durée de réponse aux questions.
const showQuestionnaire = () =>
{
chronoBegin=Date.now();
myForm.style.display="block";
btnShow.style.display="none";
const here=window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview".
if(window.location.hash !== "")
{
window.location.hash="";// ! le "#" reste
window.location.assign(here+"questionnaire");
}
else
window.location.assign(here+"#questionnaire");
}
let chronoBegin;
if(btnShow)
{
btnShow.addEventListener("click", function(e)
{
try
{
e.preventDefault();
showQuestionnaire();
}
catch(e)
{
addElement(responseTxt, "p", serverError, "", ["error"]);
console.error(e);
}
});
// Un lien peut être passé pour voir directement le quiz :
if(location.hash !== "" && location.hash === "#questionnaire")
showQuestionnaire();
}
// Dans le cas d'un quiz groupé, le chrono est lancé dès l'affichage :
if(quizInfos.GroupId != "0")
{
chronoBegin=Date.now();
btnSubmit.style.display="block";
}
// Traitement de l'envoi de la réponse de l'utilisateur :
let answer;
myForm.addEventListener("submit", async function(e)
datas2Restore.addEventListener("change", function(e)
{
try
{
e.preventDefault();
btnSubmit.style.display="none"; // seulement une réponse à la fois, SVP :)
responseTxt.innerHTML=""; // supprime les éventuels messages déjà affichés
answer=userQuizsResults.checkUserAnswers(myForm);
answer.duration=Math.round((Date.now()-chronoBegin)/1000);
answer.QuestionnaireId=quizInfos.QuestionnaireId;
answer.GroupId=quizInfos.GroupId;
// Enregistrement et affichage du résultat, suivant les cas :
let getOuput=userQuizsResults.getResultOutput(answer);
// S'il y a déjà une réponse dans la bd, c'est que l'utilisateur est ok pour les enregister.
if(myResults.allResults.length !== 0)
responseTxt.innerHTML="";
const selectedFiles=datas2Restore.files;
if(selectedFiles !== null && selectedFiles.length === 1)
{
const saveResponses=await myResults.addResult(answer);
if(saveResponses)
await myResults.showPreviousResultsForId(quizInfos.QuestionnaireId, quizInfos.GroupId);
getOuput+="<br><br>"+wantToSeaPreviousResults.replace("URL","#explanations");
// Nouveau quiz pour cette personne ?
await myResults.saveNewQuiz(quizInfos);
}
else
{
// S'il n'a pas encore de données, on stocke temporairement le résultat et propose de l'enregistrer :
if(myResults.saveResultTemp(answer) && myResults.dbIsReady)
// selectedFiles[0].type ne fonctionne pas avec certains navigateurs (Fennec), donc... :
const extension=selectedFiles[0].name.substring(selectedFiles[0].name.lastIndexOf(".")+1);
if(extension !== "json")
addElement(responseTxt, "p", localFileFail, "", ["error"]);
else
{
getOuput+="<br><br>"+wantToSaveResponses;
propose2Save.style.display="block";
}
}
addElement(responseTxt, "p", getOuput, "", ["info"]);
// On redirige vers le résultat :
const here=window.location;
if(window.location.hash !== "")
{
window.location.hash=""; // ! le "#" reste
window.location.assign(here+"response");
}
else
window.location.assign(here+"#response");
// + Affichage des textes d'explication pour chaque question
const explanations=document.querySelectorAll(".help");
for(let i in explanations)
{
if(explanations[i].style != undefined) // sinon, la console affiche une erreur "TypeError: explanations[i].style is undefined", bien que tout fonctionne (?)
explanations[i].style.display="block";
}
}
catch(e)
{
addElement(responseTxt, "p", serverError, "", ["error"]);
console.error(e);
}
});
// L'utilisateur demande à sauvegarder son résultat :
btnSave.addEventListener("click", async function(e)
{
try
{
e.preventDefault();
if(!isEmpty(myResults.dbIsReady) && !isEmpty(answer)) // On ne devrait pas m'avoir proposé d'enregistrer dans ce cas, mais...
{
const saveResponses=await myResults.addResult(answer);
if(saveResponses)
{
// Nouvel enregistrement = actualisation nécessaire de la liste des résultats pour ce quiz :
await myResults.showPreviousResultsForId(quizInfos.QuestionnaireId, quizInfos.GroupId);
// Nouveau quiz (ce qui doit être le cas, mais...) :
await myResults.saveNewQuiz(quizInfos);
// Redirection vers la liste des résultats :
const here=window.location; // window.location à ajouter pour ne pas quitter la page en mode "preview".
if(window.location.hash !== "")
// Lecture du contenu du fichier qui est passé au parseur :
const reader=new FileReader();
reader.onload=async function(e)
{
window.location.hash="";// ! le "#" reste
window.location.assign(here+"explanations");
}
else
window.location.assign(here+"#explanations");
const datas=JSON.parse(reader.result);
if(myResults.dbIsReady !== false)
{
if((datas.quizs.length !==0) &&(datas.results.length !==0))
{
await myResults.saveAllResults(datas.results);
await myResults.saveAllQuizs(datas.quizs);
// Puis actualise l'affichage :
myResults.showMyQuizs();
addElement(responseTxt, "p", localFileImportOK, "", ["success"]);
}
}
};
reader.readAsText(selectedFiles[0]);
}
propose2Save.style.display="none";
}
}
catch(e)
{
addElement(responseTxt, "p", serverError, "", ["error"]);
console.error(e);
}
});*/
});

View File

@ -29,7 +29,8 @@ const quizInfos=
url: window.location.pathname,
GroupId: document.getElementById("groupId").value,
QuestionnaireId: document.getElementById("questionnaireId").value,
title: myForm.dataset.title
title: myForm.dataset.title,
keywords: myForm.dataset.keywords
};
// Éléments du DOM manipulés :
@ -50,7 +51,7 @@ const initialise = async () =>
btnShow.style.display="inline"; // Le bouton est caché si le JS est inactif, car le JS est nécessaire pour la suite...
}
// Instanciation de la classe s'occupant du stockage des résultats aux quizs :
myResults=await userQuizsResults.initialise("myResults", 1);
myResults=await userQuizsResults.initialise("myResults", 2);
// Si la base de données est fonctionnel et que des résultats sont déjà enregistrés, on affiche ceux pour le quiz en cours :
if(myResults.allResults.length !== 0)
await myResults.showPreviousResultsForId(quizInfos.QuestionnaireId, quizInfos.GroupId);

View File

@ -182,7 +182,12 @@ export class userQuizsResults
store.createIndex("nbCorrectAnswers", "nbCorrectAnswers", { unique: false });
store.createIndex("nbQuestions", "nbQuestions", { unique: false });
store.createIndex("date", "date", { unique: false }); // bien que doublons peu probables...
}
}
if (e.oldVersion < 2)
{
const quizsStore=req.transaction.objectStore("userQuizs");
quizsStore.createIndex("keywords", "keywords", { unique: false });
}
};
req.onsuccess= (e) =>
{
@ -350,6 +355,38 @@ export class userQuizsResults
})
}
// Importation en masse des résultats :
async saveAllResults(results)
{
await this.getOpenDb();
return new Promise( (resolve, reject) =>
{
const resultsStore=getStore(this.db, "userResults", "readwrite");
// Au commence par vider l'existant :
resultsStore.clear();
// Puis on enregistre les données fournies :
for(const result of results)
{
if(this.checkIfResultIsComplete(result))
{
let req;
req=resultsStore.add(result);
req.onerror= (e) =>
{
this.db.close();
reject(e);
};
}
}
this.db.close();
// On injecte les donnés qui ont été acceptées dans l'instance :
this.getAllResults().then( () =>
{
resolve(true);
});
})
}
// Enregistre le quiz, s'il n'existe pas déjà :
async saveNewQuiz(quizInfos)
{
@ -397,6 +434,38 @@ export class userQuizsResults
}
})
}
// Importation en masse des quizs :
async saveAllQuizs(quizs)
{
await this.getOpenDb();
return new Promise( (resolve, reject) =>
{
const quizsStore=getStore(this.db, "userQuizs", "readwrite");
// Au commence par vider l'existant :
quizsStore.clear();
// Puis on enregistre les données fournies :
for(const quiz of quizs)
{
if(!isEmpty(quiz.url) && !isEmpty(quiz.title) && (!isEmpty(quiz.QuestionnaireId) || !isEmpty(quiz.GroupId)))
{
let req;
req=quizsStore.add(quiz);
req.onerror= (e) =>
{
this.db.close();
reject(e);
};
}
}
this.db.close();
// On injecte les donnés qui ont été acceptées dans l'instance :
this.getAllQuizs().then( () =>
{
resolve(true);
});
})
}
// Fonction affichant les précédents résultats connus pour le quiz encours :
async showPreviousResultsForId(QuestionnaireId, GroupId, txtContentId="explanationsContent", txtTitleId="explanationsTitle")
@ -443,9 +512,7 @@ export class userQuizsResults
addElement(explanationsContent, "ul", previousResultsContent);
}
else
addElement(explanationsContent, "ul", noPreviousResults);
/// Revoir : ajouter un lien vers la page listant les quizs auxquels l'utilisateur a répondu
/// addElement(explanationsContent, "p", "<a href=\"/"+configTemplate.userHomePage+"\" class=\"button cardboard\">"+configTemplate.userHomePageTxt+"</a>", "", ["btn"], "", false);
addElement(explanationsContent, "ul", noPreviousResults);
}
}
@ -454,13 +521,24 @@ export class userQuizsResults
{
const listElt=document.getElementById(listId);
// On affiche d'abord les quizs les plus récents :
const myQuizs=this.allQuizs.reverse();
const myQuizs=Object.values(this.allQuizs);
myQuizs.reverse();
let html="";
for(const quiz of myQuizs)
html+=`<li><a href="${quiz.url}#explanations">${quiz.title}</a></li>`;
if(html !== "")
addElement(listElt, "ul", html+"ici");
addElement(listElt, "ul", html);
else
addElement(listElt, "p", noPreviousResultsAtAll);
}
// Propose à l'utilisateur de télécharger ses données dans un fichier JSON
saveMyQuizs(eltId="quizsSave", saveLinkTxt="Save your datas.", cssClass=[], linkId="")
{
const datas2Save=[JSON.stringify({ quizs: this.allQuizs, results: this.allResults })];
const datasFile=new File(datas2Save, "myDatas.json", { type: "application/json", });
const datasFileUrl=URL.createObjectURL(datasFile);
const domElt=document.getElementById(eltId);
addElement(domElt, "a", saveLinkTxt, linkId, cssClass, { href:datasFileUrl, download:"myDatas.json"});
}
}

View File

@ -20,6 +20,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
</ul>

View File

@ -20,6 +20,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<!--<li><a href="/connexion.html" id="accountHeadLink">Mon compte</a></li>-->
<li><a href="/a-propos.html">À propos</a></li>

View File

@ -19,6 +19,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
<li><a href="/" title="Page d'accueil de WikiLerni">Accueil</a></li>

View File

@ -20,6 +20,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
<li><a href="/" title="Page d'accueil de WikiLerni">Accueil</a></li>

View File

@ -20,6 +20,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
<li><a href="/" title="Page d'accueil de WikiLerni">Accueil</a></li>

View File

@ -19,6 +19,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
<li><a href="/" title="Page d'accueil de WikiLerni">Accueil</a></li>

View File

@ -3,8 +3,8 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Retrouvez vos résultats aux quizs auxquels vous avez déjà répondu sur WikiLerni.">
<title>Retrouvez vos résultats aux quizs WikiLerni</title>
<meta name="description" content="Retrouvez les quizs auxquels vous avez déjà répondu. aux quizs auxquels vous avez déjà répondu sur WikiLerni.">
<title>Retrouvez les quizs auxquels vous avez déjà répondu. aux quizs WikiLerni</title>
<!-- Version lisible des scripts : https://forge.chapril.org/Fab_Blab/WikiLerni/src/branch/master/front/src -->
<script src="/JS/polyfill.app.js" defer></script>
<script src="/JS/myQuizs.app.js" defer></script>
@ -20,7 +20,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez vos résultats">Mes quizs</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
<li><a href="/" title="Page d'accueil de WikiLerni">Accueil</a></li>
@ -39,12 +39,19 @@
<noscript>Désolé, mais pour linstant, lutilisation de WikiLerni nécessite lactivation du JavaScript.</noscript>
<div id="quizsList"></div>
<div id="quizsSave" class="ctaButton"></div>
<div class="ctaButton"><a href="#quizsRestore" class="button">Importer mes données.</a>
<form id="quizsRestore"><fieldset><p class="info">Sélectinnez ci-dessous, votre fichier de sauvegarde.</p><input type="file" id="datas2Restore" class="cardboard" \></fieldset></form></div>
<div id="response"></div>
<div id="explanations" class="framed engraved">
<h2>Comment ça marche?</h2>
<p>À chaque fois que vous répondez à un quiz sur WikiLerni, votre résultat peut être enregistré, si vous l'acceptez.</p>
<p>Vous n'avez pas besoin de créer un compte, car ces données sont enregistrées dans votre navigateur internet, c'est-à-dire sur votre ordinateur. Ceci peut ne pas fonctionner, si vous utilisez une navigation privée ou d'autres configurations interdisant ce type d'enregistrement.</p>
<p>Par ailleurs, ces données ne sont accessibles qu'à partir du navigateur vous ayant permi des les enregistrer.<br>Aussi, pour éviter de les perdre, ou encore vous permettre de les récupérer sur un autre navigateur, un outil de sauvegarde vous est proposé.</p>
<p>Tout dabord, <b>cette fonctionnalité est encore expérimentale</b>. Donc si vous rencontrez une erreur, nhésitez pas à men informer.</p>
<p>À chaque fois que vous répondez à un quiz sur WikiLerni, votre résultat peut être enregistré. Ceci vous est proposé lors du premier enregistrement et est ensuite automatique.</p>
<p>Vous pouvez ainsi retrouver facilement les quizs auxquels vous avez déjà répondu, ainsi que vos précédents résultats.</p>
<p><b>Vous navez pas besoin de créer un compte</b>, car ces données sont enregistrées dans votre navigateur internet, cest-à-dire sur votre ordinateur. </p>
<p><b>Ceci peut ne pas fonctionner</b>, si vous utilisez une navigation privée ou dautres configurations interdisant ce type denregistrement.</p>
<p>Par ailleurs, ces données ne sont accessibles quà partir du navigateur vous ayant permis de les enregistrer.<br>Aussi, <b>pour éviter de perdre vos données</b>, ou encore, vous permettre de les récupérer sur un autre navigateur, une solution de sauvegarde vous est proposée. Nhésitez pas à la tester.</p>
</div>
</div>

View File

@ -20,6 +20,7 @@
<a href="/" title="Page d'accueil WikLerni"><img src="/themes/wikilerni/img/wikilerni-purple-2-128.png" alt="WikiLerni (logo)" title="Accéder à la page d'accueil de WikiLerni" /></a>
<ul id="headLinks">
<li><a href="/contact.html" rel="nofollow">Contact</a></li>
<li><a href="/quizs/" title="Retrouvez les quizs auxquels vous avez déjà répondu.">Mes quizs</a></li>
<li><a href="/quizs/" id="indexHeadLink" title="Les dernières publications">Parcourir</a></li>
<li><a href="/a-propos.html">À propos</a></li>
<li><a href="/" title="Page d'accueil de WikiLerni">Accueil</a></li>

View File

@ -4,6 +4,8 @@ module.exports =
localDBNeedDatas: "Il manque des données nécessaires à l'enregistrement.",
localDBNeedQuizId: "Aucun identifiant n'a été fourni pour le quiz.",
localDBNotReady: "Désolé, mais il semble que votre navigateur ne permette pas l'utilisation de cette page. Pour plus d'informations, lisez les explications ci-dessous.",
localFileFail: "Le fichier que vous avez sélectionné n'a pas le format attendu (JSON).",
localFileImportOK: "Vos données ont bien été importées. Vos quizs devraient apparaître ci-dessus.",
needIntegerNumberCorrectResponses : "Le nombre de réponses correctes doit être un nombre entier.",
needIntegerNumberSecondesResponse : "La durée de la réponse doit être un nombre entier de secondes.",
needIntegerNumberUserResponses : "Le nombre de questions auxquelles l'utilisateur a répondu doit être un nombre entier.",
@ -25,6 +27,7 @@ module.exports =
userAnswersFail : "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. C'est certain, vous ferez mieux la prochaine fois !",
userAnswersMedium : "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. C'est pas mal du tout !",
userAnswersSuccess : "Vous avez répondu en DURATION secondes et avez <u><b>NBCORRECTANSWERS bonne(s) réponse(s) sur NBQUESTIONS questions</b></u>. Bravo ! Rien ne vous échappe !",
wantToSaveResultsDatas: "Sauvegarder les données.",
wantToSaveResponses: "Si vous le souhaitez, vous pouvez <b>sauvegarder vos résultats</b> (il n'est pas nécessaire de créer un compte) :",
wantToSeaPreviousResults: "<a href='URL'>Cliquez ici</a> pour tous vos résultats et vos statistiques de réussite à ce quiz."
};

View File

@ -4,6 +4,7 @@ module.exports =
headLinks:
[
{ anchor: "Contact", attributes: { href:"/contact.html", rel: "nofollow" } },
{ anchor: "Mes quizs", attributes: { href:"/mes-quizs.html", rel: "nofollow", title:"Liste des quizs auxquels vous avez déjà répondu." } },
{ anchor: "Parcourir", attributes: { href:"/quizs/", id:"indexHeadLink", title:"Les dernières publications" } },
{ anchor: "À propos", attributes: { href:"/a-propos.html", title:"En savoir + sur WikiLerni" } },
{ anchor: "Accueil", attributes: { href:"/", title:"Page d'accueil" } }
@ -29,8 +30,8 @@ module.exports =
stopMailPage : "stop-mail.html?t=",
subscribePage : "inscription.html",
updateAccountPage: "compte.html",
userHomePage : "accueil.html",
userHomePageTxt : "Ma page d'accueil.",
userHomePage : "mes-quizs.html",
userHomePageTxt : "Tous mes quizs.",
usersManagementPage: "gestion-utilisateurs.html",
validationLinkPage : "validation.html?t=",
/* Textes (général) */