Verified Commit 0fadece2 authored by Hugo's avatar Hugo
Browse files

fusion login styles and templates

parent 6ff56160
Pipeline #667 passed with stage
in 19 seconds
embed-server --std-out=echo --server-config=standalone-ha.xml
embed-server --std-out=echo --server-config=standalone.xml
/subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheThemes,value=false)
/subsystem=keycloak-server/theme=defaults/:write-attribute(name=cacheTemplates,value=false)
/subsystem=keycloak-server/theme=defaults/:write-attribute(name=staticMaxAge,value=-1)
......
<#import "template.ftl" as layout>
<@layout.registrationLayout; section>
<#if section = "header">
${msg("registerTitle")}
<#elseif section = "form">
<form id="kc-register-form" class="${properties.kcFormClass!}" action="${url.registrationAction}" method="post">
<div class="${properties.kcFormGroupClass!} ${messagesPerField.printIfExists('firstName',properties.kcFormGroupErrorClass!)}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="firstName" class="${properties.kcLabelClass!}">${msg("firstName")}</label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="text" id="firstName" class="${properties.kcInputClass!}" name="firstName" value="${(register.formData.firstName!'')}" placeholder="${msg("firstNamePlaceholder")}"/>
</div>
</div>
<div class="${properties.kcFormGroupClass!} ${messagesPerField.printIfExists('lastName',properties.kcFormGroupErrorClass!)}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="lastName" class="${properties.kcLabelClass!}">${msg("lastName")}</label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="text" id="lastName" class="${properties.kcInputClass!}" name="lastName" value="${(register.formData.lastName!'')}" placeholder="${msg("lastNamePlaceholder")}"/>
</div>
</div>
<div class="${properties.kcFormGroupClass!} ${messagesPerField.printIfExists('email',properties.kcFormGroupErrorClass!)}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="email" class="${properties.kcLabelClass!}">${msg("email")}</label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="text" id="email" class="${properties.kcInputClass!}" name="email" value="${(register.formData.email!'')}" autocomplete="email" placeholder="${msg("emailPlaceholder")}"/>
</div>
</div>
<#if !realm.registrationEmailAsUsername>
<div class="${properties.kcFormGroupClass!} ${messagesPerField.printIfExists('username',properties.kcFormGroupErrorClass!)}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="username" class="${properties.kcLabelClass!}">${msg("username")}</label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="text" id="username" class="${properties.kcInputClass!}" name="username" value="${(register.formData.username!'')}" autocomplete="username" placeholder="${msg("usernamePlaceholder")}"/>
</div>
</div>
</#if>
<#if passwordRequired??>
<div class="${properties.kcFormGroupClass!} ${messagesPerField.printIfExists('password',properties.kcFormGroupErrorClass!)}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="password" class="${properties.kcLabelClass!}">${msg("password")}</label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="password" id="password" class="${properties.kcInputClass!}" name="password" autocomplete="new-password"/>
</div>
</div>
<div class="${properties.kcFormGroupClass!} ${messagesPerField.printIfExists('password-confirm',properties.kcFormGroupErrorClass!)}">
<div class="${properties.kcLabelWrapperClass!}">
<label for="password-confirm" class="${properties.kcLabelClass!}">${msg("passwordConfirm")}</label>
</div>
<div class="${properties.kcInputWrapperClass!}">
<input type="password" id="password-confirm" class="${properties.kcInputClass!}" name="password-confirm" />
</div>
</div>
</#if>
<#if recaptchaRequired??>
<div class="form-group">
<div class="${properties.kcInputWrapperClass!}">
<div class="g-recaptcha" data-size="compact" data-sitekey="${recaptchaSiteKey}"></div>
</div>
</div>
</#if>
<div class="${properties.kcFormGroupClass!}">
<div id="kc-form-options" class="${properties.kcFormOptionsClass!}">
<div class="${properties.kcFormOptionsWrapperClass!}">
<span><a href="${url.loginUrl}">${kcSanitize(msg("backToLogin"))?no_esc}</a></span>
</div>
</div>
<div id="kc-form-buttons" class="${properties.kcFormButtonsClass!}">
<input class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonBlockClass!} ${properties.kcButtonLargeClass!}" type="submit" value="${msg("doRegister")}"/>
</div>
</div>
</form>
</#if>
</@layout.registrationLayout>
:root {
--main-color: #3f6f9a; /* zwo dark blue */
--second-color: #000; /* zwo orange */
--third-color: #5db9d3; /* zwo ligther blue */
--hover-color: #0f4c81; /* zwo blue green */
--main-color: #3f6f9a; /* zwo dark blue */
--second-color: #000; /* zwo orange */
--third-color: #5db9d3; /* zwo ligther blue */
--hover-color: #0f4c81; /* zwo blue green */
--grey: #72767b;
}
a {
color: var(--main-color);
text-decoration:none
}
$a:focus,
a:hover {
color:var(--hover-color);
text-decoration:underline
}
body {
font-size: 15px;
}
.alert {
border-radius: 3px;
}
.login-pf {
background: url("../img/backgroud.jpg"), #f2f2f2;
background-position: center center, left top;
background-size: 85%, 80%;
background-repeat: repeat;
}
.login-pf body {
background: none;
}
.card-pf {
border-radius: 1rem;
box-shadow: 0px 0px 0px 5px var(--second-color);
background: url("../img/backgroud.jpg"), #f2f2f2;
background-repeat: repeat;
}
#kc-header-wrapper {
color: var(--main-color);
}
#kc-header-wrapper a:hover {
text-decoration: none;
color: var(--hover-color);
}
#kc-info-wrapper {
font-size: 14px;
}
h1 {
color: rgba(0, 0, 0, 0.8);
}
.form-control {
border: 2px solid #bbb;
border-top:none;
border-left: none;
border-right: none;
border-radius: 3px;
font-size: 14px;
}
.form-control:focus {
border-color:var(--main-color);
outline:0;
box-shadow:inset 0px 0px 2px 0px var(--main-color)
}
#kc-form-options .checkbox {
margin-top: 0;
color: var(--grey);
}
.btn {
font-size: 15px;
}
.btn-primary {
background-color:var(--main-color);
border-color:var(--main-color);
color:#fff;
border-radius: 2px;
background-image: none;
}
.btn-primary.active,
.btn-primary:active,
.btn-primary:focus,
.btn-primary:hover,
.open .dropdown-toggle.btn-primary {
background-color:var(--hover-color);
background-image:none;
border-color:var(--hover-color);
color:#fff
}
.btn-primary.active.focus,
.btn-primary.active:focus,
.btn-primary.active:hover,
.btn-primary:active.focus,
.btn-primary:active:focus,
.btn-primary:active:hover,
.open .dropdown-toggle.btn-primary.focus,
.open .dropdown-toggle.btn-primary:focus,
.open .dropdown-toggle.btn-primary:hover {
background-color:var(--hover-color);
border-color:var(--hover-color);
}
.btn-primary.disabled,
.btn-primary.disabled.active,
.btn-primary.disabled:active,
.btn-primary.disabled:focus,
.btn-primary.disabled:hover,
.btn-primary[disabled],
.btn-primary[disabled].active,
.btn-primary[disabled]:active,
.btn-primary[disabled]:focus,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary,
fieldset[disabled] .btn-primary.active,
fieldset[disabled] .btn-primary:active,
fieldset[disabled] .btn-primary:focus,
fieldset[disabled] .btn-primary:hover {
background-color: var(--third-color);
border-color:var(--third-color);
}
#kc-locale ul {
border:none;
}
#kc-locale ul li a {
border-bottom: solid 1px #bbb;
border-radius: 3px;
}
#kc-locale ul li a:hover {
color: #fff !important;
background-color: var(--main-color);
margin-bottom: -2rem;
}
.logo {
margin-bottom: -2rem;
#kc-header-wrapper img {
height: 300px;
}
<#macro registrationLayout bodyClass="" displayInfo=false displayMessage=true displayRequiredFields=false displayWide=false showAnotherWayIfPresent=true>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="${properties.kcHtmlClass!}">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="robots" content="noindex, nofollow">
<#if properties.meta?has_content>
<#list properties.meta?split(' ') as meta>
<meta name="${meta?split('==')[0]}" content="${meta?split('==')[1]}"/>
</#list>
</#if>
<title>${msg("loginTitle",(realm.displayName!''))}</title>
<link rel="icon" href="${url.resourcesPath}/img/favicon.ico" />
<#if properties.styles?has_content>
<#list properties.styles?split(' ') as style>
<link href="${url.resourcesPath}/${style}" rel="stylesheet" />
</#list>
</#if>
<#if properties.scripts?has_content>
<#list properties.scripts?split(' ') as script>
<script src="${url.resourcesPath}/${script}" type="text/javascript"></script>
</#list>
</#if>
<#if scripts??>
<#list scripts as script>
<script src="${script}" type="text/javascript"></script>
</#list>
</#if>
</head>
<body class="${properties.kcBodyClass!}">
<div class="${properties.kcLoginClass!}">
<div id="kc-header" class="${properties.kcHeaderClass!}">
<div id="kc-header-wrapper" class="logo ${properties.kcHeaderWrapperClass!}">
<a href="${url.loginUrl}">
<img style="height:300px;" src="${url.resourcesPath}/img/logo.svg"/>
</a>
</div>
</div>
<div class="${properties.kcFormCardClass!} <#if displayWide>${properties.kcFormCardAccountClass!}</#if>">
<header class="${properties.kcFormHeaderClass!}">
<#if realm.internationalizationEnabled && locale.supported?size gt 1>
<div id="kc-locale">
<div id="kc-locale-wrapper" class="${properties.kcLocaleWrapperClass!}">
<div class="kc-dropdown" id="kc-locale-dropdown">
<a href="#" id="kc-current-locale-link">${locale.current}</a>
<ul>
<#list locale.supported as l>
<li class="kc-dropdown-item"><a href="${l.url}">${l.label}</a></li>
</#list>
</ul>
</div>
</div>
</div>
</#if>
<#if !(auth?has_content && auth.showUsername() && !auth.showResetCredentials())>
<#if displayRequiredFields>
<div class="${properties.kcContentWrapperClass!}">
<div class="${properties.kcLabelWrapperClass!} subtitle">
<span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
</div>
<div class="col-md-10">
<h1 id="kc-page-title"><#nested "header"></h1>
</div>
</div>
<#else>
<h1 id="kc-page-title"><#nested "header"></h1>
</#if>
<#else>
<#if displayRequiredFields>
<div class="${properties.kcContentWrapperClass!}">
<div class="${properties.kcLabelWrapperClass!} subtitle">
<span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
</div>
<div class="col-md-10">
<#nested "show-username">
<div class="${properties.kcFormGroupClass!}">
<div id="kc-username">
<label id="kc-attempted-username">${auth.attemptedUsername}</label>
<a id="reset-login" href="${url.loginRestartFlowUrl}">
<div class="kc-login-tooltip">
<i class="${properties.kcResetFlowIcon!}"></i>
<span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span>
</div>
</a>
</div>
</div>
</div>
</div>
<#else>
<#nested "show-username">
<div class="${properties.kcFormGroupClass!}">
<div id="kc-username">
<label id="kc-attempted-username">${auth.attemptedUsername}</label>
<a id="reset-login" href="${url.loginRestartFlowUrl}">
<div class="kc-login-tooltip">
<i class="${properties.kcResetFlowIcon!}"></i>
<span class="kc-tooltip-text">${msg("restartLoginTooltip")}</span>
</div>
</a>
</div>
</div>
</#if>
</#if>
</header>
<div id="kc-content">
<div id="kc-content-wrapper">
<#-- App-initiated actions should not see warning messages about the need to complete the action -->
<#-- during login. -->
<#if displayMessage && message?has_content && (message.type != 'warning' || !isAppInitiatedAction??)>
<div class="alert alert-${message.type}">
<#if message.type = 'success'><span class="${properties.kcFeedbackSuccessIcon!}"></span></#if>
<#if message.type = 'warning'><span class="${properties.kcFeedbackWarningIcon!}"></span></#if>
<#if message.type = 'error'><span class="${properties.kcFeedbackErrorIcon!}"></span></#if>
<#if message.type = 'info'><span class="${properties.kcFeedbackInfoIcon!}"></span></#if>
<span class="kc-feedback-text">${kcSanitize(message.summary)?no_esc}</span>
</div>
</#if>
<#nested "form">
<#if auth?has_content && auth.showTryAnotherWayLink() && showAnotherWayIfPresent>
<form id="kc-select-try-another-way-form" action="${url.loginAction}" method="post" <#if displayWide>class="${properties.kcContentWrapperClass!}"</#if>>
<div <#if displayWide>class="${properties.kcFormSocialAccountContentClass!} ${properties.kcFormSocialAccountClass!}"</#if>>
<div class="${properties.kcFormGroupClass!}">
<input type="hidden" name="tryAnotherWay" value="on" />
<a href="#" id="try-another-way" onclick="document.forms['kc-select-try-another-way-form'].submit();return false;">${msg("doTryAnotherWay")}</a>
</div>
</div>
</form>
</#if>
<#if displayInfo>
<div id="kc-info" class="${properties.kcSignUpClass!}">
<div id="kc-info-wrapper" class="${properties.kcInfoAreaWrapperClass!}">
<#nested "info">
</div>
</div>
</#if>
</div>
</div>
En cliquant sur Connexion, vous accéptez <a href="https://www.cfamederic.com/charte-usage-tic/">la chart d'usages des Outils numériques</a> et la <a href="https://www.cfamederic.com/politique-confidentialite/">politique de confidentialité</a>.
</div>
</div>
</body>
</html>
</#macro>
parent=liiibre
locales=en,fr
styles=node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css lib/zocial/zocial.css css/login.css css/style.css
styles=node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css lib/zocial/zocial.css css/login.css css/liiibre.css css/style.css
meta=viewport==width=device-width,initial-scale=1
logo=logo.svg
cgu=En cliquant sur Connexion, vous acc&eacute;ptez <a href="https://www.cfamederic.com/charte-usage-tic/">la chart d'usages des Outils num&eacute;riques</a> et la <a href="https://www.cfamederic.com/politique-confidentialite/">politique de confidentialit&eacute;</a>.
doLogIn=Se connecter
doRegister=Créer un nouveau compte
loginAccountTitle=Se connecter
doRegister=Cr\u00e9er un nouveau compte
doRegisterNow=Confirmer l''inscription
doCancel=Annuler
doSubmit=Soumettre
doYes=Oui
doNo=Non
doContinue=Continuer
doIgnore=Ignorer
doAccept=Accepter
doDecline=D\u00e9cliner
doForgotPassword=Mot de passe oubli\u00e9 ?
doClickHere=Cliquez ici
doImpersonate=Impersonate
kerberosNotConfigured=Kerberos non configur\u00e9
kerberosNotConfiguredTitle=Kerberos non configur\u00e9
bypassKerberosDetail=Si vous n''\u00eates pas connect\u00e9 via Kerberos ou bien que votre navigateur n''est pas configur\u00e9 pour la connexion via Kerberos. Veuillez cliquer pour vous connecter via un autre moyen.
kerberosNotSetUp=Kerberos n''est pas configur\u00e9. Connexion impossible.
registerTitle=Cr\u00e9er un nouveau compte
registerWithTitle=Enregistrement avec {0}
registerWithTitleHtml={0}
loginTitle=Se connecter \u00e0 {0}
loginTitleHtml={0}
impersonateTitle={0} utilisateur impersonate
impersonateTitleHtml=<strong>{0}</strong> utilisateur impersonate
realmChoice=Domaine
unknownUser=Utilisateur inconnu
loginTotpTitle=Configuration de l''authentification par mobile
loginProfileTitle=Mise \u00e0 jour du compte
loginTimeout=Le temps imparti pour la connexion est \u00e9coul\u00e9. Le processus de connexion red\u00e9marre depuis le d\u00e9but.
oauthGrantTitle=OAuth Grant
oauthGrantTitleHtml={0}
errorTitle=Nous sommes d\u00e9sol\u00e9s...
errorTitleHtml=Nous sommes <strong>d\u00e9sol\u00e9s</strong>...
emailVerifyTitle=V\u00e9rification du courriel
emailForgotTitle=Mot de passe oubli\u00e9 ?
updatePasswordTitle=Mise \u00e0 jour du mot de passe
codeSuccessTitle=Code succ\u00e8s
codeErrorTitle=Code d''erreur \: {0}
displayUnsupported=Type d''affichage demand\u00e9 non support\u00e9
browserRequired=Navigateur requis pour se connecter
browserContinue=Navigateur requis pour continuer la connexion
browserContinuePrompt=Ouvrir le navigateur et continuer la connexion? [y/n]:
browserContinueAnswer=y
termsTitle=Termes et Conditions
termsTitleHtml=Termes et Conditions
termsText=<p>Termes et conditions \u00e0 d\u00e9finir</p>
termsPlainText=Termes et conditions \u00e0 d\u00e9finir
recaptchaFailed=Re-captcha invalide
recaptchaNotConfigured=Re-captcha est requis, mais il n''est pas configur\u00e9
consentDenied=Consentement refus\u00e9.
noAccount=Vous venez d''arriver ?
username=Pseudo
usernameOrEmail=Pseudo ou courriel
firstName=Pr\u00e9nom
givenName=Pr\u00e9nom
fullName=Nom complet
lastName=Nom
familyName=Nom de famille
email=Courriel
password=Mot de passe
passwordConfirm=Confirmation du mot de passe
passwordNew=Nouveau mot de passe
passwordNewConfirm=Confirmation du nouveau mot de passe
rememberMe=Se souvenir de moi
authenticatorCode=Code \u00e0 usage unique
address=Adresse
street=Rue
locality=Ville ou Localit\u00e9
region=\u00c9tat, Province ou R\u00e9gion
postal_code=Code postal
country=Pays
emailVerified=Courriel v\u00e9rifi\u00e9
gssDelegationCredential=Accr\u00e9ditation de d\u00e9l\u00e9gation GSS
usernamePlaceholder=CamilleLila
usernameHelper=C''est ainsi que les autres membres pourront vous identifier. Attention ce choix est d\u00e9finitif, il est recommand\u00e9 d''opter pour un pseudo sous la forme ''prenomnom''.
firstNamePlaceholder=Camille
lastNamePlaceholder=Lila
emailPlaceholder=c.lila@mail.com
loginTotpIntro=Il est n\u00e9cessaire de configurer un g\u00e9n\u00e9rateur One Time Password pour acc\u00e9der \u00e0 ce compte
loginTotpStep1=Installez <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> ou bien Google Authenticator sur votre mobile. Ces deux applications sont disponibles sur <a href="https://play.google.com">Google Play</a> et Apple App Store.
loginTotpStep2=Ouvrez l''application et scannez le code-barres ou entrez la clef.
loginTotpStep3=Entrez le code \u00e0 usage unique fourni par l''application et cliquez sur Sauvegarder pour terminer.
loginTotpManualStep2=Ouvrez l''application et saisissez la cl\u00e9
loginTotpManualStep3=Utilisez la configuration de valeur suivante si l''application permet son \u00e9dition
loginTotpUnableToScan=Impossible de scanner?
loginTotpScanBarcode=Scanner le code barre ?
loginOtpOneTime=Code \u00e0 usage unique
loginTotpType=Type
loginTotpAlgorithm=Algorithme
loginTotpDigits=Chiffres
loginTotpInterval=Intervalle
loginTotpCounter=Compteur
loginTotp.totp=Bas\u00e9 sur le temps
loginTotp.hotp=Bas\u00e9 sur les compteurs
oauthGrantRequest=Voulez-vous accorder ces privil\u00e8ges d''acc\u00e8s ?
inResource=dans
emailVerifyInstruction1=Un courriel avec des instructions \u00e0 suivre vous a \u00e9t\u00e9 envoy\u00e9.
emailVerifyInstruction2=Vous n''avez pas re\u00e7u de code dans le courriel ?
emailVerifyInstruction3=pour renvoyer le courriel.
emailLinkIdpTitle=Association avec {0}
emailLinkIdp1=Un courriel avec des instructions pour associer le compte {1} sur {0} avec votre compte {2} vous a \u00e9t\u00e9 envoy\u00e9.
emailLinkIdp2=Vous n''avez pas re\u00e7u de code dans le courriel ?
emailLinkIdp3=pour renvoyer le courriel.
emailLinkIdp4=Si vous avez d\u00e9j\u00e0 v\u00e9rifi\u00e9 votre courriel dans un autre navigateur
emailLinkIdp5=pour continuer.
backToLogin=&laquo; Retour \u00e0 la connexion
emailInstruction=Pas de panique. Entrez votre nom pseudo ou votre courriel ; un courriel va vous \u00eatre envoy\u00e9 pour cr\u00e9er un nouveau mot de passe.
copyCodeInstruction=Copiez le code et recopiez le dans votre application :
pageExpiredTitle=La page a expir\u00e9
pageExpiredMsg1=Pour recommencer le processus d''authentification
pageExpiredMsg2=Pour continuer le processus d''authentification
personalInfo=Information personnelle :
role_admin=Administrateur
role_realm-admin=Administrateur du domaine
role_create-realm=Cr\u00e9er un domaine
role_create-client=Cr\u00e9er un client
role_view-realm=Voir un domaine
role_view-users=Voir les utilisateurs
role_view-applications=Voir les applications
role_view-clients=Voir les clients
role_view-events=Voir les \u00e9v\u00e9nements
role_view-identity-providers=Voir les fournisseurs d''identit\u00e9
role_manage-realm=G\u00e9rer le domaine
role_manage-users=G\u00e9rer les utilisateurs
role_manage-applications=G\u00e9rer les applications
role_manage-identity-providers=G\u00e9rer les fournisseurs d''identit\u00e9
role_manage-clients=G\u00e9rer les clients
role_manage-events=G\u00e9rer les \u00e9v\u00e9nements
role_view-profile=Voir le profil
role_manage-account=G\u00e9rer le compte
role_manage-account-links=G\u00e9rer les liens de compte
role_read-token=Lire le jeton d''authentification
role_offline-access=Acc\u00e8s hors-ligne
client_account=Compte
client_security-admin-console=Console d''administration de la s\u00e9curit\u00e9
client_admin-cli=Admin CLI
client_realm-management=Gestion du domaine
client_broker=Broker
invalidUserMessage=Pseudo ou mot de passe invalide.
invalidEmailMessage=Courriel invalide.
accountDisabledMessage=Compte d\u00e9sactiv\u00e9, contactez votre administrateur.
accountTemporarilyDisabledMessage=Ce compte est temporairement d\u00e9sactiv\u00e9, contactez votre administrateur ou bien r\u00e9essayez plus tard.
expiredCodeMessage=Connexion expir\u00e9e. Veuillez vous reconnecter.
expiredActionMessage=Action expir\u00e9e. Merci de continuer la connexion.
expiredActionTokenNoSessionMessage=Action expir\u00e9e.
expiredActionTokenSessionExistsMessage=Action expir\u00e9e. Merci de recommencer.
missingFirstNameMessage=Veuillez entrer votre pr\u00e9nom.
missingLastNameMessage=Veuillez entrer votre nom.
missingEmailMessage=Veuillez entrer votre courriel.
missingUsernameMessage=Veuillez entrer votre pseudo.
missingPasswordMessage=Veuillez entrer votre mot de passe.
missingTotpMessage=Veuillez entrer votre code d''authentification.
notMatchPasswordMessage=Les mots de passe ne sont pas identiques.
invalidPasswordExistingMessage=Mot de passe existant invalide.
invalidPasswordBlacklistedMessage=Mot de passe invalide : ce mot de passe est blacklist\u00e9.
invalidPasswordConfirmMessage=Le mot de passe de confirmation ne correspond pas.
invalidTotpMessage