Commit 031c0a9c authored by Clouard Regis's avatar Clouard Regis
Browse files

Refactored planner pages.

parent fe74b742
......@@ -20,7 +20,3 @@ prototype-uml/*
/upload
/config/secret/.Halite.key
/config/secret/.image.keys
/translations/security.en.xlf
/translations/validators.en.xlf
/translations/security.fr.xlf
/translations/validators.fr.xlf
......@@ -40,12 +40,12 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
* @var string The hashed password
* @ORM\Column(type="string")
*/
private string $password;
private ?string $password = null;
/**
* @Assert\Length(min=8, max=4096)
*/
private ?string $plainPassword;
private ?string $plainPassword = null;
/**
* @ORM\Column(type="text")
......@@ -149,7 +149,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
/**
* @see UserInterface
*/
public function getPassword(): string
public function getPassword(): ?string
{
return $this->password;
}
......@@ -161,7 +161,7 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this;
}
public function getPlainPassword(): string
public function getPlainPassword(): ?string
{
return $this->plainPassword;
}
......
......@@ -3,7 +3,6 @@
<link rel="stylesheet" href="{{ asset('/public/css/tabs.css') }}"/>
<link rel="stylesheet" href="{{ asset('/public/leaflet/leaflet.css') }}"/>
<link rel="stylesheet" href="{{ asset('/public/leaflet/easy-button.css') }}"/>
{% endblock %}
{% block javascripts %}
......@@ -12,12 +11,11 @@
<script src="{{ asset('/public/javascript/showMap.js') }}?0.0.1"></script>
<script src="{{ asset('/public/javascript/addCourse.js') }}"></script>
<script src="{{ asset('/public/leaflet/easy-button.js') }}"></script>
<script>
let translations = {
'number' : '{{ 'xmlTab.number' | trans | escape('js') }}',
'label' : '{{ 'xmlTab.label' | trans | escape('js') }}',
'type' : '{{ 'xmlTab.type' | trans | escape('js') }}',
'number': '{{ 'xmlTab.number' | trans | escape('js') }}',
'label': '{{ 'xmlTab.label' | trans | escape('js') }}',
'type': '{{ 'xmlTab.type' | trans | escape('js') }}',
}
// init, configure variables
let nameLengthLimit = 60;
......@@ -29,10 +27,14 @@
let img;
let modify = '{{ data.modify }}';
let isXMLProvided; let isKMLProvided; let isImageProvided;
isXMLProvided = isKMLProvided = isImageProvided = modify;
let isXMLProvided;
let isKMLProvided;
let isImageProvided;
isXMLProvided = isKMLProvided = isImageProvided = modify;
let isXMLModified; let isKMLModified; let isImageModified;
let isXMLModified;
let isKMLModified;
let isImageModified;
isXMLModified = isKMLModified = isImageModified = false;
// inputs send files one by one and we have to receive all data at once
......@@ -41,7 +43,7 @@
let isNameProvided = name.length > 0;
let nameIsTooLong = name.length > nameLengthLimit;
let club = document.getElementById("club").value;
let clubNameIsTooLong = club.length > clubNameLengthLimit;
let clubNameIsTooLong = club.length > clubNameLengthLimit;
let selectedXmlCourse = isXMLModified ? parseInt(document.querySelector('input[name="course"]:checked').value) : 0;
let startingTime = getTimeFrom("starting-day-limiter") + " " + getTimeFrom("starting-hour-limiter");
let endingTime = getTimeFrom("ending-day-limiter") + " " + getTimeFrom("ending-hour-limiter");
......@@ -105,7 +107,7 @@
}
}
function uploadFile(type){
function uploadFile(type) {
let file = document.getElementById(type + '-input').files[0];
document.getElementById(type + '-progress-container').style.display = "flex";
document.getElementById(type + '-progress-indicator').classList.remove("bg-success");
......@@ -113,18 +115,18 @@
let formData = new FormData();
formData.append("file", file);
let xhr = new XMLHttpRequest();
xhr.open("POST","{{ path('upload_course_file') }}");
xhr.open("POST", "{{ path('upload_course_file') }}");
xhr.upload.addEventListener("progress", function (event) {
let ratio = Math.floor(event.loaded/event.total*100);
let ratio = Math.floor(event.loaded / event.total * 100);
let progressBar = document.getElementById(type + '-progress-indicator');
progressBar.style.width = ratio + "%";
progressBar.textContent = ratio + "%";
});
xhr.addEventListener("load", function () {
let progressBar = document.getElementById(type + '-progress-indicator');
try{
try {
let data = JSON.parse(this.response);
if (data.extension === type || (data.extension === "zip" && type === "kmz") || (type === "image" && (data.extension === "png" || data.extension === "jpg" || data.extension === "jpeg" ))){
if (data.extension === type || (data.extension === "zip" && type === "kmz") || (type === "image" && (data.extension === "png" || data.extension === "jpg" || data.extension === "jpeg"))) {
progressBar.textContent = '{{ 'upload.success' | trans | escape('js') }}';
progressBar.style.width = "100%";
progressBar.classList.add("bg-success");
......@@ -133,11 +135,10 @@
} else {
progressBar.textContent = '{{ 'upload.failure' | trans | escape('js') }}';
}
if (data.extension === "xml"){
if (data.extension === "xml") {
showCourseList(data.content);
}
}
catch (e) {
} catch (e) {
progressBar.textContent = '{{ 'upload.file.too.big' | trans | escape('js') }}';
progressBar.style.width = "100%";
progressBar.classList.add("bg-danger");
......@@ -146,7 +147,7 @@
xhr.send(formData);
}
function setModified(type){
function setModified(type) {
switch (type) {
case 'xml':
isXMLProvided = isXMLModified = true;
......@@ -164,25 +165,25 @@
}
}
function showCourseList(courses){
function showCourseList(courses) {
let list = document.getElementById("courses-list");
while (list.hasChildNodes()){
while (list.hasChildNodes()) {
list.firstChild.remove();
}
for (let i=0; i<courses.length; i++){
for (let i = 0; i < courses.length; i++) {
let newLi = document.createElement("li");
newLi.className = "list-group-item list-group-item-action p-0 pl-1";
list.appendChild(newLi);
let newInput = document.createElement("input");
newInput.type = "radio";
newInput.id = "xml-course-input-"+i;
newInput.id = "xml-course-input-" + i;
newInput.name = "course";
newInput.value = ""+i;
newInput.value = "" + i;
newLi.appendChild(newInput);
let newLabel = document.createElement("label");
newLabel.htmlFor = "xml-course-input-"+i;
newLabel.htmlFor = "xml-course-input-" + i;
newLabel.textContent = courses[i];
newLabel.className = "w-75 p-1";
newLi.appendChild(newLabel);
......@@ -191,12 +192,12 @@
document.getElementById("course-selection").style.display = "block";
}
function getTimeFrom(id){
function getTimeFrom(id) {
let input = document.getElementById(id);
return input.type === "time" ? input.value + ":00" : input.value;
}
function timeSeparator(type,time){
function timeSeparator(type, time) {
if (time !== "") {
if (type === "date") {
return time.split(" ")[0];
......@@ -208,16 +209,16 @@
}
window.addEventListener("load", function () {
if (!modify){
if (!modify) {
document.getElementById("tabXml").click();
document.getElementById("tabKmz").click();
}
document.getElementById("map-button").click();
document.getElementById("starting-day-limiter").value = timeSeparator("date",'{{ data.startDate }}');
document.getElementById("starting-hour-limiter").value = timeSeparator("time",'{{ data.startDate }}');
document.getElementById("ending-day-limiter").value = timeSeparator("date",'{{ data.endDate }}');
document.getElementById("ending-hour-limiter").value = timeSeparator("time",'{{ data.endDate }}');
document.getElementById("starting-day-limiter").value = timeSeparator("date", '{{ data.startDate }}');
document.getElementById("starting-hour-limiter").value = timeSeparator("time", '{{ data.startDate }}');
document.getElementById("ending-day-limiter").value = timeSeparator("date", '{{ data.endDate }}');
document.getElementById("ending-hour-limiter").value = timeSeparator("time", '{{ data.endDate }}');
divLeaflet = document.createElement("div");
map = generateMap(divLeaflet);
......@@ -244,7 +245,7 @@
{% if data.name is defined %}
<script>window.addEventListener("load", function (_) {
document.getElementById("name").value = "{{ data.name|escape('js')}}";
document.getElementById("name").value = "{{ data.name|escape('js') }}";
document.getElementById("club").value = "{{ data.club|escape('js') }}";
});
</script>
......@@ -339,23 +340,26 @@
</div>
</div>
</div>
<div class="col mb-3" id="timeLimiters">
<div class="tab">
<button class="w-100" onclick="openTab('tabTimeZone', 'time-selection-zone', 'timeselectionzone')" id="tabTimeZone">{% trans %}course.time.selection.zone{% endtrans %}</button>
</div>
<div id="time-selection-zone" class="tab-content timeselectionzone">
<div class="row" id="start-time-limiter" style="padding: 0.3em;">
<label for="starting-day-limiter" style="margin-left: 0.5em;">{% trans %} course.indicate.start.day {% endtrans %}</label>
<input type="date" id="starting-day-limiter" style="margin-left: 0.5em; margin-right: 0.5em;">
<label for="starting-hour-limiter">{% trans %} course.indicate.hour {% endtrans %}</label>
<input type="time" id="starting-hour-limiter" style="margin-left: 0.5em; margin-right: 0.5em;">
</div>
<div class="row" id="end-time-limiter" style="padding: 0.3em;">
<label for="ending-day-limiter" style="margin-left: 0.5em;">{% trans %} course.indicate.end.day {% endtrans %}</label>
<input type="date" id="ending-day-limiter" style="margin-left: 0.5em; margin-right: 0.5em;">
<label for="ending-hour-limiter">{% trans %} course.indicate.hour {% endtrans %}</label>
<input type="time" id="ending-hour-limiter" style="margin-left: 0.5em; margin-right: 0.5em;">
</div>
<table>
<tr>
<td><label for="starting-day-limiter" style="margin-left: 0.5em;">{% trans %}course.indicate.start.day{% endtrans %}</label></td>
<td><input type="date" id="starting-day-limiter" style="margin-left: 0.5em; margin-right: 0.5em;"></td>
<td><label for="starting-hour-limiter">{% trans %}course.indicate.hour{% endtrans %}</label></td>
<td><input type="time" id="starting-hour-limiter" style="margin-left: 0.5em; margin-right: 0.5em;"></td>
</tr>
<tr>
<td><label for="ending-day-limiter" style="margin-left: 0.5em;">{% trans %}course.indicate.end.day{% endtrans %}</label></td>
<td><input type="date" id="ending-day-limiter" style="margin-left: 0.5em; margin-right: 0.5em;"></td>
<td><label for="ending-hour-limiter">{% trans %}course.indicate.hour{% endtrans %}</label></td>
<td><input type="time" id="ending-hour-limiter" style="margin-left: 0.5em; margin-right: 0.5em;"></td>
</tr>
</table>
</div>
</div>
<div class="row custom-control custom-switch mb-3">
......
......@@ -20,7 +20,7 @@
<div class="form-group row">
<label for="username" class="col-4 col-form-label">{% trans %}user.identifier{% endtrans %}</label>
<div class="col-8">
<label for="username" class="form-control here">{{ user.username }}</label>
<label for="username" class="form-control here">{{ user.userIdentifier }}</label>
</div>
</div>
<div class="form-group row">
......
......@@ -12,10 +12,10 @@
<h3 class="text-center text-primary" style="padding-bottom: 30pt">Se connecter</h3>
{% if error %}
<div class="alert alert-danger">
{{ error.messageKey|trans(error.messageData) }}
{{ error.messageKey|trans(error.messageData, 'security') }}
<p></p>
<a href="{{ path('app_logout') }}">
<button type="button" class="btn btn-outline-primary">{% trans %}login.logout{% endtrans %}</button>
<button type="button" class="btn btn-outline-primary">{% trans %}login.OK{% endtrans %}</button>
</a>
</div>
{% elseif app.user %}
......@@ -23,7 +23,7 @@
Vous êtes déjà connecté en tant que "{{ app.user.username }}"<br>
<p></p>
<a href="{{ path('app_logout') }}">
<button type="button" class="btn btn-outline-primary">Logout</button>
<button type="button" class="btn btn-outline-primary">{% trans %}login.logout{% endtrans %}</button>
</a>
</div>
{% else %}
......
......@@ -219,7 +219,7 @@
</trans-unit>
<trans-unit id="CyHlrYw" resname="user.title">
<source>user.title</source>
<target>My info</target>
<target>Personal information</target>
</trans-unit>
<trans-unit id="9pCxhC." resname="user.identifier">
<source>user.identifier</source>
......@@ -235,11 +235,11 @@
</trans-unit>
<trans-unit id="kWoulNe" resname="modify.your.info">
<source>modify.your.info</source>
<target>Modify your personal info</target>
<target>Modify your personal information</target>
</trans-unit>
<trans-unit id="ttcvPpQ" resname="user_modify.title">
<source>user_modify.title</source>
<target>Modify my info</target>
<target>Edit personal information</target>
</trans-unit>
<trans-unit id="i2EtciA" resname="user_modify.change">
<source>user_modify.change</source>
......@@ -1203,7 +1203,7 @@ such as orienteering, multisport orienteering, trails...</target>
</trans-unit>
<trans-unit id="BxVa1iR" resname="course.indicate.start.day">
<source>course.indicate.start.day</source>
<target>Accessibility starts on (select day)</target>
<target>Start date</target>
</trans-unit>
<trans-unit id="RIOsp2z" resname="course.indicate.hour">
<source>course.indicate.hour</source>
......@@ -1211,7 +1211,7 @@ such as orienteering, multisport orienteering, trails...</target>
</trans-unit>
<trans-unit id="b46PxQ0" resname="course.indicate.end.day">
<source>course.indicate.end.day</source>
<target>Accessibility ends on (select day)</target>
<target>End date</target>
</trans-unit>
<trans-unit id="GNgOzbC" resname="homepage.app.android.download">
<source>homepage.app.android.download</source>
......@@ -1251,7 +1251,7 @@ such as orienteering, multisport orienteering, trails...</target>
</trans-unit>
<trans-unit id="ylxCKj4" resname="course.modify">
<source>course.modify</source>
<target>Modify course</target>
<target>Edit Course</target>
</trans-unit>
<trans-unit id="CouE33v" resname="no.xml.submitted">
<source>no.xml.submitted</source>
......@@ -1325,14 +1325,14 @@ such as orienteering, multisport orienteering, trails...</target>
<source>error.printable.choice.invalid</source>
<target>Invalid printable choice</target>
</trans-unit>
<trans-unit id="Hd9NYNq" resname="login.unknown.planner">
<source>login.unknown.planner</source>
<target>Unknown planner</target>
</trans-unit>
<trans-unit id="slP6BBh" resname="login.logout">
<source>login.logout</source>
<target>Logout</target>
</trans-unit>
<trans-unit id="mLeww7D" resname="login.OK">
<source>login.OK</source>
<target>OK</target>
</trans-unit>
</body>
</file>
</xliff>
......@@ -631,7 +631,7 @@ de l’Informatique.</target>
</trans-unit>
<trans-unit id="3Wlf2.i" resname="my_event_details.courses_table.PM_penalty">
<source>my_event_details.courses_table.PM_penalty</source>
<target>Pénalité en points par poste manquant</target>
<target>Pénalité par poste manquant en points</target>
</trans-unit>
<trans-unit id="fwozrXx" resname="my_event_details.courses">
<source>my_event_details.courses</source>
......@@ -911,7 +911,7 @@ de l’Informatique.</target>
</trans-unit>
<trans-unit id="RJvAGcx" resname="admin_list_planners.ask.for.deletion">
<source>admin_list_planners.ask.for.deletion</source>
<target>Êtes-vous sur de vouloir supprimer définitivement ce traceur ?</target>
<target>Êtes-vous sur de vouloir supprimer définitivement ce traceur ? Action irréversible</target>
</trans-unit>
<trans-unit id="ECNPnpU" resname="admin_list_planners.confirm.deletion">
<source>admin_list_planners.confirm.deletion</source>
......@@ -1015,7 +1015,7 @@ de l’Informatique.</target>
</trans-unit>
<trans-unit id="KOBBZRX" resname="admin_list_planners.ask.for.delete.confirmation">
<source>admin_list_planners.ask.for.delete.confirmation</source>
<target>Voulez-vous effacer ce traceur ? (Action irréversible)</target>
<target>Voulez-vous effacer ce traceur ?</target>
</trans-unit>
<trans-unit id="nWBUpqp" resname="deletion.succeeded">
<source>deletion.succeeded</source>
......@@ -1295,15 +1295,15 @@ de l’Informatique.</target>
</trans-unit>
<trans-unit id="BxVa1iR" resname="course.indicate.start.day">
<source>course.indicate.start.day</source>
<target>L'accès débute le (indiquer le jour)</target>
<target>Date d'ouverture : </target>
</trans-unit>
<trans-unit id="RIOsp2z" resname="course.indicate.hour">
<source>course.indicate.hour</source>
<target> à (indiquer l'heure)</target>
<target> à </target>
</trans-unit>
<trans-unit id="b46PxQ0" resname="course.indicate.end.day">
<source>course.indicate.end.day</source>
<target>L'accès se termine le (indiquer le jour)</target>
<target>Date de fermeture :</target>
</trans-unit>
<trans-unit id="GNgOzbC" resname="homepage.app.android.download">
<source>homepage.app.android.download</source>
......@@ -1333,14 +1333,14 @@ de l’Informatique.</target>
<source>error.printable.choice.invalid</source>
<target>Valeur invalide pour le champ Imprimable</target>
</trans-unit>
<trans-unit id="Hd9NYNq" resname="login.unknown.planner">
<source>login.unknown.planner</source>
<target>Le compte n'existe pas.</target>
</trans-unit>
<trans-unit id="slP6BBh" resname="login.logout">
<source>login.logout</source>
<target>Déconnexion</target>
</trans-unit>
<trans-unit id="mLeww7D" resname="login.OK">
<source>login.OK</source>
<target>OK</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="baI_ZxO" resname="An authentication exception occurred.">
<source>An authentication exception occurred.</source>
<target>An authentication exception occurred.</target>
</trans-unit>
<trans-unit id="OETylMq" resname="Authentication credentials could not be found.">
<source>Authentication credentials could not be found.</source>
<target>Authentication credentials could not be found.</target>
</trans-unit>
<trans-unit id="3RJINQ0" resname="Authentication request could not be processed due to a system problem.">
<source>Authentication request could not be processed due to a system problem.</source>
<target>Authentication request could not be processed due to a system problem.</target>
</trans-unit>
<trans-unit id="qr0aiUo" resname="Invalid credentials.">
<source>Invalid credentials.</source>
<target>Invalid credentials.</target>
</trans-unit>
<trans-unit id="zrJWK0F" resname="Cookie has already been used by someone else.">
<source>Cookie has already been used by someone else.</source>
<target>Cookie has already been used by someone else.</target>
</trans-unit>
<trans-unit id="blC0fXX" resname="Not privileged to request the resource.">
<source>Not privileged to request the resource.</source>
<target>Not privileged to request the resource.</target>
</trans-unit>
<trans-unit id="dLzMRPR" resname="Invalid CSRF token.">
<source>Invalid CSRF token.</source>
<target>Invalid CSRF token.</target>
</trans-unit>
<trans-unit id="PhhlLem" resname="No authentication provider found to support the authentication token.">
<source>No authentication provider found to support the authentication token.</source>
<target>No authentication provider found to support the authentication token.</target>
</trans-unit>
<trans-unit id="v_RS21A" resname="No session available, it either timed out or cookies are not enabled.">
<source>No session available, it either timed out or cookies are not enabled.</source>
<target>No session available, it either timed out or cookies are not enabled.</target>
</trans-unit>
<trans-unit id="EYCKpDH" resname="No token could be found.">
<source>No token could be found.</source>
<target>No token could be found.</target>
</trans-unit>
<trans-unit id="z3cOUZo" resname="Username could not be found.">
<source>Username could not be found.</source>
<target>Username could not be found.</target>
</trans-unit>
<trans-unit id="By5eLYM" resname="Account has expired.">
<source>Account has expired.</source>
<target>Account has expired.</target>
</trans-unit>
<trans-unit id="YfZhiuA" resname="Credentials have expired.">
<source>Credentials have expired.</source>
<target>Credentials have expired.</target>
</trans-unit>
<trans-unit id="NrSSfLs" resname="Account is disabled.">
<source>Account is disabled.</source>
<target>Account is disabled.</target>
</trans-unit>
<trans-unit id="O5ZyxHr" resname="Account is locked.">
<source>Account is locked.</source>
<target>Account is locked.</target>
</trans-unit>
<trans-unit id="gd.MOnZ" resname="Too many failed login attempts, please try again later.">
<source>Too many failed login attempts, please try again later.</source>
<target>Too many failed login attempts, please try again later.</target>
</trans-unit>
<trans-unit id="l9VYRj0" resname="Invalid or expired login link.">
<source>Invalid or expired login link.</source>
<target>Invalid or expired login link.</target>
</trans-unit>
<trans-unit id="9qGC3hG" resname="Too many failed login attempts, please try again in %minutes% minute.">
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
<target>Too many failed login attempts, please try again in %minutes% minute.</target>
</trans-unit>
<trans-unit id="AJR3lMs" resname="Too many failed login attempts, please try again in %minutes% minutes.">
<source>Too many failed login attempts, please try again in %minutes% minutes.</source>
<target>Too many failed login attempts, please try again in %minutes% minutes.</target>
</trans-unit>
<trans-unit id="Hd9NYNq" resname="login.unknown.planner">
<source>login.unknown.planner</source>
<target>Unknown planner</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="baI_ZxO" resname="An authentication exception occurred.">
<source>An authentication exception occurred.</source>
<target>Une exception d'authentification s'est produite.</target>
</trans-unit>
<trans-unit id="OETylMq" resname="Authentication credentials could not be found.">
<source>Authentication credentials could not be found.</source>
<target>Les identifiants d'authentification n'ont pas pu être trouvés.</target>
</trans-unit>
<trans-unit id="3RJINQ0" resname="Authentication request could not be processed due to a system problem.">
<source>Authentication request could not be processed due to a system problem.</source>
<target>La requête d'authentification n'a pas pu être executée à cause d'un problème système.</target>
</trans-unit>
<trans-unit id="qr0aiUo" resname="Invalid credentials.">
<source>Invalid credentials.</source>
<target>Mot de passe incorrecte.</target>
</trans-unit>
<trans-unit id="zrJWK0F" resname="Cookie has already been used by someone else.">
<source>Cookie has already been used by someone else.</source>
<target>Le cookie a déjà été utilisé par quelqu'un d'autre.</target>
</trans-unit>
<trans-unit id="blC0fXX" resname="Not privileged to request the resource.">
<source>Not privileged to request the resource.</source>
<target>Privilèges insuffisants pour accéder à la ressource.</target>
</trans-unit>
<trans-unit id="dLzMRPR" resname="Invalid CSRF token.">
<source>Invalid CSRF token.</source>
<target>Jeton CSRF invalide.</target>
</trans-unit>
<trans-unit id="PhhlLem" resname="No authentication provider found to support the authentication token.">
<source>No authentication provider found to support the authentication token.</source>
<target>Aucun fournisseur d'authentification n'a été trouvé pour supporter le jeton d'authentification.</target>
</trans-unit>
<trans-unit id="v_RS21A" resname="No session available, it either timed out or cookies are not enabled.">
<source>No session available, it either timed out or cookies are not enabled.</source>
<target>Aucune session disponible, celle-ci a expiré ou les cookies ne sont pas activés.</target>
</trans-unit>
<trans-unit id="EYCKpDH" resname="No token could be found.">
<source>No token could be found.</source>
<target>Aucun jeton n'a pu être trouvé.</target>
</trans-unit>
<trans-unit id="z3cOUZo" resname="Username could not be found.">
<source>Username could not be found.</source>
<target>Le nom d'utilisateur n'a pas pu être trouvé.</target>
</trans-unit>
<trans-unit id="By5eLYM" resname="Account has expired.">
<source>Account has expired.</source>
<target>Le compte a expiré.</target>
</trans-unit>
<trans-unit id="YfZhiuA" resname="Credentials have expired.">
<source>Credentials have expired.</source>
<target>Les identifiants ont expiré.</target>
</trans-unit>
<trans-unit id="NrSSfLs" resname="Account is disabled.">
<source>Account is disabled.</source>
<target>Le compte est désactivé.</target>
</trans-unit>
<trans-unit id="O5ZyxHr" resname="Account is locked.">
<source>Account is locked.</source>
<target>Le compte est bloqué.</target>
</trans-unit>
<trans-unit id="gd.MOnZ" resname="Too many failed login attempts, please try again later.">
<source>Too many failed login attempts, please try again later.</source>
<target>Plusieurs tentatives de connexion ont échoué, veuillez réessayer plus tard.</target>
</trans-unit>
<trans-unit id="l9VYRj0" resname="Invalid or expired login link.">
<source>Invalid or expired login link.</source>
<target>Lien de connexion invalide ou expiré.</target>
</trans-unit>
<trans-unit id="9qGC3hG" resname="Too many failed login attempts, please try again in %minutes% minute.">
<source>Too many failed login attempts, please try again in %minutes% minute.</source>
<target>Plusieurs tentatives de connexion ont échoué, veuillez réessayer dans %minutes% minute.</target>
</trans-unit>
<trans-unit id="AJR3lMs" resname="Too many failed login attempts, please try again in %minutes% minutes.">
<source>Too many failed login attempts, please try again in %minutes% minutes.</source>
<target>Plusieurs tentatives de connexion ont échoué, veuillez réessayer dans %minutes% minutes.</target>
</trans-unit>
<trans-unit id="Hd9NYNq" resname="login.unknown.planner">
<source>login.unknown.planner</source>
<target>Le compte n'existe pas.</target>