aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Magorsch <arzano@gentoo.org>2020-05-22 16:57:43 +0200
committerMax Magorsch <arzano@gentoo.org>2020-05-22 16:57:43 +0200
commita005ba8e29ff68950bc6b9c93898ddb34fb25d60 (patch)
tree24e4051efc3e19c04095aa0ce3695c5c7dd43110 /account
downloadtyrian-keycloak-theme-a005ba8e29ff68950bc6b9c93898ddb34fb25d60.tar.gz
tyrian-keycloak-theme-a005ba8e29ff68950bc6b9c93898ddb34fb25d60.tar.bz2
tyrian-keycloak-theme-a005ba8e29ff68950bc6b9c93898ddb34fb25d60.zip
Initial version of the theme
Please note that this is currently still a WIP and likely to change a lot in future. Signed-off-by: Max Magorsch <arzano@gentoo.org>
Diffstat (limited to 'account')
-rw-r--r--account/account.ftl70
-rw-r--r--account/applications.ftl76
-rw-r--r--account/federatedIdentity.ftl42
-rw-r--r--account/log.ftl35
-rw-r--r--account/messages/messages_ca.properties147
-rw-r--r--account/messages/messages_de.properties169
-rw-r--r--account/messages/messages_en.properties358
-rw-r--r--account/messages/messages_es.properties147
-rw-r--r--account/messages/messages_fr.properties166
-rw-r--r--account/messages/messages_it.properties153
-rw-r--r--account/messages/messages_ja.properties352
-rw-r--r--account/messages/messages_lt.properties154
-rw-r--r--account/messages/messages_nl.properties133
-rw-r--r--account/messages/messages_no.properties165
-rw-r--r--account/messages/messages_pl.properties1
-rw-r--r--account/messages/messages_pt_BR.properties149
-rw-r--r--account/messages/messages_ru.properties155
-rw-r--r--account/messages/messages_sk.properties196
-rw-r--r--account/messages/messages_sv.properties150
-rw-r--r--account/messages/messages_tr.properties341
-rw-r--r--account/messages/messages_zh_CN.properties166
-rw-r--r--account/password.ftl59
-rw-r--r--account/resource-detail.ftl277
-rw-r--r--account/resources.ftl399
-rw-r--r--account/sessions.ftl44
-rw-r--r--account/template.ftl83
-rw-r--r--account/theme.properties1
-rw-r--r--account/totp.ftl141
28 files changed, 4329 insertions, 0 deletions
diff --git a/account/account.ftl b/account/account.ftl
new file mode 100644
index 0000000..9254b96
--- /dev/null
+++ b/account/account.ftl
@@ -0,0 +1,70 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='account' bodyClass='user'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("editAccountHtmlTitle")}</h2>
+ </div>
+ <div class="col-md-2 subtitle">
+ <span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
+ </div>
+ </div>
+
+ <form action="${url.accountUrl}" class="form-horizontal" method="post">
+
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+
+ <#if !realm.registrationEmailAsUsername>
+ <div class="form-group ${messagesPerField.printIfExists('username','has-error')}">
+ <div class="col-sm-2 col-md-2">
+ <label for="username" class="control-label">${msg("username")}</label> <#if realm.editUsernameAllowed><span class="required">*</span></#if>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="username" name="username" <#if !realm.editUsernameAllowed>disabled="disabled"</#if> value="${(account.username!'')}"/>
+ </div>
+ </div>
+ </#if>
+
+ <div class="form-group ${messagesPerField.printIfExists('email','has-error')}">
+ <div class="col-sm-2 col-md-2">
+ <label for="email" class="control-label">${msg("email")}</label> <span class="required">*</span>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="email" name="email" autofocus value="${(account.email!'')}"/>
+ </div>
+ </div>
+
+ <div class="form-group ${messagesPerField.printIfExists('firstName','has-error')}">
+ <div class="col-sm-2 col-md-2">
+ <label for="firstName" class="control-label">${msg("firstName")}</label> <span class="required">*</span>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="firstName" name="firstName" value="${(account.firstName!'')}"/>
+ </div>
+ </div>
+
+ <div class="form-group ${messagesPerField.printIfExists('lastName','has-error')}">
+ <div class="col-sm-2 col-md-2">
+ <label for="lastName" class="control-label">${msg("lastName")}</label> <span class="required">*</span>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="lastName" name="lastName" value="${(account.lastName!'')}"/>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div id="kc-form-buttons" class="col-md-offset-2 col-md-10 submit">
+ <div class="">
+ <#if url.referrerURI??><a href="${url.referrerURI}">${kcSanitize(msg("backToApplication")?no_esc)}</a></#if>
+ <button type="submit" class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}" name="submitAction" value="Save">${msg("doSave")}</button>
+ <button type="submit" class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonLargeClass!}" name="submitAction" value="Cancel">${msg("doCancel")}</button>
+ </div>
+ </div>
+ </div>
+ </form>
+
+</@layout.mainLayout>
diff --git a/account/applications.ftl b/account/applications.ftl
new file mode 100644
index 0000000..a8edc38
--- /dev/null
+++ b/account/applications.ftl
@@ -0,0 +1,76 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='applications' bodyClass='applications'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("applicationsHtmlTitle")}</h2>
+ </div>
+ </div>
+
+ <form action="${url.applicationsUrl}" method="post">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <input type="hidden" id="referrer" name="referrer" value="${stateChecker}">
+
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <td>${msg("application")}</td>
+ <td>${msg("availableRoles")}</td>
+ <td>${msg("grantedPermissions")}</td>
+ <td>${msg("additionalGrants")}</td>
+ <td>${msg("action")}</td>
+ </tr>
+ </thead>
+
+ <tbody>
+ <#list applications.applications as application>
+ <tr>
+ <td>
+ <#if application.effectiveUrl?has_content><a href="${application.effectiveUrl}"></#if>
+ <#if application.client.name?has_content>${advancedMsg(application.client.name)}<#else>${application.client.clientId}</#if>
+ <#if application.effectiveUrl?has_content></a></#if>
+ </td>
+
+ <td>
+ <#list application.realmRolesAvailable as role>
+ <#if role.description??>${advancedMsg(role.description)}<#else>${advancedMsg(role.name)}</#if>
+ <#if role_has_next>, </#if>
+ </#list>
+ <#list application.resourceRolesAvailable?keys as resource>
+ <#if application.realmRolesAvailable?has_content>, </#if>
+ <#list application.resourceRolesAvailable[resource] as clientRole>
+ <#if clientRole.roleDescription??>${advancedMsg(clientRole.roleDescription)}<#else>${advancedMsg(clientRole.roleName)}</#if>
+ ${msg("inResource")} <strong><#if clientRole.clientName??>${advancedMsg(clientRole.clientName)}<#else>${clientRole.clientId}</#if></strong>
+ <#if clientRole_has_next>, </#if>
+ </#list>
+ </#list>
+ </td>
+
+ <td>
+ <#if application.client.consentRequired>
+ <#list application.clientScopesGranted as claim>
+ ${advancedMsg(claim)}<#if claim_has_next>, </#if>
+ </#list>
+ <#else>
+ <strong>${msg("fullAccess")}</strong>
+ </#if>
+ </td>
+
+ <td>
+ <#list application.additionalGrants as grant>
+ ${advancedMsg(grant)}<#if grant_has_next>, </#if>
+ </#list>
+ </td>
+
+ <td>
+ <#if (application.client.consentRequired && application.clientScopesGranted?has_content) || application.additionalGrants?has_content>
+ <button type='submit' class='${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!}' id='revoke-${application.client.clientId}' name='clientId' value="${application.client.id}">${msg("revoke")}</button>
+ </#if>
+ </td>
+ </tr>
+ </#list>
+ </tbody>
+ </table>
+ </form>
+
+</@layout.mainLayout> \ No newline at end of file
diff --git a/account/federatedIdentity.ftl b/account/federatedIdentity.ftl
new file mode 100644
index 0000000..c2eb769
--- /dev/null
+++ b/account/federatedIdentity.ftl
@@ -0,0 +1,42 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='social' bodyClass='social'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("federatedIdentitiesHtmlTitle")}</h2>
+ </div>
+ </div>
+
+ <div id="federated-identities">
+ <#list federatedIdentity.identities as identity>
+ <div class="row margin-bottom">
+ <div class="col-sm-2 col-md-2">
+ <label for="${identity.providerId!}" class="control-label">${identity.displayName!}</label>
+ </div>
+ <div class="col-sm-5 col-md-5">
+ <input disabled="true" class="form-control" value="${identity.userName!}">
+ </div>
+ <div class="col-sm-5 col-md-5">
+ <#if identity.connected>
+ <#if federatedIdentity.removeLinkPossible>
+ <form action="${url.socialUrl}" method="post" class="form-inline">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <input type="hidden" id="action" name="action" value="remove">
+ <input type="hidden" id="providerId" name="providerId" value="${identity.providerId!}">
+ <button id="remove-link-${identity.providerId!}" class="btn btn-default">${msg("doRemove")}</button>
+ </form>
+ </#if>
+ <#else>
+ <form action="${url.socialUrl}" method="post" class="form-inline">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <input type="hidden" id="action" name="action" value="add">
+ <input type="hidden" id="providerId" name="providerId" value="${identity.providerId!}">
+ <button id="add-link-${identity.providerId!}" class="btn btn-default">${msg("doAdd")}</button>
+ </form>
+ </#if>
+ </div>
+ </div>
+ </#list>
+ </div>
+
+</@layout.mainLayout>
diff --git a/account/log.ftl b/account/log.ftl
new file mode 100644
index 0000000..29046cf
--- /dev/null
+++ b/account/log.ftl
@@ -0,0 +1,35 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='log' bodyClass='log'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("accountLogHtmlTitle")}</h2>
+ </div>
+ </div>
+
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <td>${msg("date")}</td>
+ <td>${msg("event")}</td>
+ <td>${msg("ip")}</td>
+ <td>${msg("client")}</td>
+ <td>${msg("details")}</td>
+ </tr>
+ </thead>
+
+ <tbody>
+ <#list log.events as event>
+ <tr>
+ <td>${event.date?datetime}</td>
+ <td>${event.event}</td>
+ <td>${event.ipAddress}</td>
+ <td>${event.client!}</td>
+ <td><#list event.details as detail>${detail.key} = ${detail.value} <#if detail_has_next>, </#if></#list></td>
+ </tr>
+ </#list>
+ </tbody>
+
+ </table>
+
+</@layout.mainLayout> \ No newline at end of file
diff --git a/account/messages/messages_ca.properties b/account/messages/messages_ca.properties
new file mode 100644
index 0000000..a1b8f91
--- /dev/null
+++ b/account/messages/messages_ca.properties
@@ -0,0 +1,147 @@
+doSave=Desa
+doCancel=Cancel\u00B7la
+doLogOutAllSessions=Desconnecta de totes les sessions
+doRemove=Elimina
+doAdd=Afegeix
+doSignOut=Desconnectar
+
+editAccountHtmlTitle=Edita compte
+federatedIdentitiesHtmlTitle=Identitats federades
+accountLogHtmlTitle=Registre del compte
+changePasswordHtmlTitle=Canvia contrasenya
+sessionsHtmlTitle=Sessions
+accountManagementTitle=Gesti\u00F3 de Compte Keycloak
+authenticatorTitle=Autenticador
+applicationsHtmlTitle=Aplicacions
+
+authenticatorCode=Codi d''un sol \u00FAs
+email=Email
+firstName=Nom
+givenName=Nom de pila
+fullName=Nom complet
+lastName=Cognoms
+familyName=Cognom
+password=Contrasenya
+passwordConfirm=Confirma la contrasenya
+passwordNew=Nova contrasenya
+username=Usuari
+address=Adre\u00E7a
+street=Carrer
+locality=Ciutat o Municipi
+region=Estat, Prov\u00EDncia, o Regi\u00F3
+postal_code=Postal code
+country=Pa\u00EDs
+emailVerified=Email verificat
+gssDelegationCredential=GSS Delegation Credential
+
+role_admin=Administrador
+role_realm-admin=Administrador del domini
+role_create-realm=Crear domini
+role_view-realm=Veure domini
+role_view-users=Veure usuaris
+role_view-applications=Veure aplicacions
+role_view-clients=Veure clients
+role_view-events=Veure events
+role_view-identity-providers=Veure prove\u00EFdors d''identitat
+role_manage-realm=Gestionar domini
+role_manage-users=Gestinar usuaris
+role_manage-applications=Gestionar aplicacions
+role_manage-identity-providers=Gestionar prove\u00EFdors d''identitat
+role_manage-clients=Gestionar clients
+role_manage-events=Gestionar events
+role_view-profile=Veure perfil
+role_manage-account=Gestionar compte
+role_read-token=Llegir token
+role_offline-access=Acc\u00E9s sense connexi\u00F3
+client_account=Compte
+client_security-admin-console=Consola d''Administraci\u00F3 de Seguretat
+client_realm-management=Gesti\u00F3 de domini
+client_broker=Broker
+
+
+requiredFields=Camps obligatoris
+allFieldsRequired=Tots els camps obligatoris
+
+backToApplication=&laquo; Torna a l''aplicaci\u00F3
+backTo=Torna a {0}
+
+date=Data
+event=Event
+ip=IP
+client=Client
+clients=Clients
+details=Detalls
+started=Iniciat
+lastAccess=\u00DAltim acc\u00E9s
+expires=Expira
+applications=Aplicacions
+
+account=Compte
+federatedIdentity=Identitat federada
+authenticator=Autenticador
+sessions=Sessions
+log=Registre
+
+application=Aplicaci\u00F3
+availablePermissions=Permisos disponibles
+grantedPermissions=Permisos concedits
+grantedPersonalInfo=Informaci\u00F3 personal concedida
+additionalGrants=Permisos addicionals
+action=Acci\u00F3
+inResource=a
+fullAccess=Acc\u00E9s total
+offlineToken=Codi d''autoritzaci\u00F3 offline
+revoke=Revocar perm\u00EDs
+
+configureAuthenticators=Autenticadors configurats
+mobile=M\u00F2bil
+totpStep1=Instal\u00B7la <a href=\"https://freeotp.github.io/\" target=\"_blank\">FreeOTP</a> o Google Authenticator al teu tel\u00E8fon m\u00F2bil. Les dues aplicacions estan disponibles a <a href=\"https://play.google.com\">Google Play</a> i en l''App Store d''Apple.
+totpStep2=Obre l''aplicaci\u00F3 i escaneja el codi o introdueix la clau.
+totpStep3=Introdueix el codi \u00FAnic que et mostra l''aplicaci\u00F3 d''autenticaci\u00F3 i fes clic a Envia per finalitzar la configuraci\u00F3
+
+missingUsernameMessage=Si us plau indica el teu usuari.
+missingFirstNameMessage=Si us plau indica el nom.
+invalidEmailMessage=Email no v\u00E0lid
+missingLastNameMessage=Si us plau indica els teus cognoms.
+missingEmailMessage=Si us plau indica l''email.
+missingPasswordMessage=Si us plau indica la contrasenya.
+notMatchPasswordMessage=Les contrasenyes no coincideixen.
+
+missingTotpMessage=Si us plau indica el teu codi d''autenticaci\u00F3
+invalidPasswordExistingMessage=La contrasenya actual no \u00E9s correcta.
+invalidPasswordConfirmMessage=La confirmaci\u00F3 de contrasenya no coincideix.
+invalidTotpMessage=El c\u00F3digo de autenticaci\u00F3n no es v\u00E1lido.
+
+usernameExistsMessage=L''usuari ja existeix
+emailExistsMessage=L''email ja existeix
+
+readOnlyUserMessage=No pots actualitzar el teu usuari perqu\u00E8 el teu compte \u00E9s de nom\u00E9s lectura.
+readOnlyPasswordMessage=No pots actualitzar la contrasenya perqu\u00E8 el teu compte \u00E9s de nom\u00E9s lectura.
+
+successTotpMessage=Aplicaci\u00F3 d''autenticaci\u00F3 m\u00F2bil configurada.
+successTotpRemovedMessage=Aplicaci\u00F3 d''autenticaci\u00F3 m\u00F2bil eliminada.
+
+successGrantRevokedMessage=Perm\u00EDs revocat correctament
+
+accountUpdatedMessage=El teu compte s''ha actualitzat.
+accountPasswordUpdatedMessage=La contrasenya s''ha actualitzat.
+
+missingIdentityProviderMessage=Prove\u00EFdor d''identitat no indicat.
+invalidFederatedIdentityActionMessage=Acci\u00F3 no v\u00E0lida o no indicada.
+identityProviderNotFoundMessage=No s''ha trobat un prove\u00EFdor d''identitat.
+federatedIdentityLinkNotActiveMessage=Aquesta identitat ja no est\u00E0 activa
+federatedIdentityRemovingLastProviderMessage=No pots eliminar l''\u00FAltima identitat federada perqu\u00E8 no tens fixada una contrasenya.
+identityProviderRedirectErrorMessage=Error en la redirecci\u00F3 al prove\u00EFdor d''identitat
+identityProviderRemovedMessage=Prove\u00EFdor d''identitat esborrat correctament.
+
+accountDisabledMessage=El compte est\u00E0 desactivada, contacteu amb l''administrador.
+
+accountTemporarilyDisabledMessage=El compte est\u00E0 temporalment desactivat, contacta amb l''administrador o intenta-ho de nou m\u00E9s tard.
+invalidPasswordMinLengthMessage=Contrasenya incorrecta: longitud m\u00EDnima {0}.
+invalidPasswordMinLowerCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres min\u00FAscules.
+invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres num\u00E9ricos.
+invalidPasswordMinUpperCaseCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} lletres maj\u00FAscules.
+invalidPasswordMinSpecialCharsMessage=Contrasenya incorrecta: ha de contenir almenys {0} car\u00E0cters especials.
+invalidPasswordNotUsernameMessage=Contrasenya incorrecta: no pot ser igual al nom d''usuari.
+invalidPasswordRegexPatternMessage=Contrasenya incorrecta: no compleix l''expressi\u00F3 regular.
+invalidPasswordHistoryMessage=Contrasenya incorrecta: no pot ser igual a cap de les \u00FAltimes {0} contrasenyes. \ No newline at end of file
diff --git a/account/messages/messages_de.properties b/account/messages/messages_de.properties
new file mode 100644
index 0000000..0c8b087
--- /dev/null
+++ b/account/messages/messages_de.properties
@@ -0,0 +1,169 @@
+doSave=Speichern
+doCancel=Abbrechen
+doLogOutAllSessions=Alle Sitzungen abmelden
+doRemove=Entfernen
+doAdd=Hinzuf\u00FCgen
+doSignOut=Abmelden
+
+editAccountHtmlTitle=Benutzerkonto bearbeiten
+federatedIdentitiesHtmlTitle=F\u00F6derierte Identit\u00E4ten
+accountLogHtmlTitle=Benutzerkonto Log
+changePasswordHtmlTitle=Passwort \u00C4ndern
+sessionsHtmlTitle=Sitzungen
+accountManagementTitle=Keycloak Benutzerkontoverwaltung
+authenticatorTitle=Mehrfachauthentifizierung
+applicationsHtmlTitle=Applikationen
+
+authenticatorCode=One-time Code
+email=E-Mail
+firstName=Vorname
+givenName=Vorname
+fullName=Voller Name
+lastName=Nachname
+familyName=Nachname
+password=Passwort
+passwordConfirm=Passwort best\u00E4tigen
+passwordNew=Neues Passwort
+username=Benutzername
+address=Adresse
+street=Stra\u00DFe
+region=Staat, Provinz, Region
+postal_code=PLZ
+locality=Stadt oder Ortschaft
+country=Land
+emailVerified=E-Mail verifiziert
+gssDelegationCredential=GSS delegierte Berechtigung
+
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Realm erstellen
+role_view-realm=Realm ansehen
+role_view-users=Benutzer ansehen
+role_view-applications=Applikationen ansehen
+role_view-clients=Clients ansehen
+role_view-events=Events ansehen
+role_view-identity-providers=Identity Provider ansehen
+role_manage-realm=Realm verwalten
+role_manage-users=Benutzer verwalten
+role_manage-applications=Applikationen verwalten
+role_manage-identity-providers=Identity Provider verwalten
+role_manage-clients=Clients verwalten
+role_manage-events=Events verwalten
+role_view-profile=Profile ansehen
+role_manage-account=Profile verwalten
+role_manage-account-links=Profil-Links verwalten
+role_read-token=Token lesen
+role_offline-access=Offline-Zugriff
+role_uma_authorization=Berechtigungen einholen
+client_account=Clientkonto
+client_security-admin-console=Security Adminkonsole
+client_realm-management=Realm-Management
+client_broker=Broker
+
+
+requiredFields=Erforderliche Felder
+allFieldsRequired=Alle Felder sind erforderlich
+
+backToApplication=&laquo; Zur\u00FCck zur Applikation
+backTo=Zur\u00FCck zu {0}
+
+date=Datum
+event=Ereignis
+ip=IP
+client=Client
+clients=Clients
+details=Details
+started=Startdatum
+lastAccess=Letzter Zugriff
+expires=Ablaufdatum
+applications=Applikationen
+
+account=Benutzerkonto
+federatedIdentity=F\u00F6derierte Identit\u00E4t
+authenticator=Mehrfachauthentifizierung
+sessions=Sitzungen
+log=Log
+
+application=Applikation
+availablePermissions=verf\u00FCgbare Berechtigungen
+grantedPermissions=gew\u00E4hrte Berechtigungen
+grantedPersonalInfo=gew\u00E4hrte pers\u00F6nliche Informationen
+additionalGrants=zus\u00E4tzliche Berechtigungen
+action=Aktion
+inResource=in
+fullAccess=Vollzugriff
+offlineToken=Offline-Token
+revoke=Berechtigung widerrufen
+
+configureAuthenticators=Mehrfachauthentifizierung konfigurieren
+mobile=Mobil
+totpStep1=Installieren Sie eine der folgenden Applikationen auf Ihrem Smartphone:
+totpStep2=\u00D6ffnen Sie die Applikation und scannen Sie den Barcode.
+totpStep3=Geben Sie den von der Applikation generierten One-time Code ein und klicken Sie auf Speichern.
+
+totpManualStep2=\u00D6ffnen Sie die Applikation und geben Sie den folgenden Schl\u00FCssel ein.
+totpManualStep3=Verwenden Sie die folgenden Konfigurationswerte, falls Sie diese f\u00FCr die Applikation anpassen k\u00F6nnen:
+totpUnableToScan=Sie k\u00F6nnen den Barcode nicht scannen?
+totpScanBarcode=Barcode scannen?
+
+totp.totp=zeitbasiert (time-based)
+totp.hotp=z\u00E4hlerbasiert (counter-based)
+
+totpType=Typ
+totpAlgorithm=Algorithmus
+totpDigits=Ziffern
+totpInterval=Intervall
+totpCounter=Z\u00E4hler
+
+missingUsernameMessage=Bitte geben Sie einen Benutzernamen ein.
+missingFirstNameMessage=Bitte geben Sie einen Vornamen ein.
+invalidEmailMessage=Ung\u00FCltige E-Mail Adresse.
+missingLastNameMessage=Bitte geben Sie einen Nachnamen ein.
+missingEmailMessage=Bitte geben Sie eine E-Mail Adresse ein.
+missingPasswordMessage=Bitte geben Sie ein Passwort ein.
+notMatchPasswordMessage=Die Passw\u00F6rter sind nicht identisch.
+
+missingTotpMessage=Bitte geben Sie den One-time Code ein.
+invalidPasswordExistingMessage=Das aktuelle Passwort ist ung\u00FCltig.
+invalidPasswordConfirmMessage=Die Passwortbest\u00E4tigung ist nicht identisch.
+invalidTotpMessage=Ung\u00FCltiger One-time Code.
+
+usernameExistsMessage=Der Benutzername existiert bereits.
+emailExistsMessage=Die E-Mail-Adresse existiert bereits.
+
+readOnlyUserMessage=Sie k\u00F6nnen Ihr Benutzerkonto nicht \u00E4ndern, da es schreibgesch\u00FCtzt ist.
+readOnlyUsernameMessage=Sie k\u00F6nnen Ihren Benutzernamen nicht \u00E4ndern, da er schreibgesch\u00FCtzt ist.
+readOnlyPasswordMessage=Sie k\u00F6nnen Ihr Passwort nicht \u00E4ndern, da es schreibgesch\u00FCtzt ist.
+
+successTotpMessage=Mehrfachauthentifizierung erfolgreich konfiguriert.
+successTotpRemovedMessage=Mehrfachauthentifizierung erfolgreich entfernt.
+
+successGrantRevokedMessage=Berechtigung erfolgreich widerrufen.
+
+accountUpdatedMessage=Ihr Benutzerkonto wurde aktualisiert.
+accountPasswordUpdatedMessage=Ihr Passwort wurde aktualisiert.
+
+missingIdentityProviderMessage=Identity Provider nicht angegeben.
+invalidFederatedIdentityActionMessage=Ung\u00FCltige oder fehlende Aktion.
+identityProviderNotFoundMessage=Angegebener Identity Provider nicht gefunden.
+federatedIdentityLinkNotActiveMessage=Diese Identit\u00E4t ist nicht mehr aktiv.
+federatedIdentityRemovingLastProviderMessage=Sie k\u00F6nnen den letzten Eintrag nicht entfernen, da Sie kein Passwort haben.
+identityProviderRedirectErrorMessage=Fehler bei der Weiterleitung zum Identity Provider.
+identityProviderRemovedMessage=Identity Provider erfolgreich entfernt.
+identityProviderAlreadyLinkedMessage=Die f\u00F6derierte Identit\u00E4t von {0} ist bereits einem anderen Benutzer zugewiesen.
+staleCodeAccountMessage=Diese Seite ist nicht mehr g\u00FCltig, bitte versuchen Sie es noch einmal.
+consentDenied=Einverst\u00E4ndnis verweigert.
+
+accountDisabledMessage=Ihr Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin.
+
+accountTemporarilyDisabledMessage=Ihr Benutzerkonto ist tempor\u00E4r gesperrt, bitte kontaktieren Sie den Admin oder versuchen Sie es sp\u00E4ter noch einmal.
+invalidPasswordMinLengthMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Zeichen lang sein.
+invalidPasswordMinLowerCaseCharsMessage=Ung\u00FCltiges Passwort\: Es muss mindestens {0} Kleinbuchstaben beinhalten.
+invalidPasswordMinDigitsMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Zahl(en) beinhalten.
+invalidPasswordMinUpperCaseCharsMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Gro\u00DFbuchstaben beinhalten.
+invalidPasswordMinSpecialCharsMessage=Ung\u00FCltiges Passwort: Es muss mindestens {0} Sonderzeichen beinhalten.
+invalidPasswordNotUsernameMessage=Ung\u00FCltiges Passwort: Es darf nicht gleich sein wie der Benutzername.
+invalidPasswordRegexPatternMessage=Ung\u00FCltiges Passwort: Es entspricht nicht dem Regex-Muster.
+invalidPasswordHistoryMessage=Ung\u00FCltiges Passwort: Es darf nicht einem der letzten {0} Passw\u00F6rter entsprechen.
+invalidPasswordBlacklistedMessage=Ung\u00FCltiges Passwort: Das Passwort steht auf der Blocklist (schwarzen Liste).
+invalidPasswordGenericMessge=Ung\u00FCltiges Passwort: Das neue Passwort verletzt die Passwort-Richtlinien. \ No newline at end of file
diff --git a/account/messages/messages_en.properties b/account/messages/messages_en.properties
new file mode 100644
index 0000000..9a04144
--- /dev/null
+++ b/account/messages/messages_en.properties
@@ -0,0 +1,358 @@
+doSave=Save
+doCancel=Cancel
+doLogOutAllSessions=Log out all sessions
+doRemove=Remove
+doAdd=Add
+doSignOut=Sign Out
+doLogIn=Log In
+doLink=Link
+
+
+editAccountHtmlTitle=Edit Account
+personalInfoHtmlTitle=Personal Info
+federatedIdentitiesHtmlTitle=Federated Identities
+accountLogHtmlTitle=Account Log
+changePasswordHtmlTitle=Change Password
+deviceActivityHtmlTitle=Device Activity
+sessionsHtmlTitle=Sessions
+accountManagementTitle=Keycloak Account Management
+authenticatorTitle=Authenticator
+applicationsHtmlTitle=Applications
+linkedAccountsHtmlTitle=Linked Accounts
+
+accountManagementWelcomeMessage=Welcome to Keycloak Account Management
+personalInfoIntroMessage=Manage your basic information
+accountSecurityTitle=Account Security
+accountSecurityIntroMessage=Control your password and account access
+applicationsIntroMessage=Track and manage your app permission to access your account
+resourceIntroMessage=Share your resources among team members
+passwordLastUpdateMessage=Your password was updated at
+updatePasswordTitle=Update Password
+updatePasswordMessageTitle=Make sure you choose a strong password
+updatePasswordMessage=A strong password contains a mix of numbers, letters, and symbols. It is hard to guess, does not resemble a real word, and is only used for this account.
+personalSubTitle=Your Personal Info
+personalSubMessage=Manage this basic information: your first name, last name and email
+
+authenticatorCode=One-time code
+email=Email
+firstName=First name
+givenName=Given name
+fullName=Full name
+lastName=Last name
+familyName=Family name
+password=Password
+currentPassword=Current Password
+passwordConfirm=Confirmation
+passwordNew=New Password
+username=Username
+address=Address
+street=Street
+locality=City or Locality
+region=State, Province, or Region
+postal_code=Zip or Postal code
+country=Country
+emailVerified=Email verified
+gssDelegationCredential=GSS Delegation Credential
+
+profileScopeConsentText=User profile
+emailScopeConsentText=Email address
+addressScopeConsentText=Address
+phoneScopeConsentText=Phone number
+offlineAccessScopeConsentText=Offline Access
+samlRoleListScopeConsentText=My Roles
+rolesScopeConsentText=User roles
+
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Create realm
+role_view-realm=View realm
+role_view-users=View users
+role_view-applications=View applications
+role_view-clients=View clients
+role_view-events=View events
+role_view-identity-providers=View identity providers
+role_view-consent=View consents
+role_manage-realm=Manage realm
+role_manage-users=Manage users
+role_manage-applications=Manage applications
+role_manage-identity-providers=Manage identity providers
+role_manage-clients=Manage clients
+role_manage-events=Manage events
+role_view-profile=View profile
+role_manage-account=Manage account
+role_manage-account-links=Manage account links
+role_manage-consent=Manage consents
+role_read-token=Read token
+role_offline-access=Offline access
+role_uma_authorization=Obtain permissions
+client_account=Account
+client_account-console=Account Console
+client_security-admin-console=Security Admin Console
+client_admin-cli=Admin CLI
+client_realm-management=Realm Management
+client_broker=Broker
+
+
+requiredFields=Required fields
+allFieldsRequired=All fields required
+
+backToApplication=&laquo; Back to application
+backTo=Back to {0}
+
+date=Date
+event=Event
+ip=IP
+client=Client
+clients=Clients
+details=Details
+started=Started
+lastAccess=Last Access
+expires=Expires
+applications=Applications
+
+account=Account
+federatedIdentity=Federated Identity
+authenticator=Authenticator
+device-activity=Device Activity
+sessions=Sessions
+log=Log
+
+application=Application
+availableRoles=Available Roles
+grantedPermissions=Granted Permissions
+grantedPersonalInfo=Granted Personal Info
+additionalGrants=Additional Grants
+action=Action
+inResource=in
+fullAccess=Full Access
+offlineToken=Offline Token
+revoke=Revoke Grant
+
+configureAuthenticators=Configured Authenticators
+mobile=Mobile
+totpStep1=Install one of the following applications on your mobile:
+totpStep2=Open the application and scan the barcode:
+totpStep3=Enter the one-time code provided by the application and click Save to finish the setup.
+totpStep3DeviceName=Provide a Device Name to help you manage your OTP devices.
+
+totpManualStep2=Open the application and enter the key:
+totpManualStep3=Use the following configuration values if the application allows setting them:
+totpUnableToScan=Unable to scan?
+totpScanBarcode=Scan barcode?
+
+totp.totp=Time-based
+totp.hotp=Counter-based
+
+totpType=Type
+totpAlgorithm=Algorithm
+totpDigits=Digits
+totpInterval=Interval
+totpCounter=Counter
+totpDeviceName=Device Name
+
+missingUsernameMessage=Please specify username.
+missingFirstNameMessage=Please specify first name.
+invalidEmailMessage=Invalid email address.
+missingLastNameMessage=Please specify last name.
+missingEmailMessage=Please specify email.
+missingPasswordMessage=Please specify password.
+notMatchPasswordMessage=Passwords don''t match.
+invalidUserMessage=Invalid user
+
+missingTotpMessage=Please specify authenticator code.
+missingTotpDeviceNameMessage=Please specify device name.
+invalidPasswordExistingMessage=Invalid existing password.
+invalidPasswordConfirmMessage=Password confirmation doesn''t match.
+invalidTotpMessage=Invalid authenticator code.
+
+usernameExistsMessage=Username already exists.
+emailExistsMessage=Email already exists.
+
+readOnlyUserMessage=You can''t update your account as it is read-only.
+readOnlyUsernameMessage=You can''t update your username as it is read-only.
+readOnlyPasswordMessage=You can''t update your password as your account is read-only.
+
+successTotpMessage=Mobile authenticator configured.
+successTotpRemovedMessage=Mobile authenticator removed.
+
+successGrantRevokedMessage=Grant revoked successfully.
+
+accountUpdatedMessage=Your account has been updated.
+accountPasswordUpdatedMessage=Your password has been updated.
+
+missingIdentityProviderMessage=Identity provider not specified.
+invalidFederatedIdentityActionMessage=Invalid or missing action.
+identityProviderNotFoundMessage=Specified identity provider not found.
+federatedIdentityLinkNotActiveMessage=This identity is not active anymore.
+federatedIdentityRemovingLastProviderMessage=You can''t remove last federated identity as you don''t have a password.
+identityProviderRedirectErrorMessage=Failed to redirect to identity provider.
+identityProviderRemovedMessage=Identity provider removed successfully.
+identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user.
+staleCodeAccountMessage=The page expired. Please try one more time.
+consentDenied=Consent denied.
+
+accountDisabledMessage=Account is disabled, contact your administrator.
+
+accountTemporarilyDisabledMessage=Account is temporarily disabled, contact your administrator or try again later.
+invalidPasswordMinLengthMessage=Invalid password: minimum length {0}.
+invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters.
+invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits.
+invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters.
+invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters.
+invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username.
+invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s).
+invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords.
+invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted.
+invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies.
+
+# Authorization
+myResources=My Resources
+myResourcesSub=My resources
+doDeny=Deny
+doRevoke=Revoke
+doApprove=Approve
+doRemoveSharing=Remove Sharing
+doRemoveRequest=Remove Request
+peopleAccessResource=People with access to this resource
+resourceManagedPolicies=Permissions granting access to this resource
+resourceNoPermissionsGrantingAccess=No permissions granting access to this resource
+anyAction=Any action
+description=Description
+name=Name
+scopes=Scopes
+resource=Resource
+user=User
+peopleSharingThisResource=People sharing this resource
+shareWithOthers=Share with others
+needMyApproval=Need my approval
+requestsWaitingApproval=Your requests waiting approval
+icon=Icon
+requestor=Requestor
+owner=Owner
+resourcesSharedWithMe=Resources shared with me
+permissionRequestion=Permission Requestion
+permission=Permission
+shares=share(s)
+notBeingShared=This resource is not being shared.
+notHaveAnyResource=You don't have any resources
+noResourcesSharedWithYou=There are no resources shared with you
+havePermissionRequestsWaitingForApproval=You have {0} permission request(s) waiting for approval.
+clickHereForDetails=Click here for details.
+resourceIsNotBeingShared=The resource is not being shared
+
+locale_ca=Catal\u00e0
+locale_de=Deutsch
+locale_en=English
+locale_es=Espa\u00f1ol
+locale_fr=Fran\u00e7ais
+locale_it=Italian
+locale_ja=\u65e5\u672c\u8a9e
+locale_nl=Nederlands
+locale_no=Norsk
+locale_lt=Lietuvi\u0173
+locale_pt-BR=Portugu\u00eas (Brasil)
+locale_ru=\u0420\u0443\u0441\u0441\u043a\u0438\u0439
+locale_sk=Sloven\u010dina
+locale_sv=Svenska
+locale_tr=Turkish
+locale_zh-CN=\u4e2d\u6587\u7b80\u4f53
+
+# Applications
+applicaitonName=Name
+applicationType=Application Type
+applicationInUse=In-use app only
+clearAllFilter=Clear all filters
+activeFilters=Active filters
+filterByName=Filter By Name ...
+allApps=All applications
+internalApps=Internal applications
+thirdpartyApps=Third-Party applications
+appResults=Results
+clientNotFoundMessage=Client not found.
+
+# Linked account
+authorizedProvider=Authorized Provider
+authorizedProviderMessage=Authorized Providers linked with your account
+identityProvider=Identity Provider
+identityProviderMessage=To link your account with identity providers you have configured
+socialLogin=Social Login
+userDefined=User Defined
+removeAccess=Remove Access
+removeAccessMessage=You will need to grant access again, if you want to use this app account.
+
+#Authenticator
+authenticatorStatusMessage=Two-factor authentication is currently
+authenticatorFinishSetUpTitle=Your Two-Factor Authentication
+authenticatorFinishSetUpMessage=Each time you sign in to your Keycloak account, you will be asked to provide a two-factor authentication code.
+authenticatorSubTitle=Set Up Two-Factor Authentication
+authenticatorSubMessage=To enhance the security of your account, enable at least one of the available two-factor authentication methods.
+authenticatorMobileTitle=Mobile Authenticator
+authenticatorMobileMessage=Use mobile Authenticator to get Verification codes as the two-factor authentication.
+authenticatorMobileFinishSetUpMessage=The authenticator has been bound to your phone.
+authenticatorActionSetup=Set up
+authenticatorSMSTitle=SMS Code
+authenticatorSMSMessage=Keycloak will send the Verification code to your phone as the two-factor authentication.
+authenticatorSMSFinishSetUpMessage=Text messages are sent to
+authenticatorDefaultStatus=Default
+authenticatorChangePhone=Change Phone Number
+authenticatorBackupCodesTitle=Backup Codes
+authenticatorBackupCodesMessage=Get your 8-digit backup codes
+authenticatorBackupCodesFinishSetUpMessage=12 backup codes were generated at this time. Each one can be used once.
+
+#Authenticator - Mobile Authenticator setup
+authenticatorMobileSetupTitle=Mobile Authenticator Setup
+smscodeIntroMessage=Enter your phone number and a verification code will be sent to your phone.
+mobileSetupStep1=Install an authenticator application on your phone. The applications listed here are supported.
+mobileSetupStep2=Open the application and scan the barcode:
+mobileSetupStep3=Enter the one-time code provided by the application and click Save to finish the setup.
+scanBarCode=Want to scan the barcode?
+enterBarCode=Enter the one-time code
+doCopy=Copy
+doFinish=Finish
+
+#Authenticator - SMS Code setup
+authenticatorSMSCodeSetupTitle=SMS Code Setup
+chooseYourCountry=Choose your country
+enterYourPhoneNumber=Enter your phone number
+sendVerficationCode=Send Verification Code
+enterYourVerficationCode=Enter your verification code
+
+#Authenticator - backup Code setup
+authenticatorBackupCodesSetupTitle=Backup Codes Setup
+backupcodesIntroMessage=If you lose access to your phone, you can still log into your account through backup codes. Keep them somewhere safe and accessible.
+realmName=Realm
+doDownload=Download
+doPrint=Print
+backupCodesTips-1=Each backup code can be used once.
+backupCodesTips-2=These codes were generated on
+generateNewBackupCodes=Generate New Backup Codes
+backupCodesTips-3=When you generate new backup codes, the current codes will not work anymore.
+backtoAuthenticatorPage=Back to Authenticator Page
+
+
+#Resources
+resources=Resources
+sharedwithMe=Shared with Me
+share=Share
+sharedwith=Shared with
+accessPermissions=Access Permissions
+permissionRequests=Permission Requests
+approve=Approve
+approveAll=Approve all
+people=people
+perPage=per page
+currentPage=Current Page
+sharetheResource=Share the resource
+group=Group
+selectPermission=Select Permission
+addPeople=Add people to share your resource with
+addTeam=Add team to share your resource with
+myPermissions=My Permissions
+waitingforApproval=Waiting for approval
+anyPermission=Any Permission
+
+# Openshift messages
+openshift.scope.user_info=User information
+openshift.scope.user_check-access=User access information
+openshift.scope.user_full=Full Access
+openshift.scope.list-projects=List projects
diff --git a/account/messages/messages_es.properties b/account/messages/messages_es.properties
new file mode 100644
index 0000000..fd36e59
--- /dev/null
+++ b/account/messages/messages_es.properties
@@ -0,0 +1,147 @@
+doSave=Guardar
+doCancel=Cancelar
+doLogOutAllSessions=Desconectar de todas las sesiones
+doRemove=Eliminar
+doAdd=A\u00F1adir
+doSignOut=Desconectar
+
+editAccountHtmlTitle=Editar cuenta
+federatedIdentitiesHtmlTitle=Identidades federadas
+accountLogHtmlTitle=Registro de la cuenta
+changePasswordHtmlTitle=Cambiar contrase\u00F1a
+sessionsHtmlTitle=Sesiones
+accountManagementTitle=Gesti\u00F3n de Cuenta Keycloak
+authenticatorTitle=Autenticador
+applicationsHtmlTitle=Aplicaciones
+
+authenticatorCode=C\u00F3digo de un solo uso
+email=Email
+firstName=Nombre
+givenName=Nombre de pila
+fullName=Nombre completo
+lastName=Apellidos
+familyName=Apellido
+password=Contrase\u00F1a
+passwordConfirm=Confirma la contrase\u00F1a
+passwordNew=Nueva contrase\u00F1a
+username=Usuario
+address=Direcci\u00F3n
+street=Calle
+locality=Ciudad o Municipio
+region=Estado, Provincia, o Regi\u00F3n
+postal_code=C\u00F3digo Postal
+country=Pa\u00EDs
+emailVerified=Email verificado
+gssDelegationCredential=GSS Delegation Credential
+
+role_admin=Administrador
+role_realm-admin=Administrador del dominio
+role_create-realm=Crear dominio
+role_view-realm=Ver dominio
+role_view-users=Ver usuarios
+role_view-applications=Ver aplicaciones
+role_view-clients=Ver clientes
+role_view-events=Ver eventos
+role_view-identity-providers=Ver proveedores de identidad
+role_manage-realm=Gestionar dominio
+role_manage-users=Gestionar usuarios
+role_manage-applications=Gestionar aplicaciones
+role_manage-identity-providers=Gestionar proveedores de identidad
+role_manage-clients=Gestionar clientes
+role_manage-events=Gestionar eventos
+role_view-profile=Ver perfil
+role_manage-account=Gestionar cuenta
+role_read-token=Leer token
+role_offline-access=Acceso sin conexi\u00F3n
+client_account=Cuenta
+client_security-admin-console=Consola de Administraci\u00F3n de Seguridad
+client_realm-management=Gesti\u00F3n de dominio
+client_broker=Broker
+
+
+requiredFields=Campos obligatorios
+allFieldsRequired=Todos los campos obligatorios
+
+backToApplication=&laquo; Volver a la aplicaci\u00F3n
+backTo=Volver a {0}
+
+date=Fecha
+event=Evento
+ip=IP
+client=Cliente
+clients=Clientes
+details=Detalles
+started=Iniciado
+lastAccess=\u00DAltimo acceso
+expires=Expira
+applications=Aplicaciones
+
+account=Cuenta
+federatedIdentity=Identidad federada
+authenticator=Autenticador
+sessions=Sesiones
+log=Regisro
+
+application=Aplicaci\u00F3n
+availablePermissions=Permisos disponibles
+grantedPermissions=Permisos concedidos
+grantedPersonalInfo=Informaci\u00F3n personal concedida
+additionalGrants=Permisos adicionales
+action=Acci\u00F3n
+inResource=en
+fullAccess=Acceso total
+offlineToken=C\u00F3digo de autorizaci\u00F3n offline
+revoke=Revocar permiso
+
+configureAuthenticators=Autenticadores configurados
+mobile=M\u00F3vil
+totpStep1=Instala <a href=\"https://freeotp.github.io/\" target=\"_blank\">FreeOTP</a> o Google Authenticator en tu tel\u00E9fono m\u00F3vil. Ambas aplicaciones est\u00E1n disponibles en <a href=\"https://play.google.com\">Google Play</a> y en la App Store de Apple.
+totpStep2=Abre la aplicaci\u00F3n y escanea el c\u00F3digo o introduce la clave.
+totpStep3=Introduce el c\u00F3digo \u00FAnico que te muestra la aplicaci\u00F3n de autenticaci\u00F3n y haz clic en Enviar para finalizar la configuraci\u00F3n
+
+missingUsernameMessage=Por favor indica tu usuario.
+missingFirstNameMessage=Por favor indica el nombre.
+invalidEmailMessage=Email no v\u00E1lido
+missingLastNameMessage=Por favor indica tus apellidos.
+missingEmailMessage=Por favor indica el email.
+missingPasswordMessage=Por favor indica tu contrase\u00F1a.
+notMatchPasswordMessage=Las contrase\u00F1as no coinciden.
+
+missingTotpMessage=Por favor indica tu c\u00F3digo de autenticaci\u00F3n
+invalidPasswordExistingMessage=La contrase\u00F1a actual no es correcta.
+invalidPasswordConfirmMessage=La confirmaci\u00F3n de contrase\u00F1a no coincide.
+invalidTotpMessage=El c\u00F3digo de autenticaci\u00F3n no es v\u00E1lido.
+
+usernameExistsMessage=El usuario ya existe
+emailExistsMessage=El email ya existe
+
+readOnlyUserMessage=No puedes actualizar tu usuario porque tu cuenta es de solo lectura.
+readOnlyPasswordMessage=No puedes actualizar tu contrase\u00F1a porque tu cuenta es de solo lectura.
+
+successTotpMessage=Aplicaci\u00F3n de autenticaci\u00F3n m\u00F3vil configurada.
+successTotpRemovedMessage=Aplicaci\u00F3n de autenticaci\u00F3n m\u00F3vil eliminada.
+
+successGrantRevokedMessage=Permiso revocado correctamente
+
+accountUpdatedMessage=Tu cuenta se ha actualizado.
+accountPasswordUpdatedMessage=Tu contrase\u00F1a se ha actualizado.
+
+missingIdentityProviderMessage=Proveedor de identidad no indicado.
+invalidFederatedIdentityActionMessage=Acci\u00F3n no v\u00E1lida o no indicada.
+identityProviderNotFoundMessage=No se encontr\u00F3 un proveedor de identidad.
+federatedIdentityLinkNotActiveMessage=Esta identidad ya no est\u00E1 activa
+federatedIdentityRemovingLastProviderMessage=No puedes eliminar la \u00FAltima identidad federada porque no tienes fijada una contrase\u00F1a.
+identityProviderRedirectErrorMessage=Error en la redirecci\u00F3n al proveedor de identidad
+identityProviderRemovedMessage=Proveedor de identidad borrado correctamente.
+
+accountDisabledMessage=La cuenta est\u00E1 desactivada, contacta con el administrador.
+
+accountTemporarilyDisabledMessage=La cuenta est\u00E1 temporalmente desactivada, contacta con el administrador o int\u00E9ntalo de nuevo m\u00E1s tarde.
+invalidPasswordMinLengthMessage=Contrase\u00F1a incorrecta: longitud m\u00EDnima {0}.
+invalidPasswordMinLowerCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras min\u00FAsculas.
+invalidPasswordMinDigitsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres num\u00E9ricos.
+invalidPasswordMinUpperCaseCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} letras may\u00FAsculas.
+invalidPasswordMinSpecialCharsMessage=Contrase\u00F1a incorrecta: debe contener al menos {0} caracteres especiales.
+invalidPasswordNotUsernameMessage=Contrase\u00F1a incorrecta: no puede ser igual al nombre de usuario.
+invalidPasswordRegexPatternMessage=Contrase\u00F1a incorrecta: no cumple la expresi\u00F3n regular.
+invalidPasswordHistoryMessage=Contrase\u00F1a incorrecta: no puede ser igual a ninguna de las \u00FAltimas {0} contrase\u00F1as. \ No newline at end of file
diff --git a/account/messages/messages_fr.properties b/account/messages/messages_fr.properties
new file mode 100644
index 0000000..f18bf47
--- /dev/null
+++ b/account/messages/messages_fr.properties
@@ -0,0 +1,166 @@
+# TIPS to encode UTF-8 to ISO
+# native2ascii -encoding ISO8859_1 srcFile > dstFile
+
+doSave=Sauvegarder
+doCancel=Annuler
+doLogOutAllSessions=D\u00e9connexion de toutes les sessions
+doRemove=Supprimer
+doAdd=Ajouter
+doSignOut=D\u00e9connexion
+
+editAccountHtmlTitle=\u00c9dition du compte
+federatedIdentitiesHtmlTitle=Identit\u00e9s f\u00e9d\u00e9r\u00e9es
+accountLogHtmlTitle=Acc\u00e8s au compte
+changePasswordHtmlTitle=Changer de mot de passe
+sessionsHtmlTitle=Sessions
+accountManagementTitle=Gestion du compte Keycloak
+authenticatorTitle=Authentification
+applicationsHtmlTitle=Applications
+
+authenticatorCode=Mot de passe unique
+email=Courriel
+firstName=Pr\u00e9nom
+givenName=Pr\u00e9nom
+fullName=Nom complet
+lastName=Nom
+familyName=Nom de famille
+password=Mot de passe
+passwordConfirm=Confirmation
+passwordNew=Nouveau mot de passe
+username=Compte
+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
+
+role_admin=Administrateur
+role_realm-admin=Administrateur du domaine
+role_create-realm=Cr\u00e9er un domaine
+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\u00e9s
+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\u00e9s
+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_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
+
+
+requiredFields=Champs obligatoires
+allFieldsRequired=Tous les champs sont obligatoires
+
+backToApplication=&laquo; Revenir \u00e0 l''application
+backTo=Revenir \u00e0 {0}
+
+date=Date
+event=Ev\u00e9nement
+ip=IP
+client=Client
+clients=Clients
+details=D\u00e9tails
+started=D\u00e9but
+lastAccess=Dernier acc\u00e8s
+expires=Expiration
+applications=Applications
+
+account=Compte
+federatedIdentity=Identit\u00e9 f\u00e9d\u00e9r\u00e9e
+authenticator=Authentification
+sessions=Sessions
+log=Connexion
+
+application=Application
+availablePermissions=Permissions disponibles
+grantedPermissions=Permissions accord\u00e9es
+grantedPersonalInfo=Informations personnelles accord\u00e9es
+additionalGrants=Droits additionnels
+action=Action
+inResource=dans
+fullAccess=Acc\u00e8s complet
+offlineToken=Jeton d''authentification hors-ligne
+revoke=R\u00e9voquer un droit
+
+configureAuthenticators=Authentifications configur\u00e9es.
+mobile=T\u00e9l\u00e9phone mobile
+totpStep1=Installez une des applications suivantes sur votre mobile
+totpStep2=Ouvrez l''application et scannez le code-barres ou entrez la clef.
+totpStep3=Entrez le code \u00e0 usage unique fourni par l''application et cliquez sur Sauvegarder pour terminer.
+
+totpManualStep2=Ouvrez l''application et entrez la clef
+totpManualStep3=Utilisez les valeurs de configuration suivante si l''application les autorise
+totpUnableToScan=Impossible de scanner ?
+totpScanBarcode=Scanner le code-barres ?
+
+totp.totp=Bas\u00e9 sur le temps
+totp.hotp=Bas\u00e9 sur un compteur
+
+totpType=Type
+totpAlgorithm=Algorithme
+totpDigits=Chiffres
+totpInterval=Intervalle
+totpCounter=Compteur
+
+missingUsernameMessage=Veuillez entrer votre nom d''utilisateur.
+missingFirstNameMessage=Veuillez entrer votre pr\u00e9nom.
+invalidEmailMessage=Courriel invalide.
+missingLastNameMessage=Veuillez entrer votre nom.
+missingEmailMessage=Veuillez entrer votre courriel.
+missingPasswordMessage=Veuillez entrer votre mot de passe.
+notMatchPasswordMessage=Les mots de passe ne sont pas identiques
+
+missingTotpMessage=Veuillez entrer le code d''authentification.
+invalidPasswordExistingMessage=Mot de passe existant invalide.
+invalidPasswordConfirmMessage=Le mot de passe de confirmation ne correspond pas.
+invalidTotpMessage=Le code d''authentification est invalide.
+
+usernameExistsMessage=Le nom d''utilisateur existe d\u00e9j\u00e0.
+emailExistsMessage=Le courriel existe d\u00e9j\u00e0.
+
+readOnlyUserMessage=Vous ne pouvez pas mettre \u00e0 jour votre compte car il est en lecture seule.
+readOnlyPasswordMessage=Vous ne pouvez pas mettre \u00e0 jour votre mot de passe car votre compte est en lecture seule.
+
+successTotpMessage=L''authentification via t\u00e9l\u00e9phone mobile est configur\u00e9e.
+successTotpRemovedMessage=L''authentification via t\u00e9l\u00e9phone mobile est supprim\u00e9e.
+
+successGrantRevokedMessage=Droit r\u00e9voqu\u00e9 avec succ\u00e8s.
+
+accountUpdatedMessage=Votre compte a \u00e9t\u00e9 mis \u00e0 jour.
+accountPasswordUpdatedMessage=Votre mot de passe a \u00e9t\u00e9 mis \u00e0 jour.
+
+missingIdentityProviderMessage=Le fournisseur d''identit\u00e9 n''est pas sp\u00e9cifi\u00e9.
+invalidFederatedIdentityActionMessage=Action manquante ou invalide.
+identityProviderNotFoundMessage=Le fournisseur d''identit\u00e9 sp\u00e9cifi\u00e9 n''est pas trouv\u00e9.
+federatedIdentityLinkNotActiveMessage=Cette identit\u00e9 n''est plus active dor\u00e9navant.
+federatedIdentityRemovingLastProviderMessage=Vous ne pouvez pas supprimer votre derni\u00e8re f\u00e9d\u00e9ration d''identit\u00e9 sans avoir de mot de passe sp\u00e9cifi\u00e9.
+identityProviderRedirectErrorMessage=Erreur de redirection vers le fournisseur d''identit\u00e9.
+identityProviderRemovedMessage=Le fournisseur d''identit\u00e9 a \u00e9t\u00e9 supprim\u00e9 correctement.
+identityProviderAlreadyLinkedMessage=Le fournisseur d''identit\u00e9 retourn\u00e9 par {0} est d\u00e9j\u00e0 li\u00e9 \u00e0 un autre utilisateur.
+
+accountDisabledMessage=Ce compte est d\u00e9sactiv\u00e9, veuillez contacter votre administrateur.
+
+accountTemporarilyDisabledMessage=Ce compte est temporairement d\u00e9sactiv\u00e9, veuillez contacter votre administrateur ou r\u00e9essayez plus tard.
+invalidPasswordMinLengthMessage=Mot de passe invalide: longueur minimale {0}.
+invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide: doit contenir au moins {0} lettre(s) en minuscule.
+invalidPasswordMinDigitsMessage=Mot de passe invalide: doit contenir au moins {0} chiffre(s).
+invalidPasswordMinUpperCaseCharsMessage=Mot de passe invalide: doit contenir au moins {0} lettre(s) en majuscule.
+invalidPasswordMinSpecialCharsMessage=Mot de passe invalide: doit contenir au moins {0} caract\u00e8re(s) sp\u00e9ciaux.
+invalidPasswordNotUsernameMessage=Mot de passe invalide: ne doit pas \u00eatre identique au nom d''utilisateur.
+invalidPasswordRegexPatternMessage=Mot de passe invalide: ne valide pas l''expression rationnelle.
+invalidPasswordHistoryMessage=Mot de passe invalide: ne doit pas \u00eatre \u00e9gal aux {0} derniers mots de passe.
diff --git a/account/messages/messages_it.properties b/account/messages/messages_it.properties
new file mode 100644
index 0000000..611bed1
--- /dev/null
+++ b/account/messages/messages_it.properties
@@ -0,0 +1,153 @@
+doSave=Salva
+doCancel=Annulla
+doLogOutAllSessions=Effettua il blog out da tutte le sessioni
+doRemove=Elimina
+doAdd=Aggiungi
+doSignOut=Esci
+
+editAccountHtmlTitle=Modifica Account
+federatedIdentitiesHtmlTitle=Federated Identities
+accountLogHtmlTitle=Account Log
+changePasswordHtmlTitle=Cambia Password
+sessionsHtmlTitle=Sessioni
+accountManagementTitle=Keycloak Account Management
+authenticatorTitle=Authenticator
+applicationsHtmlTitle=Applicazioni
+
+authenticatorCode=Codice One-time
+email=Email
+firstName=Nome
+givenName=Nome
+fullName=Nome Completo
+lastName=Cognome
+familyName=Cognome
+password=Password
+passwordConfirm=Conferma Password
+passwordNew=Nuova Password
+username=Username
+address=Indirizzo
+street=Via
+locality=Citt\u00e0 o Localit\u00e0
+region=Stato, Provincia, o Regione
+postal_code=CAP
+country=Paese
+emailVerified=Email verificata
+gssDelegationCredential=Credenziali GSS Delegation
+
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Crea realm
+role_view-realm=Visualizza realm
+role_view-users=Visualizza utenti
+role_view-applications=Visualizza applicazioni
+role_view-clients=Visualizza client
+role_view-events=Visualizza eventi
+role_view-identity-providers=Visualizza identity provider
+role_manage-realm=Gestisci realm
+role_manage-users=Gestisci utenti
+role_manage-applications=Gestisci applicazioni
+role_manage-identity-providers=Gestisci identity provider
+role_manage-clients=Gestisci i client
+role_manage-events=Gestisci eventi
+role_view-profile=Visualizza profilo
+role_manage-account=Gestisci account
+role_read-token=Leggi token
+role_offline-access=Accesso offline
+role_uma_authorization=Ottieni permessi
+client_account=Account
+client_security-admin-console=Security Admin Console
+client_admin-cli=Admin CLI
+client_realm-management=Gestione Realm
+client_broker=Broker
+
+
+requiredFields=Campi obbligatori
+allFieldsRequired=Tutti campi obbligatori
+
+backToApplication=&laquo; Torna all''applicazione
+backTo=Torna a {0}
+
+date=Data
+event=Evento
+ip=IP
+client=Client
+clients=Clients
+details=Dettagli
+started=Iniziato
+lastAccess=Ultimo accesso
+expires=Scade
+applications=Applicazioni
+
+account=Account
+federatedIdentity=Federated Identity
+authenticator=Authenticator
+sessions=Sessioni
+log=Log
+
+application=Applicazione
+availablePermissions=Permessi disponibili
+grantedPermissions=Permessi concessi
+grantedPersonalInfo=Informazioni Personali concesse
+additionalGrants=Concessioni addizionali
+action=Azione
+inResource=in
+fullAccess=Accesso completo
+offlineToken=Token offline
+revoke=Revoca concessione
+
+configureAuthenticators=Configura Authenticators
+mobile=Mobile
+totpStep1=Installa <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> o <a href="http://code.google.com/p/google-authenticator/" target="_blank">Google Authenticator</a> sul tuo dispositivo mobile.
+totpStep2=Apri l''applicazione e scansiona il barcode o scrivi la chiave.
+totpStep3=Scrivi il codice one-time fornito dall''applicazione e clicca Salva per completare il setup.
+
+missingUsernameMessage=Inserisci la username.
+missingFirstNameMessage=Inserisci il nome.
+invalidEmailMessage=Indirizzo email non valido.
+missingLastNameMessage=Inserisci il cognome.
+missingEmailMessage=Inserisci l''indirizzo email.
+missingPasswordMessage=Inserisci la password.
+notMatchPasswordMessage=Le password non corrispondono.
+
+missingTotpMessage=Inserisci il codice di autenticazione.
+invalidPasswordExistingMessage=Password esistente non valida.
+invalidPasswordConfirmMessage=La password di conferma non coincide.
+invalidTotpMessage=Codice di autenticazione non valido.
+
+usernameExistsMessage=Username gi\u00e0 esistente.
+emailExistsMessage=Email gi\u00e0 esistente.
+
+readOnlyUserMessage=Non puoi aggiornare il tuo account dal momento che \u00e8 in modalit\u00e0 sola lettura.
+readOnlyPasswordMessage=Non puoi aggiornare il tuo account dal momento che \u00e8 in modalit\u00e0 sola lettura.
+
+successTotpMessage=Mobile authenticator configurato.
+successTotpRemovedMessage=Mobile authenticator eliminato.
+
+successGrantRevokedMessage=Concessione revocata correttamente.
+
+accountUpdatedMessage=Il tuo account \u00e8 stato aggiornato.
+accountPasswordUpdatedMessage=La tua password \u00e8 stata aggiornata.
+
+missingIdentityProviderMessage=Identity provider non specificata.
+invalidFederatedIdentityActionMessage=Azione non valida o mancante.
+identityProviderNotFoundMessage=L''identity provider specificato non \u00e8 stato trovato.
+federatedIdentityLinkNotActiveMessage=Questo identity non \u00e8 pi\u00f9 attivo.
+federatedIdentityRemovingLastProviderMessage=Non puoi rimuovere l''ultimo federated identity dal momento che non hai pi\u00f9 la password.
+identityProviderRedirectErrorMessage=Il reindirizzamento all''identity provider \u00e8 fallito.
+identityProviderRemovedMessage=Identity provider eliminato correttamente.
+identityProviderAlreadyLinkedMessage=Federated identity ritornata da {0} \u00e8 gi\u00e0 collegata ad un altro utente.
+staleCodeAccountMessage=La pagina \u00e8 scaduta. Riprova di nuovo.
+consentDenied=Permesso negato.
+
+accountDisabledMessage=Account disabilitato, contatta l''amministratore.
+
+accountTemporarilyDisabledMessage=L''account \u00e8 temporaneamente disabilitato, contatta l''amministratore o riprova pi\u00f9 tardi.
+invalidPasswordMinLengthMessage=Password non valida: lunghezza minima {0}.
+invalidPasswordMinLowerCaseCharsMessage=Password non valida: deve contenere almeno {0} caratteri minuscoli.
+invalidPasswordMinDigitsMessage=Password non valida: deve contenere almeno {0} numeri.
+invalidPasswordMinUpperCaseCharsMessage=Password non valida: deve contenere almeno {0} caratteri maiuscoli.
+invalidPasswordMinSpecialCharsMessage=Password non valida: deve contenere almeno {0} caratteri speciali.
+invalidPasswordNotUsernameMessage=Password non valida: non deve essere uguale alla username.
+invalidPasswordRegexPatternMessage=Password non valida: fallito il match con una o pi\u00f9 espressioni regolari.
+invalidPasswordHistoryMessage=Password non valida: non deve essere uguale a nessuna delle ultime {0} password.
+invalidPasswordGenericMessage=Password non valida: la nuova password non rispetta le indicazioni previste.
diff --git a/account/messages/messages_ja.properties b/account/messages/messages_ja.properties
new file mode 100644
index 0000000..de3cee1
--- /dev/null
+++ b/account/messages/messages_ja.properties
@@ -0,0 +1,352 @@
+# encoding: utf-8
+doSave=保存
+doCancel=キャンセル
+doLogOutAllSessions=全セッションからログアウト
+doRemove=削除
+doAdd=追加
+doSignOut=サインアウト
+doLogIn=ログイン
+doLink=リンク
+
+
+editAccountHtmlTitle=アカウントの編集
+personalInfoHtmlTitle=個人情報
+federatedIdentitiesHtmlTitle=Federated Identities
+accountLogHtmlTitle=アカウントログ
+changePasswordHtmlTitle=パスワード変更
+deviceActivityHtmlTitle=デバイスアクティビティ
+sessionsHtmlTitle=セッション
+accountManagementTitle=Keycloak アカウント管理
+authenticatorTitle=Authenticator
+applicationsHtmlTitle=アプリケーション
+linkedAccountsHtmlTitle=リンクされたアカウント
+
+accountManagementWelcomeMessage=Keycloak アカウント管理へようこそ
+personalInfoIntroMessage=基本情報を管理する
+accountSecurityTitle=アカウントセキュリティ
+accountSecurityIntroMessage=パスワードとアカウントアクセスを制御する
+applicationsIntroMessage=アプリのアカウントへのアクセス権を追跡して管理する
+resourceIntroMessage=チームメンバー間でリソースを共有する
+passwordLastUpdateMessage=パスワードは更新されました
+updatePasswordTitle=パスワードの更新
+updatePasswordMessageTitle=強力なパスワードを選択してください
+updatePasswordMessage=強力なパスワードは、数字、文字、記号を含みます。推測が難しく、実在する言葉に似ておらず、このアカウントだけで使用されています。
+personalSubTitle=個人情報
+personalSubMessage=この基本情報を管理してください:名、姓、メール
+
+authenticatorCode=ワンタイムコード
+email=Eメール
+firstName=名
+givenName=名
+fullName=氏名
+lastName=姓
+familyName=姓
+password=パスワード
+currentPassword=現在のパスワード
+passwordConfirm=新しいパスワード (確認)
+passwordNew=新しいパスワード
+username=ユーザー名
+address=住所
+street=番地
+locality=市区町村
+region=都道府県
+postal_code=郵便番号
+country=国
+emailVerified=確認済みEメール
+gssDelegationCredential=GSS 代行クレデンシャル
+
+profileScopeConsentText=ユーザープロフィール
+emailScopeConsentText=メールアドレス
+addressScopeConsentText=アドレス
+phoneScopeConsentText=電話番号
+offlineAccessScopeConsentText=オフラインアクセス
+samlRoleListScopeConsentText=ロール
+rolesScopeConsentText=ユーザーロール
+
+role_admin=管理者
+role_realm-admin=レルムの管理
+role_create-realm=レルムの作成
+role_view-realm=レルムの参照
+role_view-users=ユーザーの参照
+role_view-applications=アプリケーションの参照
+role_view-clients=クライアントの参照
+role_view-events=イベントの参照
+role_view-identity-providers=アイデンティティ プロバイダーの参照
+role_manage-realm=レルムの管理
+role_manage-users=ユーザーの管理
+role_manage-applications=アプリケーションの管理
+role_manage-identity-providers=アイデンティティ プロバイダーの管理
+role_manage-clients=クライアントの管理
+role_manage-events=イベントの管理
+role_view-profile=プロフィールの参照
+role_manage-account=アカウントの管理
+role_manage-account-links=アカウントリンクの管理
+role_read-token=トークンの参照
+role_offline-access=オフラインアクセス
+role_uma_authorization=アクセス権の取得
+client_account=アカウント
+client_security-admin-console=セキュリティ管理コンソール
+client_admin-cli=管理 CLI
+client_realm-management=レルム管理
+client_broker=ブローカー
+
+
+requiredFields=必須
+allFieldsRequired=全ての入力項目が必須
+
+backToApplication=&laquo; アプリケーションに戻る
+backTo={0} に戻る
+
+date=日付
+event=イベント
+ip=IP
+client=クライアント
+clients=クライアント
+details=詳細
+started=開始
+lastAccess=最終アクセス
+expires=有効期限
+applications=アプリケーション
+
+account=アカウント
+federatedIdentity=Federated Identity
+authenticator=Authenticator
+device-activity=デバイスアクティビティ
+sessions=セッション
+log=ログ
+
+application=アプリケーション
+availableRoles=利用可能なロール
+grantedPermissions=許可されたアクセス権
+grantedPersonalInfo=許可された個人情報
+additionalGrants=追加の許可
+action=アクション
+inResource=in
+fullAccess=フルアクセス
+offlineToken=オフライントークン
+revoke=許可の取り消し
+
+configureAuthenticators=設定済みの Authenticator
+mobile=モバイル
+totpStep1=モバイルに以下のアプリケーションのいずれかをインストールしてください。
+totpStep2=アプリケーションを開き、バーコードをスキャンしてください。
+totpStep3=アプリケーションで提供されたワンタイムコードを入力して保存をクリックし、セットアップを完了してください。
+
+totpManualStep2=アプリケーションを開き、キーを入力してください。
+totpManualStep3=アプリケーションが設定できる場合は、次の設定値を使用してください。
+totpUnableToScan=スキャンできませんか?
+totpScanBarcode=バーコードをスキャンしますか?
+
+totp.totp=時間ベース
+totp.hotp=カウンターベース
+
+totpType=タイプ
+totpAlgorithm=アルゴリズム
+totpDigits=数字
+totpInterval=間隔
+totpCounter=カウンター
+
+missingUsernameMessage=ユーザー名を入力してください。
+missingFirstNameMessage=名を入力してください。
+invalidEmailMessage=無効なメールアドレスです。
+missingLastNameMessage=姓を入力してください。
+missingEmailMessage=Eメールを入力してください。
+missingPasswordMessage=パスワードを入力してください。
+notMatchPasswordMessage=パスワードが一致していません。
+invalidUserMessage=無効なユーザーです。
+
+missingTotpMessage=Authenticator コードを入力してください。
+invalidPasswordExistingMessage=無効な既存のパスワードです。
+invalidPasswordConfirmMessage=新しいパスワード (確認) と一致していません。
+invalidTotpMessage=無効な Authenticator コードです。
+
+usernameExistsMessage=既に存在するユーザー名です。
+emailExistsMessage=既に存在するEメールです。
+
+readOnlyUserMessage=読み取り専用のため、アカウントを更新することはできません。
+readOnlyUsernameMessage=読み取り専用のため、ユーザー名を更新することはできません。
+readOnlyPasswordMessage=読み取り専用のため、パスワードを更新することはできません。
+
+successTotpMessage=モバイル Authenticator が設定されました。
+successTotpRemovedMessage=モバイル Authenticator が削除されました。
+
+successGrantRevokedMessage=許可が正常に取り消しされました。
+
+accountUpdatedMessage=アカウントが更新されました。
+accountPasswordUpdatedMessage=パスワードが更新されました。
+
+missingIdentityProviderMessage=アイデンティティ プロバイダーが指定されていません。
+invalidFederatedIdentityActionMessage=無効または存在しないアクションです。
+identityProviderNotFoundMessage=指定されたアイデンティティ プロバイダーが見つかりません。
+federatedIdentityLinkNotActiveMessage=このアイデンティティは有効ではありません。
+federatedIdentityRemovingLastProviderMessage=パスワードがないため最後の Federated Identity を削除できません。
+identityProviderRedirectErrorMessage=アイデンティティ プロバイダーへのリダイレクトに失敗しました。
+identityProviderRemovedMessage=アイデンティティ プロバイダーが正常に削除されました。
+identityProviderAlreadyLinkedMessage={0}から返された Federated Identity は既に他のユーザーに関連付けされています。
+staleCodeAccountMessage=有効期限切れです。再度お試しください。
+consentDenied=同意が拒否されました。
+
+accountDisabledMessage=アカウントが無効です。管理者に連絡してください。
+
+accountTemporarilyDisabledMessage=アカウントが一時的に無効です。管理者に連絡、またはしばらく時間をおいてから再度お試しください。
+invalidPasswordMinLengthMessage=無効なパスワード: 最小 {0} の長さが必要です。
+invalidPasswordMinLowerCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の小文字を含む必要があります。
+invalidPasswordMinDigitsMessage=無効なパスワード: 少なくとも {0} 文字の数字を含む必要があります。
+invalidPasswordMinUpperCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の大文字を含む必要があります。
+invalidPasswordMinSpecialCharsMessage=無効なパスワード: 少なくとも {0} 文字の特殊文字を含む必要があります。
+invalidPasswordNotUsernameMessage=無効なパスワード: ユーザー名と同じパスワードは禁止されています。
+invalidPasswordRegexPatternMessage=無効なパスワード: 正規表現パターンと一致しません。
+invalidPasswordHistoryMessage=無効なパスワード: 最近の {0} パスワードのいずれかと同じパスワードは禁止されています。
+invalidPasswordBlacklistedMessage=無効なパスワード: パスワードがブラックリストに含まれています。
+invalidPasswordGenericMessage=無効なパスワード: 新しいパスワードはパスワードポリシーと一致しません。
+
+# Authorization
+myResources=マイリソース
+myResourcesSub=マイリソース
+doDeny=拒否
+doRevoke=取り消し
+doApprove=承認
+doRemoveSharing=共有の削除
+doRemoveRequest=リクエストの削除
+peopleAccessResource=このリソースにアクセスできる人
+resourceManagedPolicies=このリソースへのアクセスを許可するアクセス権
+resourceNoPermissionsGrantingAccess=このリソースへのアクセスを許可する権限はありません
+anyAction=任意のアクション
+description=説明
+name=名前
+scopes=スコープ
+resource=リソース
+user=ユーザー
+peopleSharingThisResource=このリソースを共有している人
+shareWithOthers=他人と共有
+needMyApproval=承認が必要
+requestsWaitingApproval=承認待ちのリクエスト
+icon=アイコン
+requestor=リクエスター
+owner=オーナー
+resourcesSharedWithMe=共有しているリソース
+permissionRequestion=パーミッションリクエスト
+permission=パーミッション
+shares=共有(複数)
+notBeingShared=このリソースは共有されていません。
+notHaveAnyResource=リソースがありません。
+noResourcesSharedWithYou=共有しているリソースはありません
+havePermissionRequestsWaitingForApproval=承認待ちの{0}個のパーミッションリクエストがあります。
+clickHereForDetails=詳細はこちらをクリックしてください。
+resourceIsNotBeingShared=リソースは共有されていません。
+
+locale_ca=Catal\u00e0
+locale_de=Deutsch
+locale_en=English
+locale_es=Espa\u00f1ol
+locale_fr=Fran\u00e7ais
+locale_it=Italian
+locale_ja=\u65e5\u672c\u8a9e
+locale_nl=Nederlands
+locale_no=Norsk
+locale_lt=Lietuvi\u0173
+locale_pt-BR=Portugu\u00eas (Brasil)
+locale_ru=\u0420\u0443\u0441\u0441\u043a\u0438\u0439
+locale_sk=Sloven\u010dina
+locale_sv=Svenska
+locale_tr=Turkish
+locale_zh-CN=\u4e2d\u6587\u7b80\u4f53
+
+# Applications
+applicaitonName=名前
+applicationType=アプリケーションタイプ
+applicationInUse=使用中のアプリケーションのみ
+clearAllFilter=すべてのフィルターをクリア
+activeFilters=アクティブなフィルター
+filterByName=名前でフィルタリング ...
+allApps=すべてのアプリケーション
+internalApps=内部アプリケーション
+thirdpartyApps=サードパーティのアプリケーション
+appResults=結果
+
+# Linked account
+authorizedProvider=認可済みプロバイダー
+authorizedProviderMessage=アカウントにリンクされた認可済みプロバイダー
+identityProvider=アイデンティティー・プロバイダー
+identityProviderMessage=アカウントと設定したアイデンティティー・プロバイダーをリンクするには
+socialLogin=ソーシャル・ログイン
+userDefined=ユーザー定義
+removeAccess=アクセス権の削除
+removeAccessMessage=このアプリ・アカウントを使用する場合は、アクセス権を再度付与する必要があります。
+
+#Authenticator
+authenticatorStatusMessage=2要素認証は現在
+authenticatorFinishSetUpTitle=あなたの2要素認証
+authenticatorFinishSetUpMessage=Keycloakアカウントにサインインするたびに、2要素認証コードを入力するように求められます。
+authenticatorSubTitle=2要素認証を設定する
+authenticatorSubMessage=アカウントのセキュリティーを強化するには、利用可能な2要素認証の方式のうち少なくとも1つを有効にします。
+authenticatorMobileTitle=モバイル・オーセンティケーター
+authenticatorMobileMessage=モバイル・オーセンティケーターを使用して、2要素認証として確認コードを取得します。
+authenticatorMobileFinishSetUpMessage=オーセンティケーターはあなたの携帯電話にバインドされています。
+authenticatorActionSetup=セットアップ
+authenticatorSMSTitle=SMSコード
+authenticatorSMSMessage=Keycloakは、2要素認証として確認コードを携帯電話に送信します。
+authenticatorSMSFinishSetUpMessage=テキスト・メッセージが次の電話番号宛に送信されます:
+authenticatorDefaultStatus=デフォルト
+authenticatorChangePhone=電話番号の変更
+authenticatorBackupCodesTitle=バックアップ・コード
+authenticatorBackupCodesMessage=8桁のバックアップ・コードの入手
+authenticatorBackupCodesFinishSetUpMessage=この時点で12個のバックアップ・コードが生成されました。それぞれ一度だけ使用できます。
+
+#Authenticator - Mobile Authenticator setup
+authenticatorMobileSetupTitle=モバイル・オーセンティケーターのセットアップ
+smscodeIntroMessage=電話番号を入力すると、確認コードがあなたの電話に送信されます。
+mobileSetupStep1=携帯電話にオーセンティケーター・アプリケーションをインストールします。ここにリストされているアプリケーションがサポートされています。
+mobileSetupStep2=アプリケーションを開き、バーコードをスキャンしてください。
+mobileSetupStep3=アプリケーションから提供されたワンタイムコードを入力し、保存をクリックしてセットアップを終了します。
+scanBarCode=バーコードをスキャンしますか?
+enterBarCode=ワンタイムコードを入力してください
+doCopy=コピー
+doFinish=終了
+
+#Authenticator - SMS Code setup
+authenticatorSMSCodeSetupTitle=SMSコードのセットアップ
+chooseYourCountry=国を選んでください
+enterYourPhoneNumber=電話番号を入力してください
+sendVerficationCode=確認コードの送信
+enterYourVerficationCode=確認コードを入力してください
+
+#Authenticator - backup Code setup
+authenticatorBackupCodesSetupTitle=バックアップコードのセットアップ
+backupcodesIntroMessage=携帯電話にアクセスできない場合でも、バックアップコードを使用してアカウントにログインできます。どこか安全でアクセス可能な場所に保管してください。
+realmName=レルム
+doDownload=ダウンロード
+doPrint=印刷
+backupCodesTips-1=各バックアップコードは1回使用できます。
+backupCodesTips-2=これらのコードはこの日に生成されました:
+generateNewBackupCodes=新しいバックアップコードを生成する
+backupCodesTips-3=新しいバックアップコードを生成すると、現在のコードは機能しなくなります。
+backtoAuthenticatorPage=オーセンティケーター・ページに戻る
+
+
+#Resources
+resources=リソース
+sharedwithMe=私と共有
+share=共有
+sharedwith=共有
+accessPermissions=アクセス・パーミッション
+permissionRequests=パーミッション・リクエスト
+approve=承認
+approveAll=すべて承認
+people=人
+perPage=1ページあたり
+currentPage=現在のページ
+sharetheResource=リソースの共有
+group=グループ
+selectPermission=パーミッションを選択
+addPeople=あなたのリソースを共有する人を追加
+addTeam=あなたのリソースを共有するチームを追加
+myPermissions=私のパーミッション
+waitingforApproval=承認待ち
+anyPermission=任意のパーミッション
+
+# Openshift messages
+openshift.scope.user_info=ユーザー情報
+openshift.scope.user_check-access=ユーザーアクセス情報
+openshift.scope.user_full=フルアクセス
+openshift.scope.list-projects=プロジェクトの一覧表示 \ No newline at end of file
diff --git a/account/messages/messages_lt.properties b/account/messages/messages_lt.properties
new file mode 100644
index 0000000..d6e4016
--- /dev/null
+++ b/account/messages/messages_lt.properties
@@ -0,0 +1,154 @@
+# encoding: utf-8
+doSave=Saugoti
+doCancel=Atšaukti
+
+doLogOutAllSessions=Atjungti visas sesijas
+doRemove=Šalinti
+doAdd=Pridėti
+doSignOut=Atsijungti
+
+editAccountHtmlTitle=Redaguoti paskyrą
+federatedIdentitiesHtmlTitle=Susietos paskyros
+accountLogHtmlTitle=Paskyros žurnalas
+changePasswordHtmlTitle=Keisti slaptažodį
+sessionsHtmlTitle=Prisijungimo sesijos
+accountManagementTitle=Keycloak Naudotojų Administravimas
+authenticatorTitle=Autentifikatorius
+applicationsHtmlTitle=Programos
+
+authenticatorCode=Vienkartinis kodas
+email=El. paštas
+firstName=Vardas
+givenName=Pavardė
+fullName=Pilnas vardas
+lastName=Pavardė
+familyName=Pavardė
+password=Slaptažodis
+passwordConfirm=Pakartotas slaptažodis
+passwordNew=Naujas slaptažodis
+username=Naudotojo vardas
+address=Adresas
+street=Gatvė
+locality=Miestas arba vietovė
+region=Rajonas
+postal_code=Pašto kodas
+country=Šalis
+emailVerified=El. pašto adresas patvirtintas
+gssDelegationCredential=GSS prisijungimo duomenų delegavimas
+
+role_admin=Administratorius
+role_realm-admin=Srities administravimas
+role_create-realm=Kurti sritį
+role_view-realm=Peržiūrėti sritį
+role_view-users=Peržiūrėti naudotojus
+role_view-applications=Peržiūrėti programas
+role_view-clients=Peržiūrėti klientines programas
+role_view-events=Peržiūrėti įvykių žurnalą
+role_view-identity-providers=Peržiūrėti tapatybės teikėjus
+role_manage-realm=Valdyti sritis
+role_manage-users=Valdyti naudotojus
+role_manage-applications=Valdyti programas
+role_manage-identity-providers=Valdyti tapatybės teikėjus
+role_manage-clients=Valdyti programas
+role_manage-events=Valdyti įvykius
+role_view-profile=Peržiūrėti paskyrą
+role_manage-account=Valdyti paskyrą
+role_read-token=Skaityti prieigos rakšą
+role_offline-access=Darbas neprisijungus
+role_uma_authorization=Įgauti UMA autorizavimo teises
+client_account=Paskyra
+client_security-admin-console=Saugumo administravimo konsolė
+client_admin-cli=Administravimo CLI
+client_realm-management=Srities valdymas
+client_broker=Tarpininkas
+
+
+requiredFields=Privalomi laukai
+allFieldsRequired=Visi laukai yra privalomi
+
+backToApplication=&laquo; Grįžti į programą
+backTo=Atgal į {0}
+
+date=Data
+event=Įvykis
+ip=IP
+client=Klientas
+clients=Klientai
+details=Detaliau
+started=Sukūrimo laikas
+lastAccess=Vėliausia prieiga
+expires=Galioja iki
+applications=Programos
+
+account=Paskyra
+federatedIdentity=Susieta tapatybė
+authenticator=Autentifikatorius
+sessions=Sesijos
+log=Įvykiai
+
+application=Programa
+availablePermissions=Galimos teisės
+grantedPermissions=Įgalintos teisės
+grantedPersonalInfo=Įgalinta asmeninė informacija
+additionalGrants=Papildomi įgaliojimai
+action=Veiksmas
+inResource=yra
+fullAccess=Pilna prieiga
+offlineToken=Režimo neprisijungus raktas (token)
+revoke=Atšaukti įgaliojimą
+
+configureAuthenticators=Sukonfigūruotas autentifikatorius
+mobile=Mobilus
+totpStep1=Įdiekite <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> arba Google Authenticator savo įrenginyje. Programėlės prieinamos <a href="https://play.google.com">Google Play</a> ir Apple App Store.
+totpStep2=Atidarykite programėlę ir nuskenuokite barkodą arba įveskite kodą.
+totpStep3=Įveskite programėlėje sugeneruotą vieną kartą galiojantį kodą ir paspauskite Saugoti norėdami prisijungti.
+
+missingUsernameMessage=Prašome įvesti naudotojo vardą.
+missingFirstNameMessage=Prašome įvesti vardą.
+invalidEmailMessage=Neteisingas el. pašto adresas.
+missingLastNameMessage=Prašome įvesti pavardę.
+missingEmailMessage=Prašome įvesti el. pašto adresą.
+missingPasswordMessage=Prašome įvesti slaptažodį.
+notMatchPasswordMessage=Slaptažodžiai nesutampa.
+
+missingTotpMessage=Prašome įvesti autentifikacijos kodą.
+invalidPasswordExistingMessage=Neteisingas dabartinis slaptažodis.
+invalidPasswordConfirmMessage=Pakartotas slaptažodis nesutampa.
+invalidTotpMessage=Neteisingas autentifikacijos kodas.
+
+usernameExistsMessage=Toks naudotojas jau egzistuoja.
+emailExistsMessage=El. pašto adresas jau egzistuoja.
+
+readOnlyUserMessage=Tik skaitymui sukonfigūruotos paskyros duomenų atnaujinti neleidžiama.
+readOnlyPasswordMessage=Tik skaitymui sukonfigūruotos paskyros slaptažodžio atnaujinti neleidžiama.
+
+successTotpMessage=Mobilus autentifikatorius sukonfigūruotas.
+successTotpRemovedMessage=Mobilus autentifikatorius pašalintas.
+
+successGrantRevokedMessage=Įgalinimas pašalintas sėkmingai.
+
+accountUpdatedMessage=Jūsų paskyros duomenys sėkmingai atnaujinti.
+accountPasswordUpdatedMessage=Jūsų paskyros slaptažodis pakeistas.
+
+missingIdentityProviderMessage=Nenurodytas tapatybės teikėjas.
+invalidFederatedIdentityActionMessage=Neteisingas arba nežinomas veiksmas.
+identityProviderNotFoundMessage=Nurodytas tapatybės teikėjas nerastas.
+federatedIdentityLinkNotActiveMessage=Nurodyta susieta tapatybė neaktyvi.
+federatedIdentityRemovingLastProviderMessage=Jūs negalite pašalinti paskutinio tapatybės teikėjo sąsajos, nes Jūs neturite nusistatę paskyros slaptažodžio.
+identityProviderRedirectErrorMessage=Klaida nukreipiant į tapatybės teikėjo puslapį.
+identityProviderRemovedMessage=Tapatybės teikėjas sėkmingai pašalintas.
+identityProviderAlreadyLinkedMessage=Susieta tapatybė iš {0} jau susieta su kita paskyra.
+staleCodeAccountMessage=Puslapio galiojimas baigėsi. Bandykite dar kartą.
+consentDenied=Prieiga draudžiama.
+
+accountDisabledMessage=Paskyros galiojimas sustabdytas, kreipkitės į administratorių.
+
+accountTemporarilyDisabledMessage=Paskyros galiojimas laikinai sustabdytas. Kreipkitės į administratorių arba pabandykite vėliau.
+invalidPasswordMinLengthMessage=Per trumpas slaptažodis: mažiausias ilgis {0}.
+invalidPasswordMinLowerCaseCharsMessage=Neteisingas slaptažodis: privaloma įvesti {0} mažąją raidę.
+invalidPasswordMinDigitsMessage=Neteisingas slaptažodis: privaloma įvesti {0} skaitmenį.
+invalidPasswordMinUpperCaseCharsMessage=Neteisingas slaptažodis: privaloma įvesti {0} didžiąją raidę.
+invalidPasswordMinSpecialCharsMessage=Neteisingas slaptažodis: privaloma įvesti {0} specialų simbolį.
+invalidPasswordNotUsernameMessage=Neteisingas slaptažodis: slaptažodis negali sutapti su naudotojo vardu.
+invalidPasswordRegexPatternMessage=Neteisingas slaptažodis: slaptažodis netenkina regex taisyklės(ių).
+invalidPasswordHistoryMessage=Neteisingas slaptažodis: slaptažodis negali sutapti su prieš tai buvusiais {0} slaptažodžiais. \ No newline at end of file
diff --git a/account/messages/messages_nl.properties b/account/messages/messages_nl.properties
new file mode 100644
index 0000000..80e5503
--- /dev/null
+++ b/account/messages/messages_nl.properties
@@ -0,0 +1,133 @@
+doSave=Opslaan
+doCancel=Annuleer
+doLogOutAllSessions=Alle sessies uitloggen
+doRemove=Verwijder
+doAdd=Voeg toe
+doSignOut=Afmelden
+editAccountHtmlTitle=Bewerk account
+federatedIdentitiesHtmlTitle=Federated Identities
+accountLogHtmlTitle=Account log
+changePasswordHtmlTitle=Verander wachtwoord
+sessionsHtmlTitle=Sessies
+accountManagementTitle=Keycloak Accountbeheer
+authenticatorTitle=Authenticator
+applicationsHtmlTitle=Toepassingen
+authenticatorCode=Eenmalige code
+email=E-mailadres
+firstName=Voornaam
+givenName=Voornaam
+fullName=Volledige naam
+lastName=Achternaam
+familyName=Achternaam
+password=Wachtwoord
+passwordConfirm=Bevestiging
+passwordNew=Nieuw Wachtwoord
+username=Gebruikersnaam
+address=Adres
+street=Straat
+locality=Stad of plaats
+region=Staat, provincie of regio
+postal_code=Postcode
+country=Land
+emailVerified=E-mailadres geverifieerd
+gssDelegationCredential=GSS gedelegeerde aanmeldgegevens
+role_admin=Beheer
+role_realm-admin=Realmbeheer
+role_create-realm=Creëer realm
+role_view-realm=Bekijk realm
+role_view-users=Bekijk gebruikers
+role_view-applications=Bekijk toepassingen
+role_view-clients=Bekijk clients
+role_view-events=Bekijk gebeurtenissen
+role_view-identity-providers=Bekijk identity providers
+role_manage-realm=Beheer realm
+role_manage-users=Beheer gebruikers
+role_manage-applications=Beheer toepassingen
+role_manage-identity-providers=Beheer identity providers
+role_manage-clients=Beheer clients
+role_manage-events=Beheer gebeurtenissen
+role_view-profile=Bekijk profiel
+role_manage-account=Beheer account
+role_manage-account-links=Beheer accountkoppelingen
+role_read-token=Lees token
+role_offline-access=Offline toegang
+role_uma_authorization=Verkrijg UMA rechten
+client_account=Account
+client_security-admin-console=Console Veligheidsbeheer
+client_admin-cli=Beheer CLI
+client_realm-management=Realmbeheer
+client_broker=Broker
+requiredFields=Verplichte velden
+allFieldsRequired=Alle velden verplicht
+backToApplication=&laquo; Terug naar toepassing
+backTo=Terug naar {0}
+date=Datum
+event=Gebeurtenis
+ip=IP
+client=Client
+clients=Clients
+details=Details
+started=Gestart
+lastAccess=Laatste toegang
+expires=Vervalt
+applications=Toepassingen
+account=Account
+federatedIdentity=Federated Identity
+authenticator=Authenticator
+sessions=Sessies
+log=Log
+application=Toepassing
+availablePermissions=Beschikbare rechten
+grantedPermissions=Gegunde rechten
+grantedPersonalInfo=Gegunde Persoonsgegevens
+additionalGrants=Verdere vergunningen
+action=Actie
+inResource=in
+fullAccess=Volledige toegang
+offlineToken=Offline Token
+revoke=Vergunning intrekken
+configureAuthenticators=Ingestelde authenticators
+mobile=Mobiel nummer
+totpStep1=Installeer een van de onderstaande applicaties op uw mobiele apparaat:
+totpStep2=Open de toepassing en scan de QR-code of voer de sleutel in.
+totpStep3=Voer de door de toepassing gegeven eenmalige code in en klik op Opslaan om de configuratie af te ronden.
+missingUsernameMessage=Gebruikersnaam ontbreekt.
+missingFirstNameMessage=Voornaam onbreekt.
+invalidEmailMessage=Ongeldig e-mailadres.
+missingLastNameMessage=Achternaam ontbreekt.
+missingEmailMessage=E-mailadres ontbreekt.
+missingPasswordMessage=Wachtwoord ontbreekt.
+notMatchPasswordMessage=Wachtwoorden komen niet overeen.
+missingTotpMessage=Authenticatiecode ontbreekt.
+invalidPasswordExistingMessage=Ongeldig bestaand wachtwoord.
+invalidPasswordConfirmMessage=Wachtwoordbevestiging komt niet overeen.
+invalidTotpMessage=Ongeldige authenticatiecode.
+emailExistsMessage=E-mailadres bestaat reeds.
+readOnlyUserMessage=U kunt uw account niet bijwerken aangezien het account alleen-lezen is.
+readOnlyPasswordMessage=U kunt uw wachtwoord niet wijzigen omdat uw account alleen-lezen is.
+successTotpMessage=Mobiele authenticator geconfigureerd.
+successTotpRemovedMessage=Mobiele authenticator verwijderd.
+successGrantRevokedMessage=Vergunning succesvol ingetrokken
+accountUpdatedMessage=Uw account is gewijzigd.
+accountPasswordUpdatedMessage=Uw wachtwoord is gewijzigd.
+missingIdentityProviderMessage=Geen identity provider aangegeven.
+invalidFederatedIdentityActionMessage=Ongeldige of ontbrekende actie op federated identity.
+identityProviderNotFoundMessage=Gespecificeerde identity provider niet gevonden.
+federatedIdentityLinkNotActiveMessage=Deze federated identity is niet langer geldig.
+federatedIdentityRemovingLastProviderMessage=U kunt de laatste federated identity provider niet verwijderen aangezien u dan niet langer zou kunnen inloggen.
+identityProviderRedirectErrorMessage=Kon niet herverwijzen naar identity provider.
+identityProviderRemovedMessage=Identity provider met succes verwijderd.
+identityProviderAlreadyLinkedMessage=Door {0} teruggegeven federated identity is al gekoppeld aan een andere gebruiker.
+staleCodeAccountMessage=De pagina is verlopen. Probeer het nogmaals.
+consentDenied=Toestemming geweigerd
+accountDisabledMessage=Account is gedeactiveerd. Contacteer de beheerder.
+accountTemporarilyDisabledMessage=Account is tijdelijk deactiveerd, neem contact op met de beheerder of probeer het later opnieuw.
+invalidPasswordMinLengthMessage=Ongeldig wachtwoord: de minimale lengte is {0} karakters.
+invalidPasswordMinLowerCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} kleine letters bevatten.
+invalidPasswordMinDigitsMessage=Ongeldig wachtwoord: het moet minstens {0} getallen bevatten.
+invalidPasswordMinUpperCaseCharsMessage=Ongeldig wachtwoord: het moet minstens {0} hoofdletters bevatten.
+invalidPasswordMinSpecialCharsMessage=Ongeldig wachtwoord: het moet minstens {0} speciale karakters bevatten.
+invalidPasswordNotUsernameMessage=Ongeldig wachtwoord: het mag niet overeenkomen met de gebruikersnaam.
+invalidPasswordRegexPatternMessage=Ongeldig wachtwoord: het voldoet niet aan het door de beheerder ingestelde patroon.
+invalidPasswordHistoryMessage=Ongeldig wachtwoord: het mag niet overeen komen met een van de laatste {0} wachtwoorden.
+invalidPasswordGenericMessage=Ongeldig wachtwoord: het nieuwe wachtwoord voldoet niet aan het wachtwoordbeleid.
diff --git a/account/messages/messages_no.properties b/account/messages/messages_no.properties
new file mode 100644
index 0000000..6fac5fb
--- /dev/null
+++ b/account/messages/messages_no.properties
@@ -0,0 +1,165 @@
+doSave=Lagre
+doCancel=Avbryt
+doLogOutAllSessions=Logg ut av alle sesjoner
+doRemove=Fjern
+doAdd=Legg til
+doSignOut=Logg ut
+
+editAccountHtmlTitle=Rediger konto
+federatedIdentitiesHtmlTitle=Federerte identiteter
+accountLogHtmlTitle=Kontologg
+changePasswordHtmlTitle=Endre passord
+sessionsHtmlTitle=Sesjoner
+accountManagementTitle=Keycloak kontoadministrasjon
+authenticatorTitle=Autentikator
+applicationsHtmlTitle=Applikasjoner
+
+authenticatorCode=Engangskode
+email=E-post
+firstName=Fornavn
+givenName=Fornavn
+fullName=Fullt navn
+lastName=Etternavn
+familyName=Etternavn
+password=Passord
+passwordConfirm=Bekreftelse
+passwordNew=Nytt passord
+username=Brukernavn
+address=Adresse
+street=Gate-/veinavn + husnummer
+locality=By
+region=Fylke
+postal_code=Postnummer
+country=Land
+emailVerified=E-post bekreftet
+gssDelegationCredential=GSS legitimasjonsdelegering
+
+role_admin=Administrator
+role_realm-admin=Administrator for sikkerhetsdomene
+role_create-realm=Opprette sikkerhetsdomene
+role_view-realm=Se sikkerhetsdomene
+role_view-users=Se brukere
+role_view-applications=Se applikasjoner
+role_view-clients=Se klienter
+role_view-events=Se hendelser
+role_view-identity-providers=Se identitetsleverand\u00F8rer
+role_manage-realm=Administrere sikkerhetsdomene
+role_manage-users=Administrere brukere
+role_manage-applications=Administrere applikasjoner
+role_manage-identity-providers=Administrere identitetsleverand\u00F8rer
+role_manage-clients=Administrere klienter
+role_manage-events=Administrere hendelser
+role_view-profile=Se profil
+role_manage-account=Administrere konto
+role_read-token=Lese token
+role_offline-access=Frakoblet tilgang
+role_uma_authorization=Skaffe tillatelser
+client_account=Konto
+client_security-admin-console=Sikkerhetsadministrasjonskonsoll
+client_admin-cli=Kommandolinje-grensesnitt for administrator
+client_realm-management=Sikkerhetsdomene-administrasjon
+client_broker=Broker
+
+
+requiredFields=Obligatoriske felt
+allFieldsRequired=Alle felt m\u00E5 fylles ut
+
+backToApplication=&laquo; Tilbake til applikasjonen
+backTo=Tilbake til {0}
+
+date=Dato
+event=Hendelse
+ip=IP
+client=Klient
+clients=Klienter
+details=Detaljer
+started=Startet
+lastAccess=Sist benyttet
+expires=Utl\u00F8per
+applications=Applikasjoner
+
+account=Konto
+federatedIdentity=Federert identitet
+authenticator=Autentikator
+sessions=Sesjoner
+log=Logg
+
+application=Applikasjon
+availablePermissions=Tilgjengelige rettigheter
+grantedPermissions=Innvilgede rettigheter
+grantedPersonalInfo=Innvilget personlig informasjon
+additionalGrants=Ekstra rettigheter
+action=Handling
+inResource=i
+fullAccess=Full tilgang
+offlineToken=Offline token
+revoke=Opphev rettighet
+
+configureAuthenticators=Konfigurerte autentikatorer
+mobile=Mobiltelefon
+totpStep1=Installer ett av f\u00F8lgende programmer p\u00E5 mobilen din.
+totpStep2=\u00C5pne applikasjonen og skann strekkoden eller skriv inn koden.
+totpStep3=Skriv inn engangskoden gitt av applikasjonen og klikk Lagre for \u00E5 fullf\u00F8re.
+
+missingUsernameMessage=Vennligst oppgi brukernavn.
+missingFirstNameMessage=Vennligst oppgi fornavn.
+invalidEmailMessage=Ugyldig e-postadresse.
+missingLastNameMessage=Vennligst oppgi etternavn.
+missingEmailMessage=Vennligst oppgi e-postadresse.
+missingPasswordMessage=Vennligst oppgi passord.
+notMatchPasswordMessage=Passordene er ikke like.
+
+missingTotpMessage=Vennligst oppgi engangskode.
+invalidPasswordExistingMessage=Ugyldig eksisterende passord.
+invalidPasswordConfirmMessage=Passordene er ikke like.
+invalidTotpMessage=Ugyldig engangskode.
+
+usernameExistsMessage=Brukernavnet finnes allerede.
+emailExistsMessage=E-postadressen finnes allerede.
+
+readOnlyUserMessage=Du kan ikke oppdatere kontoen din ettersom den er skrivebeskyttet.
+readOnlyPasswordMessage=Du kan ikke oppdatere passordet ditt ettersom kontoen din er skrivebeskyttet.
+
+successTotpMessage=Autentikator for mobiltelefon er konfigurert.
+successTotpRemovedMessage=Autentikator for mobiltelefon er fjernet.
+
+successGrantRevokedMessage=Vellykket oppheving av rettighet.
+
+accountUpdatedMessage=Kontoen din har blitt oppdatert.
+accountPasswordUpdatedMessage=Ditt passord har blitt oppdatert.
+
+missingIdentityProviderMessage=Identitetsleverand\u00F8r er ikke spesifisert.
+invalidFederatedIdentityActionMessage=Ugyldig eller manglende handling.
+identityProviderNotFoundMessage=Spesifisert identitetsleverand\u00F8r ikke funnet.
+federatedIdentityLinkNotActiveMessage=Denne identiteten er ikke lenger aktiv.
+federatedIdentityRemovingLastProviderMessage=Du kan ikke fjerne siste federerte identitet ettersom du ikke har et passord.
+identityProviderRedirectErrorMessage=Redirect til identitetsleverand\u00F8r feilet.
+identityProviderRemovedMessage=Fjerning av identitetsleverand\u00F8r var vellykket.
+identityProviderAlreadyLinkedMessage=Federert identitet returnert av {0} er allerede koblet til en annen bruker.
+staleCodeAccountMessage=Siden har utl\u00F8pt. Vennligst pr\u00F8v en gang til.
+consentDenied=Samtykke avsl\u00E5tt.
+
+accountDisabledMessage=Konto er deaktivert, kontakt administrator.
+
+accountTemporarilyDisabledMessage=Konto er midlertidig deaktivert, kontakt administrator eller pr\u00F8v igjen senere.
+invalidPasswordMinLengthMessage=Ugyldig passord: minimum lengde {0}.
+invalidPasswordMinLowerCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sm\u00E5 bokstaver.
+invalidPasswordMinDigitsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} sifre.
+invalidPasswordMinUpperCaseCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} store bokstaver.
+invalidPasswordMinSpecialCharsMessage=Ugyldig passord: m\u00E5 inneholde minimum {0} spesialtegn.
+invalidPasswordNotUsernameMessage=Ugyldig passord: kan ikke v\u00E6re likt brukernavn.
+invalidPasswordRegexPatternMessage=Ugyldig passord: tilfredsstiller ikke kravene for passord-m\u00F8nster.
+invalidPasswordHistoryMessage=Ugyldig passord: kan ikke v\u00E6re likt noen av de {0} foreg\u00E5ende passordene.
+
+locale_ca=Catal\u00E0
+locale_de=Deutsch
+locale_en=English
+locale_es=Espa\u00F1ol
+locale_fr=Fran\u00e7ais
+locale_it=Italian
+locale_ja=\u65E5\u672C\u8A9E
+locale_no=Norsk
+locale_nl=Nederlands
+locale_pt-BR=Portugu\u00EAs (Brasil)
+locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439
+locale_zh-CN=\u4e2d\u6587\u7b80\u4f53
diff --git a/account/messages/messages_pl.properties b/account/messages/messages_pl.properties
new file mode 100644
index 0000000..dd55d69
--- /dev/null
+++ b/account/messages/messages_pl.properties
@@ -0,0 +1 @@
+# encoding: UTF-8
diff --git a/account/messages/messages_pt_BR.properties b/account/messages/messages_pt_BR.properties
new file mode 100644
index 0000000..80e8515
--- /dev/null
+++ b/account/messages/messages_pt_BR.properties
@@ -0,0 +1,149 @@
+doSave=Salvar
+doCancel=Cancelar
+doLogOutAllSessions=Sair de todas as sess\u00F5es
+doRemove=Remover
+doAdd=Adicionar
+doSignOut=Sair
+
+editAccountHtmlTitle=Editar Conta
+federatedIdentitiesHtmlTitle=Identidades Federadas
+accountLogHtmlTitle=Log da conta
+changePasswordHtmlTitle=Alterar senha
+sessionsHtmlTitle=Sess\u00F5es
+accountManagementTitle=Gerenciamento de Conta
+authenticatorTitle=Autenticator
+applicationsHtmlTitle=Aplicativos
+
+authenticatorCode=C\u00F3digo autenticador
+email=E-mail
+firstName=Primeiro nome
+givenName=Primeiro nome
+fullName=Nome completo
+lastName=Sobrenome
+familyName=Sobrenome
+password=Senha
+passwordConfirm=Confirma\u00E7\u00E3o
+passwordNew=Nova senha
+username=Nome de us\u00FAario
+address=Endere\u00E7o
+street=Logradouro
+locality=Cidade ou Localidade
+region=Estado
+postal_code=CEP
+country=Pa\u00EDs
+emailVerified=E-mail verificado
+gssDelegationCredential=GSS Delega\u00E7\u00E3o de Credencial
+
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Cria realm
+role_view-realm=Visualiza realm
+role_view-users=Visualiza usu\u00E1rios
+role_view-applications=Visualiza aplica\u00E7\u00F5es
+role_view-clients=Visualiza clientes
+role_view-events=Visualiza eventos
+role_view-identity-providers=Visualiza provedores de identidade
+role_manage-realm=Gerencia realm
+role_manage-users=Gerencia usu\u00E1rios
+role_manage-applications=Gerencia aplica\u00E7\u00F5es
+role_manage-identity-providers=Gerencia provedores de identidade
+role_manage-clients=Gerencia clientes
+role_manage-events=Gerencia eventos
+role_view-profile=Visualiza perfil
+role_manage-account=Gerencia conta
+role_read-token=L\u00EA token
+role_offline-access=Acesso Offline
+role_uma_authorization=Obter permiss\u00F5es
+client_account=Conta
+client_security-admin-console=Console de Administra\u00E7\u00E3o de Seguran\u00E7a
+client_admin-cli=Admin CLI
+client_realm-management=Gerenciamento de Realm
+client_broker=Broker
+
+requiredFields=Campos obrigat\u00F3rios
+allFieldsRequired=Todos os campos s\u00E3o obrigat\u00F3rios
+
+backToApplication=&laquo; Voltar para aplica\u00E7\u00E3o
+backTo=Voltar para {0}
+
+date=Data
+event=Evento
+ip=IP
+client=Cliente
+clients=Clientes
+details=Detalhes
+started=Iniciado
+lastAccess=\u00DAltimo acesso
+expires=Expira
+applications=Aplicativos
+
+account=Conta
+federatedIdentity=Identidade Federada
+authenticator=Autenticador
+sessions=Sess\u00F5es
+log=Log
+
+application=Aplicativo
+availablePermissions=Permiss\u00F5es Dispon\u00EDveis
+grantedPermissions=Permiss\u00F5es Concedidas
+grantedPersonalInfo=Informa\u00E7\u00F5es Pessoais Concedidas
+additionalGrants=Concess\u00F5es Adicionais
+action=A\u00E7\u00E3o
+inResource=em
+fullAccess=Acesso Completo
+offlineToken=Offline Token
+revoke=Revogar Concess\u00F5es
+
+configureAuthenticators=Autenticadores Configurados
+mobile=Mobile
+totpStep1=Instalar <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> ou Google Authenticator em seu dispositivo. Ambas aplica\u00E7\u00F5es est\u00E3o dispon\u00EDveis no <a href="https://play.google.com">Google Play</a> e na Apple App Store.
+totpStep2=Abra o aplicativo e escaneie o c\u00F3digo de barras ou entre com o c\u00F3digo.
+totpStep3=Digite o c\u00F3digo fornecido pelo aplicativo e clique em Salvar para concluir a configura\u00E7\u00E3o.
+
+missingUsernameMessage=Por favor, especifique o nome de usu\u00E1rio.
+missingFirstNameMessage=Por favor, informe o primeiro nome.
+invalidEmailMessage=E-mail inv\u00E1lido.
+missingLastNameMessage=Por favor, informe o sobrenome.
+missingEmailMessage=Por favor, informe o e-mail.
+missingPasswordMessage=Por favor, informe a senha.
+notMatchPasswordMessage=As senhas n\u00E3o coincidem.
+
+missingTotpMessage=Por favor, informe o c\u00F3digo autenticador.
+invalidPasswordExistingMessage=Senha atual inv\u00E1lida.
+invalidPasswordConfirmMessage=A senha de confirma\u00E7\u00E3o n\u00E3o coincide.
+invalidTotpMessage=C\u00F3digo autenticador inv\u00E1lido.
+
+usernameExistsMessage=Este nome de usu\u00E1rio j\u00E1 existe.
+emailExistsMessage=Este e-mail j\u00E1 existe.
+
+readOnlyUserMessage=Voc\u00EA n\u00E3o pode atualizar sua conta, uma vez que \u00E9 apenas de leitura
+readOnlyPasswordMessage=Voc\u00EA n\u00E3o pode atualizar sua senha, sua conta \u00E9 somente leitura
+
+successTotpMessage=Autenticador mobile configurado.
+successTotpRemovedMessage=Autenticador mobile removido.
+
+successGrantRevokedMessage=Concess\u00F5es revogadas com sucesso.
+
+accountUpdatedMessage=Sua conta foi atualizada
+accountPasswordUpdatedMessage=Sua senha foi atualizada
+
+missingIdentityProviderMessage=Provedor de identidade n\u00E3o especificado
+invalidFederatedIdentityActionMessage=A\u00E7\u00E3o inv\u00E1lida ou ausente
+identityProviderNotFoundMessage=O provedor de identidade especificado n\u00E3o foi encontrado
+federatedIdentityLinkNotActiveMessage=Esta identidade n\u00E3o est\u00E1 mais em atividade
+federatedIdentityRemovingLastProviderMessage=Voc\u00EA n\u00E3o pode remover a \u00FAltima identidade federada como voc\u00EA n\u00E3o tem senha
+identityProviderRedirectErrorMessage=Falha ao redirecionar para o provedor de identidade
+identityProviderRemovedMessage=Provedor de identidade removido com sucesso
+identityProviderAlreadyLinkedMessage=Identidade federada retornado por {0} j\u00E1 est\u00E1 ligado a outro usu\u00E1rio.
+
+accountDisabledMessage=Conta desativada, contate o administrador
+
+accountTemporarilyDisabledMessage=A conta est\u00E1 temporariamente indispon\u00EDvel, contate o administrador ou tente novamente mais tarde
+invalidPasswordMinLengthMessage=Senha inv\u00E1lida\: comprimento m\u00EDnimo {0}
+invalidPasswordMinLowerCaseCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) min\u00FAsculo
+invalidPasswordMinDigitsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} n\u00FAmero(s)
+invalidPasswordMinUpperCaseCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) mai\u00FAsculo
+invalidPasswordMinSpecialCharsMessage=Senha inv\u00E1lida\: deve conter pelo menos {0} caractere(s) especial
+invalidPasswordNotUsernameMessage=Senha inv\u00E1lida\: n\u00E3o deve ser igual ao nome de usu\u00E1rio
+invalidPasswordRegexPatternMessage=Senha inv\u00E1lida\: n\u00E3o corresponde ao padr\u00E3o da express\u00E3o regular.
+invalidPasswordHistoryMessage=Senha inv\u00E1lida\: n\u00E3o pode ser igual a qualquer uma das {0} \u00FAltimas senhas. \ No newline at end of file
diff --git a/account/messages/messages_ru.properties b/account/messages/messages_ru.properties
new file mode 100644
index 0000000..a9716b8
--- /dev/null
+++ b/account/messages/messages_ru.properties
@@ -0,0 +1,155 @@
+# encoding: utf-8
+doSave=Сохранить
+doCancel=Отмена
+doLogOutAllSessions=Выйти из всех сессий
+doRemove=Удалить
+doAdd=Добавить
+doSignOut=Выход
+
+editAccountHtmlTitle=Изменение учетной записи
+federatedIdentitiesHtmlTitle=Федеративные идентификаторы
+accountLogHtmlTitle=Лог учетной записи
+changePasswordHtmlTitle=Смена пароля
+sessionsHtmlTitle=Сессии
+accountManagementTitle=Управление учетной записью
+authenticatorTitle=Аутентификатор
+applicationsHtmlTitle=Приложения
+
+authenticatorCode=Одноразовый код
+email=E-mail
+firstName=Имя
+givenName=Имя
+fullName=Полное имя
+lastName=Фамилия
+familyName=Фамилия
+password=Пароль
+passwordConfirm=Подтверждение пароля
+passwordNew=Новый пароль
+username=Имя пользователя
+address=Адрес
+street=Улица
+locality=Город
+region=Регион
+postal_code=Почтовый индекс
+country=Страна
+emailVerified=E-mail подтвержден
+gssDelegationCredential=Делегирование учетных данных через GSS
+
+role_admin=Администратор
+role_realm-admin=Администратор realm
+role_create-realm=Создать realm
+role_view-realm=Просмотр realm
+role_view-users=Просмотр пользователей
+role_view-applications=Просмотр приложений
+role_view-clients=Просмотр клиентов
+role_view-events=Просмотр событий
+role_view-identity-providers=Просмотр провайдеров учетных записей
+role_manage-realm=Управление realm
+role_manage-users=Управление пользователями
+role_manage-applications=Управление приложениями
+role_manage-identity-providers=Управление провайдерами учетных записей
+role_manage-clients=Управление клиентами
+role_manage-events=Управление событиями
+role_view-profile=Просмотр профиля
+role_manage-account=Управление учетной записью
+role_read-token=Чтение токена
+role_offline-access=Доступ оффлайн
+role_uma_authorization=Получение разрешений
+client_account=Учетная запись
+client_security-admin-console=Консоль администратора безопасности
+client_admin-cli=Командный интерфейс администратора
+client_realm-management=Управление Realm
+client_broker=Брокер
+
+
+requiredFields=Обязательные поля
+allFieldsRequired=Все поля обязательны
+
+backToApplication=&laquo; Назад в приложение
+backTo=Назад в {0}
+
+date=Дата
+event=Событие
+ip=IP
+client=Клиент
+clients=Клиенты
+details=Детали
+started=Начата
+lastAccess=Последний доступ
+expires=Истекает
+applications=Приложения
+
+account=Учетная запись
+federatedIdentity=Федеративный идентификатор
+authenticator=Аутентификатор
+sessions=Сессии
+log=Журнал
+
+application=Приложение
+availablePermissions=Доступные разрешения
+grantedPermissions=Согласованные разрешения
+grantedPersonalInfo=Согласованная персональная информация
+additionalGrants=Дополнительные согласования
+action=Действие
+inResource=в
+fullAccess=Полный доступ
+offlineToken=Оффлайн токен
+revoke=Отозвать согласование
+
+configureAuthenticators=Сконфигурированные аутентификаторы
+mobile=Мобильное приложение
+totpStep1=Установите <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> или Google Authenticator. Оба приложения доступны на <a href="https://play.google.com">Google Play</a> и в Apple App Store.
+totpStep2=Откройте приложение и просканируйте баркод, либо введите ключ.
+totpStep3=Введите одноразовый код, выданный приложением, и нажмите сохранить для завершения установки.
+
+missingUsernameMessage=Введите имя пользователя.
+missingFirstNameMessage=Введите имя.
+invalidEmailMessage=Введите корректный E-mail.
+missingLastNameMessage=Введите фамилию.
+missingEmailMessage=Введите E-mail.
+missingPasswordMessage=Введите пароль.
+notMatchPasswordMessage=Пароли не совпадают.
+
+missingTotpMessage=Введите код аутентификатора.
+invalidPasswordExistingMessage=Существующий пароль неверный.
+invalidPasswordConfirmMessage=Подтверждение пароля не совпадает.
+invalidTotpMessage=Неверный код аутентификатора.
+
+usernameExistsMessage=Имя пользователя уже существует.
+emailExistsMessage=E-mail уже существует.
+
+readOnlyUserMessage=Вы не можете обновить информацию вашей учетной записи, т.к. она доступна только для чтения.
+readOnlyPasswordMessage=Вы не можете обновить пароль вашей учетной записи, т.к. он доступен только для чтения.
+
+successTotpMessage=Аутентификатор в мобильном приложении сконфигурирован.
+successTotpRemovedMessage=Аутентификатор в мобильном приложении удален.
+
+successGrantRevokedMessage=Согласование отозвано успешно.
+
+accountUpdatedMessage=Ваша учетная запись обновлена.
+accountPasswordUpdatedMessage=Ваш пароль обновлен.
+
+missingIdentityProviderMessage=Провайдер учетных записей не задан.
+invalidFederatedIdentityActionMessage=Некорректное или недопустимое действие.
+identityProviderNotFoundMessage=Заданный провайдер учетных записей не найден.
+federatedIdentityLinkNotActiveMessage=Идентификатор больше не активен.
+federatedIdentityRemovingLastProviderMessage=Вы не можете удалить последний федеративный идентификатор, т.к. Вы не имеете пароля.
+identityProviderRedirectErrorMessage=Ошибка перенаправления в провайдер учетных записей.
+identityProviderRemovedMessage=Провайдер учетных записей успешно удален.
+identityProviderAlreadyLinkedMessage=Федеративный идентификатор, возвращенный {0} уже используется другим пользователем.
+staleCodeAccountMessage=Страница устарела. Попробуйте еще раз.
+consentDenied=В согласовании отказано.
+
+accountDisabledMessage=Учетная запись заблокирована, обратитесь к администратору.
+
+accountTemporarilyDisabledMessage=Учетная запись временно заблокирована, обратитесь к администратору или попробуйте позже.
+invalidPasswordMinLengthMessage=Некорректный пароль: длина пароля должна быть не менее {0} символа(ов).
+invalidPasswordMinLowerCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символа(ов) в нижнем регистре.
+invalidPasswordMinDigitsMessage=Некорректный пароль: пароль должен содержать не менее {0} цифр(ы).
+invalidPasswordMinUpperCaseCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} символа(ов) в верхнем регистре.
+invalidPasswordMinSpecialCharsMessage=Некорректный пароль: пароль должен содержать не менее {0} спецсимвола(ов).
+invalidPasswordNotUsernameMessage=Некорректный пароль: пароль не должен совпадать с именем пользователя.
+invalidPasswordRegexPatternMessage=Некорректный пароль: пароль не удовлетворяет регулярному выражению.
+invalidPasswordHistoryMessage=Некорректный пароль: пароль не должен совпадать с последним(и) {0} паролями.
+invalidPasswordGenericMessage=Некорректный пароль: новый пароль не соответствует правилам пароля.
+
diff --git a/account/messages/messages_sk.properties b/account/messages/messages_sk.properties
new file mode 100644
index 0000000..32cafc6
--- /dev/null
+++ b/account/messages/messages_sk.properties
@@ -0,0 +1,196 @@
+# encoding: utf-8
+doSave=Uložiť
+doCancel=Zrušiť
+doLogOutAllSessions=Odhlásenie všetkých relácií
+doRemove=Odstrániť
+doAdd=Pridať
+doSignOut=Odhlásiť
+
+editAccountHtmlTitle=Upraviť účet
+federatedIdentitiesHtmlTitle=Prepojená identita
+accountLogHtmlTitle=Denník zmien užívateľských účtov
+changePasswordHtmlTitle=Zmena hesla
+sessionsHtmlTitle=Relácie
+accountManagementTitle=Správa účtu Keycloak
+authenticatorTitle=Autentifikátor
+applicationsHtmlTitle=Aplikácie
+
+authenticatorCode=Jednorázový kód
+email=E-mail
+firstName=Meno
+givenName=Meno pri narodení
+fullName=Celé meno
+lastName=Priezvisko
+familyName=Rodné meno
+password=Heslo
+passwordConfirm=Potrvrdenie hesla
+passwordNew=Nové heslo
+username=Meno používateľa
+address=Adresa
+street=Ulica
+locality=Mesto alebo lokalita
+region=Kraj
+postal_code=PSČ
+country=Štát
+emailVerified=E-mail overený
+gssDelegationCredential=GSS delegované oprávnenie
+
+role_admin=Administrátor
+role_realm-admin=Administrátor realmu
+role_create-realm=Vytvoriť realm
+role_view-realm=Zobraziť realm
+role_view-users=Zobraziť používateľov
+role_view-applications=Zobraziť aplikácie
+role_view-clients=Zobraziť klientov
+role_view-events=Zobraziť udalosti
+role_view-identity-providers=Zobraziť klientov poskytovateľov identity
+role_manage-realm=Spravovať realm
+role_manage-users=Spravovať používateľov
+role_manage-applications=Spravovať aplikácie
+role_manage-identity-providers=Spravovať poskytovateľov identity
+role_manage-clients=Spravovať klientov
+role_manage-events=Spravovať udalosti
+role_view-profile=Zobraziť profil
+role_manage-account=Spravovať účet
+role_manage-account-links=Spravovať odkazy na účet
+role_read-token=Čítať token
+role_offline-access=Offline prístup
+role_uma_authorization=Autorizácia používateľom riadeného prístupu
+client_account=Účet klienta
+client_security-admin-console=Bezpečnostná administrátorská konzola
+client_admin-cli=Spravovať CLI klienta
+client_realm-management=Spravovať realmy klienta
+client_broker=Broker
+
+
+requiredFields=Povinné polia
+allFieldsRequired=Všetky požadované polia
+
+backToApplication=&laquo; Späť na aplikáciu
+backTo=Späť na {0}
+
+date=Dátum
+event=Udalosť
+ip=IP
+client=Klient
+clients=Klienti
+details=Podrobnosti
+started=Začíname
+lastAccess=Posledný prístup
+expires=Vyprší
+applications=Aplikácie
+
+account=Účet
+federatedIdentity=Prepojená identita
+authenticator=Autentifikátor
+sessions=Relácie
+log=Denník
+
+application=Aplikácia
+availablePermissions=Dostupné oprávnenia
+grantedPermissions=Pridelené oprávnenia
+grantedPersonalInfo=Poskytnuté osobné informácie
+additionalGrants=Dodatočné oprávnenia
+action=Akcia
+inResource=v
+fullAccess=Úplný prístup
+offlineToken=Offline token
+revoke=Zrušiť oprávnenie
+
+configureAuthenticators=Nakonfigurované autentifikátory
+mobile=Mobilný
+totpStep1=Nainštalujte vo svojom zariadení <a href="https://freeotp.github.io/" target="_blank"> FreeOTP </a> alebo Google Authenticator. Obidve aplikácie sú k dispozícii v <a href="https://play.google.com"> Google Play </a> a Apple App Store.
+totpStep2=Otvorte aplikáciu a naskenujte čiarový kód alebo zadajte kľúč.
+totpStep3=Zadajte jednorazový kód poskytnutý aplikáciou a kliknutím na tlačidlo Uložiť dokončíte nastavenie.
+
+totpManualStep2=Otvorte aplikáciu a zadajte kľúč
+totpManualStep3=Použite nasledujúce hodnoty konfigurácie, ak aplikácia umožňuje ich nastavenie
+totpUnableToScan=Nemožno skenovať?
+totpScanBarcode=Skenovanie čiarového kódu?
+
+totp.totp=Založené na čase
+totp.hotp=Založené na počítadle
+
+totpType=Typ
+totpAlgorithm=Algoritmus
+totpDigits=Číslica
+totpInterval=Interval
+totpCounter=Počítadlo
+
+missingUsernameMessage=Zadajte používateľské meno.
+missingFirstNameMessage=Zadajte meno.
+invalidEmailMessage=Neplatná e-mailová adresa.
+missingLastNameMessage=Zadajte priezvisko.
+missingEmailMessage=Zadajte e-mail.
+missingPasswordMessage=Zadajte heslo, prosím.
+notMatchPasswordMessage=Heslá sa nezhodujú.
+
+missingTotpMessage=Zadajte jednorazový kód, prosím
+invalidPasswordExistingMessage=Neplatné existujúce heslo.
+invalidPasswordConfirmMessage=Potvrdenie hesla sa nezhoduje.
+invalidTotpMessage=Neplatný jednorazový kód.
+
+usernameExistsMessage=Užívateľské meno už existuje.
+emailExistsMessage=E-mail už existuje.
+
+readOnlyUserMessage=Váš účet nemôžete aktualizovať, pretože je iba na čítanie.
+readOnlyUsernameMessage=Nemôžete aktualizovať svoje používateľské meno, pretože je iba na čítanie.
+readOnlyPasswordMessage=Heslo nemôžete aktualizovať, pretože váš účet je iba na čítanie.
+
+successTotpMessage=Konfigurácia mobilného autentifikátora.
+successTotpRemovedMessage=Mobilný autentifikátor bol odstránený.
+
+successGrantRevokedMessage=Oprávnenie bolo úspešne zrušené.
+
+accountUpdatedMessage=Váš účet bol aktualizovaný.
+accountPasswordUpdatedMessage=Vaše heslo bolo aktualizované.
+
+missingIdentityProviderMessage=Poskytovateľ identity nie je zadaný.
+invalidFederatedIdentityActionMessage=Neplatná alebo chýbajúca akcia.
+identityProviderNotFoundMessage=Zadaný poskytovateľ identity nenájdený.
+federatedIdentityLinkNotActiveMessage=Identita už nie je aktívna.
+federatedIdentityRemovingLastProviderMessage=Nemôžete odstrániť poslednú spojenú identitu, pretože nemáte heslo.
+identityProviderRedirectErrorMessage=Nepodarilo sa presmerovať na poskytovateľa identity.
+identityProviderRemovedMessage=Poskytovateľ identity bol úspešne odstránený.
+identityProviderAlreadyLinkedMessage=Spojená identita vrátená {0} je už prepojená s iným používateľom.
+staleCodeAccountMessage=Platnosť vypršala. Skúste ešte raz.
+consentDenied=Súhlas bol zamietnutý.
+
+accountDisabledMessage=Účet je zakázaný, kontaktujte správcu.
+
+accountTemporarilyDisabledMessage=Účet je dočasne zakázaný, kontaktujte administrátora alebo skúste neskôr.
+invalidPasswordMinLengthMessage=Neplatné heslo: minimálna dĺžka {0}.
+invalidPasswordMinLowerCaseCharsMessage=Neplatné heslo: musí obsahovať minimálne {0} malé písmená.
+invalidPasswordMinDigitsMessage=Neplatné heslo: musí obsahovať aspoň {0} číslic.
+invalidPasswordMinUpperCaseCharsMessage=Neplatné heslo: musí obsahovať aspoň {0} veľké písmená.
+invalidPasswordMinSpecialCharsMessage=Neplatné heslo: musí obsahovať aspoň {0} špeciálne znaky.
+invalidPasswordNotUsernameMessage=Neplatné heslo: nesmie byť rovnaké ako používateľské meno.
+invalidPasswordRegexPatternMessage=Neplatné heslo: nezodpovedá regulárnemu výrazu.
+invalidPasswordHistoryMessage=Neplatné heslo: nesmie sa rovnať žiadnemu z posledných {0} hesiel.
+invalidPasswordBlacklistedMessage=Neplatné heslo: heslo je na čiernej listine.
+invalidPasswordGenericMessage=Neplatné heslo: nové heslo nezodpovedá pravidlám hesiel.
+
+# Authorization
+myResources=Moje Zdroje
+myResourcesSub=Moje zdroje
+doDeny=Zakázať
+doRevoke=Odvolať
+doApprove=Schváliť
+doRemoveSharing=Odstránenie zdieľania
+doRemoveRequest=Odstrániť požiadavku
+peopleAccessResource=Ľudia s prístupom k tomuto zdroju
+name=Názov
+scopes=Rozsahy
+resource=Zdroj
+user=Používateľ
+peopleSharingThisResource=Ľudia zdieľajúci tento zdroj
+shareWithOthers=Zdieľať s ostatnými
+needMyApproval=Potrebuje môj súhlas
+requestsWaitingApproval=Vaše požiadavky čakajú na schválenie
+icon=Ikona
+requestor=Žiadateľ
+owner=Vlastník
+resourcesSharedWithMe=Zdroje zdieľané so mnou
+permissionRequestion=Žiadosti o povolenie
+permission=Oprávnenie
+shares=podiel (y)
diff --git a/account/messages/messages_sv.properties b/account/messages/messages_sv.properties
new file mode 100644
index 0000000..cc134cd
--- /dev/null
+++ b/account/messages/messages_sv.properties
@@ -0,0 +1,150 @@
+# encoding: utf-8
+doSave=Spara
+doCancel=Avbryt
+doLogOutAllSessions=Logga ut från samtliga sessioner
+doRemove=Ta bort
+doAdd=Lägg till
+doSignOut=Logga ut
+
+editAccountHtmlTitle=Redigera konto
+federatedIdentitiesHtmlTitle=Federerade identiteter
+accountLogHtmlTitle=Kontologg
+changePasswordHtmlTitle=Byt lösenord
+sessionsHtmlTitle=Sessioner
+accountManagementTitle=Kontohantering för Keycloak
+authenticatorTitle=Autentiserare
+applicationsHtmlTitle=Applikationer
+
+authenticatorCode=Engångskod
+email=E-post
+firstName=Förnamn
+lastName=Efternamn
+password=Lösenord
+passwordConfirm=Bekräftelse
+passwordNew=Nytt lösenord
+username=Användarnamn
+address=Adress
+street=Gata
+locality=Postort
+region=Stat, Provins eller Region
+postal_code=Postnummer
+country=Land
+emailVerified=E-post verifierad
+gssDelegationCredential=GSS Delegation Credential
+
+role_admin=Administratör
+role_realm-admin=Realm-administratör
+role_create-realm=Skapa realm
+role_view-realm=Visa realm
+role_view-users=Visa användare
+role_view-applications=Visa applikationer
+role_view-clients=Visa klienter
+role_view-events=Visa event
+role_view-identity-providers=Visa identitetsleverantörer
+role_manage-realm=Hantera realm
+role_manage-users=Hantera användare
+role_manage-applications=Hantera applikationer
+role_manage-identity-providers=Hantera identitetsleverantörer
+role_manage-clients=Hantera klienter
+role_manage-events=Hantera event
+role_view-profile=Visa profil
+role_manage-account=Hantera konto
+role_read-token=Läs element
+role_offline-access=Åtkomst offline
+role_uma_authorization=Erhåll tillstånd
+client_account=Konto
+client_security-admin-console=Säkerhetsadministratörskonsol
+client_admin-cli=Administratörs-CLI
+client_realm-management=Realmhantering
+
+
+requiredFields=Obligatoriska fält
+allFieldsRequired=Samtliga fält krävs
+
+backToApplication=&laquo; Tillbaka till applikationen
+backTo=Tillbaka till {0}
+
+date=Datum
+event=Event
+ip=IP
+client=Klient
+clients=Klienter
+details=Detaljer
+started=Startade
+lastAccess=Senast åtkomst
+expires=Upphör
+applications=Applikationer
+
+account=Konto
+federatedIdentity=Federerad identitet
+authenticator=Autentiserare
+sessions=Sessioner
+log=Logg
+
+application=Applikation
+availablePermissions=Tillgängliga rättigheter
+grantedPermissions=Beviljade rättigheter
+grantedPersonalInfo=Medgiven personlig information
+additionalGrants=Ytterligare medgivanden
+action=Åtgärd
+inResource=i
+fullAccess=Fullständig åtkomst
+offlineToken=Offline token
+revoke=Upphäv rättighet
+
+configureAuthenticators=Konfigurerade autentiserare
+mobile=Mobil
+totpStep1=Installera <a href="https://freeotp.github.io/" target="_blank">FreeOTP</a> eller Google Authenticator på din enhet. Båda applikationerna finns tillgängliga på <a href="https://play.google.com">Google Play</a> och Apple App Store.
+totpStep2=Öppna applikationen och skanna streckkoden eller skriv i nyckeln.
+totpStep3=Fyll i engångskoden som tillhandahålls av applikationen och klicka på Spara för att avsluta inställningarna.
+
+missingUsernameMessage=Vänligen ange användarnamn.
+missingFirstNameMessage=Vänligen ange förnamn.
+invalidEmailMessage=Ogiltig e-postadress.
+missingLastNameMessage=Vänligen ange efternamn.
+missingEmailMessage=Vänligen ange e-post.
+missingPasswordMessage=Vänligen ange lösenord.
+notMatchPasswordMessage=Lösenorden matchar inte.
+
+missingTotpMessage=Vänligen ange autentiseringskoden.
+invalidPasswordExistingMessage=Det nuvarande lösenordet är ogiltigt.
+invalidPasswordConfirmMessage=Lösenordsbekräftelsen matchar inte.
+invalidTotpMessage=Autentiseringskoden är ogiltig.
+
+usernameExistsMessage=Användarnamnet finns redan.
+emailExistsMessage=E-posten finns redan.
+
+readOnlyUserMessage=Du kan inte uppdatera ditt konto eftersom det är skrivskyddat.
+readOnlyPasswordMessage=Du kan inte uppdatera ditt lösenord eftersom ditt konto är skrivskyddat.
+
+successTotpMessage=Mobilautentiseraren är inställd.
+successTotpRemovedMessage=Mobilautentiseraren är borttagen.
+
+successGrantRevokedMessage=Upphävandet av rättigheten lyckades.
+
+accountUpdatedMessage=Ditt konto har uppdaterats.
+accountPasswordUpdatedMessage=Ditt lösenord har uppdaterats.
+
+missingIdentityProviderMessage=Identitetsleverantör är inte angiven.
+invalidFederatedIdentityActionMessage=Åtgärden är ogiltig eller saknas.
+identityProviderNotFoundMessage=Angiven identitetsleverantör hittas inte.
+federatedIdentityLinkNotActiveMessage=Den här identiteten är inte längre aktiv.
+federatedIdentityRemovingLastProviderMessage=Du kan inte ta bort senaste federerade identiteten eftersom du inte har ett lösenord.
+identityProviderRedirectErrorMessage=Misslyckades med att omdirigera till identitetsleverantör.
+identityProviderRemovedMessage=Borttagningen av identitetsleverantören lyckades.
+identityProviderAlreadyLinkedMessage=Den federerade identiteten som returnerades av {0} är redan länkad till en annan användare.
+staleCodeAccountMessage=Sidan har upphört att gälla. Vänligen försök igen.
+consentDenied=Samtycket förnekades.
+
+accountDisabledMessage=Kontot är inaktiverat, kontakta administratör.
+
+accountTemporarilyDisabledMessage=Kontot är tillfälligt inaktiverat, kontakta administratör eller försök igen senare.
+invalidPasswordMinLengthMessage=Ogiltigt lösenord. Minsta längd är {0}.
+invalidPasswordMinLowerCaseCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} små bokstäver.
+invalidPasswordMinDigitsMessage=Ogiltigt lösenord: måste innehålla minst {0} siffror.
+invalidPasswordMinUpperCaseCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} stora bokstäver.
+invalidPasswordMinSpecialCharsMessage=Ogiltigt lösenord: måste innehålla minst {0} specialtecken.
+invalidPasswordNotUsernameMessage=Ogiltigt lösenord: Får inte vara samma som användarnamnet.
+invalidPasswordRegexPatternMessage=Ogiltigt lösenord: matchar inte kravet för lösenordsmönster.
+invalidPasswordHistoryMessage=Ogiltigt lösenord: Får inte vara samma som de senaste {0} lösenorden.
+invalidPasswordGenericMessage=Ogiltigt lösenord: Det nya lösenordet stämmer inte med lösenordspolicyn. \ No newline at end of file
diff --git a/account/messages/messages_tr.properties b/account/messages/messages_tr.properties
new file mode 100644
index 0000000..c83126d
--- /dev/null
+++ b/account/messages/messages_tr.properties
@@ -0,0 +1,341 @@
+doSave=Kaydet
+doCancel=\u0130ptal
+doLogOutAllSessions=T\u00FCm Oturumlar\u0131 Kapat
+doRemove=Sil
+doAdd=Ekle
+doSignOut=\u00C7\u0131k\u0131\u015F
+doLogIn=Oturum a\u00E7
+doLink=Ba\u011Flant\u0131
+
+
+editAccountHtmlTitle=Hesab\u0131m
+personalInfoHtmlTitle=Ki\u015Fisel bilgi
+federatedIdentitiesHtmlTitle=De\u011Fi\u015Ftirilen Kimlikler
+accountLogHtmlTitle=Kullan\u0131c\u0131 Loglar\u0131
+changePasswordHtmlTitle=\u015Eifre De\u011Fi\u015Ftirme
+deviceActivityHtmlTitle=Cihaz Etkinli\u011Fi
+sessionsHtmlTitle=Oturum
+accountManagementTitle=Keycloak Kullan\u0131c\u0131 Hesab\u0131 Y\u00F6netimi
+authenticatorTitle=Kimlik Do\u011Frulama
+applicationsHtmlTitle=Uygulama
+linkedAccountsHtmlTitle=Ba\u011Flant\u0131l\u0131 Hesaplar
+
+accountManagementWelcomeMessage=Keycloak Hesap Y\u00F6netimine Ho\u015F Geldiniz
+personalInfoIntroMessage=Temel bilgilerinizi y\u00F6netin
+accountSecurityTitle=Hesap G\u00FCvenli\u011Fi
+accountSecurityIntroMessage=\u015Eifrenizi ve hesap eri\u015Fiminizi kontrol edin
+applicationsIntroMessage=Hesab\u0131n\u0131za eri\u015Fmek i\u00E7in uygulama izninizi takip edin ve y\u00F6netin
+resourceIntroMessage=Kaynaklar\u0131n\u0131z\u0131 ekip \u00FCyeleri aras\u0131nda payla\u015F\u0131n
+passwordLastUpdateMessage=\u015Eifreniz g\u00FCncellendi
+updatePasswordTitle=\u015Eifre g\u00FCncelle
+updatePasswordMessageTitle=G\u00FC\u00E7l\u00FC bir \u015Fifre se\u00E7ti\u011Finizden emin olun
+updatePasswordMessage=G\u00FC\u00E7l\u00FC bir \u015Fifre, say\u0131lar, harfler ve sembollerin kar\u0131\u015F\u0131m\u0131ndan olu\u015Fmal\u0131d\u0131r. Tahmin etmesi zor ve ger\u00E7ek bir kelimeye benzemeyen \u015Fifre sadece bu hesap i\u00E7in kullan\u0131l\u0131r.
+personalSubTitle=Ki\u015Fisel Bilgileriniz
+personalSubMessage=Bu temel bilgileri y\u00F6netin: ad\u0131n\u0131z, soyad\u0131n\u0131z ve e-posta adresiniz
+
+authenticatorCode=Kimlik Do\u011Frulama Kodu
+email=E-Mail
+firstName=Ad
+givenName=Ad
+fullName=Ad Soyad
+lastName=Soyad
+familyName=Soyad
+password=\u015Eifre
+currentPassword=\u015Eimdiki \u015Eifre
+passwordConfirm=\u015Eifre Do\u011Frulama
+passwordNew=Yeni \u015Eifre
+username=Kullan\u0131c\u0131 Ad\u0131
+address=Adres
+street=Cadde
+region=B\u00F6lge
+postal_code=Posta Kodu
+locality=\u015Eehir
+country=\u00DClke
+emailVerified=E-Mail Do\u011Fruland\u0131
+gssDelegationCredential=GSS Yetki Bilgisi
+
+profileScopeConsentText=Kullan\u0131c\u0131 profili
+emailScopeConsentText=Email adresi
+addressScopeConsentText=Adres
+phoneScopeConsentText=Telefon numaras\u0131
+offlineAccessScopeConsentText=\u00C7evrimd\u0131\u015F\u0131 Eri\u015Fim
+samlRoleListScopeConsentText=Rollerim
+rolesScopeConsentText=Kullan\u0131c\u0131 rolleri
+
+role_admin=Admin
+role_realm-admin=Realm Admin
+role_create-realm=Realm Olu\u015Ftur
+role_view-realm=Realm g\u00F6r\u00FCnt\u00FCle
+role_view-users=Kullan\u0131c\u0131lar\u0131 g\u00F6r\u00FCnt\u00FCle
+role_view-applications=Uygulamalar\u0131 g\u00F6r\u00FCnt\u00FCle
+role_view-clients=\u0130stemci g\u00F6r\u00FCnt\u00FCle
+role_view-events=Olay g\u00F6r\u00FCnt\u00FCle
+role_view-identity-providers=Kimlik Sa\u011Flay\u0131c\u0131lar
+role_manage-realm=Realm y\u00F6net
+role_manage-users=Kullan\u0131c\u0131lar\u0131 y\u00F6net
+role_manage-applications=Uygulamalar\u0131 y\u00F6net
+role_manage-identity-providers=Kimlik Sa\u011Flay\u0131c\u0131lar\u0131 Y\u00F6net
+role_manage-clients=\u0130stemci y\u00F6net
+role_manage-events=Olay y\u00F6net
+role_view-profile=Profilleri g\u00F6r\u00FCnt\u00FCle
+role_manage-account=Profilleri Y\u00F6net
+role_manage-account-links=Profil ba\u011Flant\u0131lar\u0131n\u0131 y\u00F6net
+role_read-token=Token oku
+role_offline-access=\u00C7evirimd\u0131\u015F\u0131 Yetki
+role_uma_authorization=\u0130zinleri Al
+client_account=M\u00FC\u015Fteri Hesab\u0131
+client_security-admin-console=G\u00FCvenlik Y\u00F6netici Konsolu
+client_admin-cli=Admin CLI
+client_realm-management=Realm-Management
+client_broker=Broker
+
+requiredFields=Zorunlu Alanlar
+allFieldsRequired=T\u00FCm Alanlar Zorunlu
+
+backToApplication=&laquo; Uygulamaya D\u00F6n
+backTo=Geri D\u00F6n {0}
+
+date=G\u00FCn
+event=Olay
+ip=IP
+client=\u0130stemci
+clients=\u0130stemciler
+details=Detaylar
+started=Ba\u015Flang\u0131\u00E7 Tarihi
+lastAccess=Son Eri\u015Fim Tarihi
+expires=Son Kullanma Tarihi
+applications=Uygulama
+
+account=Hesap
+federatedIdentity=Federal Kimlik
+authenticator=Kimlik Do\u011Frulama
+device-activity=Cihaz Etkinli\u011Fi
+sessions=Oturum
+log=Log
+
+application=Uygulama
+availablePermissions=Kullan\u0131labilir \u0130zinler
+availableRoles=Kullan\u0131labilir Roller
+grantedPermissions=Verilen \u0130zinler
+grantedPersonalInfo=\u0130zin Verilen Ki\u015Fisel Bilgiler
+additionalGrants=Ek \u0130zinler
+action=Aksiyon
+inResource=Kaynak
+fullAccess=Tam Yetki
+offlineToken=\u00C7evirimd\u0131\u015F\u0131-Token
+revoke=\u0130zni \u0130ptal et
+
+configureAuthenticators=\u00C7oklu Kimlik Do\u011Frulama
+mobile=Mobil
+totpStep1=Ak\u0131ll\u0131 Telefonunuza a\u015Fa\u011F\u0131daki uygulamalardan birini y\u00FCkleyin:
+totpStep2=Uygulamay\u0131 a\u00E7\u0131n ve barkodu okutun.
+totpStep3=Uygulama taraf\u0131ndan olu\u015Fturulan tek seferlik kodu girin ve Kaydet''i t\u0131klay\u0131n.
+
+totpManualStep2=Uygulamay\u0131 a\u00E7\u0131n ve a\u015Fa\u011F\u0131daki anahtar\u0131 girin.
+totpManualStep3=Bunlar\u0131 uygulama i\u00E7in \u00F6zelle\u015Ftirebilirseniz a\u015Fa\u011F\u0131daki yap\u0131land\u0131rma de\u011Ferlerini kullan\u0131n:
+totpUnableToScan=Barkodu tarayam\u0131yor musunuz?
+totpScanBarcode=Barkod Tara?
+
+totp.totp=Zaman bazl\u0131 (time-based)
+totp.hotp=Saya\u00E7 tabanl\u0131 (counter-based)
+
+totpType=Tip
+totpAlgorithm=Algoritma
+totpDigits=Basamak
+totpInterval=Aral\u0131k
+totpCounter=Saya\u00E7
+
+missingUsernameMessage=L\u00FCtfen bir kullan\u0131c\u0131 ad\u0131 giriniz.
+missingFirstNameMessage=L\u00FCtfen bir ad girin.
+invalidEmailMessage=Ge\u00E7ersiz e-posta adresi.
+missingLastNameMessage=L\u00FCtfen bir soyad\u0131 giriniz.
+missingEmailMessage=L\u00FCtfen bir e-mail adresi giriniz.
+missingPasswordMessage=L\u00FCtfen bir \u015Fifre giriniz.
+notMatchPasswordMessage=\u015Eifreler ayn\u0131 de\u011Fil.
+
+missingTotpMessage=L\u00FCtfen tek seferlik kodu girin.
+invalidPasswordExistingMessage=Mevcut \u015Fifre ge\u00E7ersiz.
+invalidPasswordConfirmMessage=\u015Eifre onay\u0131 ayn\u0131 de\u011Fil.
+invalidTotpMessage=Ge\u00E7ersiz tek seferlik kod.
+
+usernameExistsMessage=Kullan\u0131c\u0131 ad\u0131 zaten mevcut.
+emailExistsMessage=E-posta adresi zaten mevcut.
+
+readOnlyUserMessage=Yazma korumal\u0131 oldu\u011Fundan kullan\u0131c\u0131 hesab\u0131n\u0131z\u0131 de\u011Fi\u015Ftiremezsiniz.
+readOnlyUsernameMessage=Yazma korumal\u0131 oldu\u011Fundan kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 de\u011Fi\u015Ftiremezsiniz.
+readOnlyPasswordMessage=Yazma korumal\u0131 oldu\u011Fundan \u015Fifrenizi de\u011Fi\u015Ftiremezsiniz.
+
+successTotpMessage=\u00C7oklu kimlik do\u011Frulamas\u0131 ba\u015Far\u0131yla yap\u0131land\u0131r\u0131ld\u0131.
+successTotpRemovedMessage=\u00C7oklu kimlik do\u011Frulama ba\u015Far\u0131yla kald\u0131r\u0131ld\u0131.
+
+successGrantRevokedMessage=\u0130zin ba\u015Far\u0131yla iptal edildi.
+
+accountUpdatedMessage=Kullan\u0131c\u0131 hesab\u0131n\u0131z g\u00FCncellendi.
+accountPasswordUpdatedMessage=\u015Eifreniz g\u00FCncellendi.
+
+missingIdentityProviderMessage=Kimlik Sa\u011Flay\u0131c\u0131s\u0131 belirtilmemi\u015F.
+invalidFederatedIdentityActionMessage=Ge\u00E7ersiz veya eksik eylem.
+identityProviderNotFoundMessage=Belirtilen Kimlik Sa\u011Flay\u0131c\u0131 bulunamad\u0131.
+federatedIdentityLinkNotActiveMessage=Bu kimlik art\u0131k aktif de\u011Fil.
+federatedIdentityRemovingLastProviderMessage=\u015Eifreniz olmad\u0131\u011F\u0131 i\u00E7in son giri\u015Fi kald\u0131ramazs\u0131n\u0131z.
+identityProviderRedirectErrorMessage=Kimlik sa\u011Flay\u0131c\u0131ya iletilirken hata olu\u015Ftu.
+identityProviderRemovedMessage=Kimlik Sa\u011Flay\u0131c\u0131s\u0131 ba\u015Far\u0131yla kald\u0131r\u0131ld\u0131.
+identityProviderAlreadyLinkedMessage=De\u011Fi\u015Ftirilmi\u015F {0} kimli\u011Fi ba\u015Fka bir kullan\u0131c\u0131ya atanm\u0131\u015F.
+staleCodeAccountMessage=Bu sayfa art\u0131k ge\u00E7erli de\u011Fil, l\u00FCtfen tekrar deneyin.
+consentDenied=Onay reddedildi.
+
+accountDisabledMessage=Hesab\u0131n\u0131z kilitlendi, l\u00FCtfen y\u00F6neticiyle ileti\u015Fime ge\u00E7in.
+
+accountTemporarilyDisabledMessage=Hesab\u0131n\u0131z ge\u00E7ici olarak kilitlendi, l\u00FCtfen y\u00F6neticiyle ileti\u015Fime ge\u00E7in veya daha sonra tekrar deneyin.
+invalidPasswordMinLengthMessage=Ge\u00E7ersiz \u015Eifre: En az {0} karakter uzunlu\u011Funda olmal\u0131.
+invalidPasswordMinLowerCaseCharsMessage=Ge\u00E7ersiz \u015Eifre \: En az {0} k\u00FC\u00E7\u00FCk harf i\u00E7ermelidir.
+invalidPasswordMinDigitsMessage=Ge\u00E7ersiz \u015Eifre: En az {0} say\u0131(lar) i\u00E7ermelidir.
+invalidPasswordMinUpperCaseCharsMessage=Ge\u00E7ersiz \u015Eifre: En az {0} b\u00FCy\u00FCk harf i\u00E7ermelidir.
+invalidPasswordMinSpecialCharsMessage=Ge\u00E7ersiz \u015Eifre: En az {0} \u00F6zel karakter i\u00E7ermelidir.
+invalidPasswordNotUsernameMessage=Ge\u00E7ersiz \u015Eifre: Kullan\u0131c\u0131 ad\u0131yla ayn\u0131 olamaz.
+invalidPasswordRegexPatternMessage=Ge\u00E7ersiz \u015Eifre: Regex Patternine uygun de\u011Fil.
+invalidPasswordHistoryMessage=Ge\u00E7ersiz \u015Eifre: Son {0} \u015Fifreden biri olamaz.
+invalidPasswordBlacklistedMessage=Ge\u00E7ersiz \u015Eifre: \u015Eifre bloklanm\u0131\u015F \u015Fifreler listesindedir (kara liste).
+invalidPasswordGenericMessge=Ge\u00E7ersiz \u015Eifre: Yeni \u015Fifre, \u015Fifre kurallar\u0131n\u0131 ihlal ediyor.
+
+
+
+# Authorization
+myResources=Kaynaklar\u0131m
+myResourcesSub=Kaynaklar\u0131m
+doDeny=Reddet
+doRevoke=Geri al
+doApprove=Onayla
+doRemoveSharing=Payla\u015F\u0131m\u0131 Kald\u0131r
+doRemoveRequest=\u0130ste\u011Fi Kald\u0131r
+peopleAccessResource=Bu kayna\u011Fa eri\u015Fimi olan ki\u015Filer
+resourceManagedPolicies=Bu kayna\u011Fa eri\u015Fim izni veren izinler
+resourceNoPermissionsGrantingAccess=Bu kayna\u011Fa eri\u015Fim izni verilmeyen izin yok
+anyAction=Herhangi bir eylem
+description=A\u00E7\u0131klama
+name=\u0130sim
+scopes=Kapsam
+resource=Kaynak
+user=Kullan\u0131c\u0131
+peopleSharingThisResource=Bu kayna\u011F\u0131 payla\u015Fan kullan\u0131c\u0131lar
+shareWithOthers=Ba\u015Fkalar\u0131yla payla\u015F
+needMyApproval=Onay\u0131m gerekli
+requestsWaitingApproval=Talepleriniz onay bekliyor
+icon=Icon
+requestor=Talep eden
+owner=Sahip
+resourcesSharedWithMe=Kaynaklar benimle payla\u015F\u0131ld\u0131
+permissionRequestion=\u0130zin Talepleri
+permission=\u0130zin
+shares=Payla\u015F\u0131m(lar)
+
+locale_ca=Katalanca
+locale_de=Almanca
+locale_en=\u0130ngilizce
+locale_es=\u0130spanyolca
+locale_fr=Frans\u0131zca
+locale_it=\u0130talyanca
+locale_ja=Japonca
+locale_nl=Felemenk\u00E7e
+locale_no=Norve\u00E7ce
+locale_pl=Leh\u00E7e
+locale_pt_BR=Portekizce
+locale_pt-BR=Portekizce
+locale_ru=Rus\u00E7a
+locale_lt=Litvanca
+locale_zh-CN=\u00C7ince
+locale_sk=Slovak\u00E7a
+locale_sv=\u0130sve\u00E7\u00E7e
+locale_tr=T\u00FCrk\u00E7e
+
+# Applications
+applicaitonName=\u0130sim
+applicationType=Uygulama Tipi
+applicationInUse=Yaln\u0131zca uygulama i\u00E7i kullan\u0131m
+clearAllFilter=T\u00FCm filtreleri temizle
+activeFilters=Aktif filtreler
+filterByName=\u0130sme G\u00F6re Filtrele ...
+allApps=B\u00FCt\u00FCn uygulamalar
+internalApps=\u0130\u00E7 uygulamalar
+thirdpartyApps=\u00DC\u00E7\u00FCnc\u00FC parti uygulamalar
+appResults=Sonu\u00E7lar
+
+# Linked account
+authorizedProvider=Yetkili Tedarik\u00E7i
+authorizedProviderMessage=Yetkili Sa\u011Flay\u0131c\u0131lar hesab\u0131n\u0131zla ba\u011Flant\u0131l\u0131
+identityProvider=Kimlik Sa\u011Flay\u0131c\u0131s\u0131
+identityProviderMessage=Hesab\u0131n\u0131z\u0131 yap\u0131land\u0131rd\u0131\u011F\u0131n\u0131z kimlik sa\u011Flay\u0131c\u0131lar\u0131yla ba\u011Flamak i\u00E7in
+socialLogin=Sosyal Giri\u015F
+userDefined=Kullan\u0131c\u0131 tan\u0131ml\u0131
+removeAccess=Eri\u015Fimi Kald\u0131r
+removeAccessMessage=Bu uygulama hesab\u0131n\u0131 kullanmak istiyorsan\u0131z tekrar eri\u015Fim vermeniz gerekir.
+
+#Authenticator
+authenticatorStatusMessage=\u0130ki fakt\u00F6rl\u00FC kimlik do\u011Frulama aktif
+authenticatorFinishSetUpTitle=\u0130ki Fakt\u00F6rl\u00FC Do\u011Frulama
+authenticatorFinishSetUpMessage=Keycloak hesab\u0131n\u0131zda her oturum a\u00E7t\u0131\u011F\u0131n\u0131zda, iki fakt\u00F6rl\u00FC bir do\u011Frulama kodu girmeniz istenecektir.
+authenticatorSubTitle=\u0130ki Fakt\u00F6rl\u00FC Kimlik Do\u011Frulamay\u0131 Ayarlama
+authenticatorSubMessage=Hesab\u0131n\u0131z\u0131n g\u00FCvenli\u011Fini art\u0131rmak i\u00E7in mevcut iki fakt\u00F6rl\u00FC kimlik do\u011Frulama y\u00F6ntemlerinden en az birini etkinle\u015Ftirin.
+authenticatorMobileTitle=Mobil Kimlik Do\u011Frulay\u0131c\u0131
+authenticatorMobileMessage=Do\u011Frulama kodlar\u0131n\u0131 iki fakt\u00F6rl\u00FC kimlik do\u011Frulama olarak almak i\u00E7in mobil Do\u011Frulay\u0131c\u0131''y\u0131 kullan\u0131n.
+authenticatorMobileFinishSetUpMessage=Do\u011Frulay\u0131c\u0131, telefonunuza ba\u011Fl\u0131.
+authenticatorActionSetup=Kur
+authenticatorSMSTitle=SMS Kodu
+authenticatorSMSMessage=Keycloak, do\u011Frulama kodunu telefonunuza iki fakt\u00F6rl\u00FC kimlik do\u011Frulamas\u0131 olarak g\u00F6nderecektir.
+authenticatorSMSFinishSetUpMessage=K\u0131sa mesajlar g\u00F6nderilir
+authenticatorDefaultStatus=Varsay\u0131lan
+authenticatorChangePhone=Telefon Numaras\u0131n\u0131 De\u011Fi\u015Ftir
+authenticatorBackupCodesTitle=Yedekleme Kodlar\u0131
+authenticatorBackupCodesMessage=8 haneli yedek kodlar\u0131n\u0131z\u0131 al\u0131n
+authenticatorBackupCodesFinishSetUpMessage=\u015Eu anda 12 haneli yedek kod olu\u015Fturuldu. Her biri bir kez kullan\u0131labilir.
+
+#Authenticator - Mobile Authenticator setup
+authenticatorMobileSetupTitle=Mobil Kimlik Do\u011Frulama Kurulumu
+smscodeIntroMessage=Telefon numaran\u0131z\u0131 girin ve telefonunuza bir do\u011Frulama kodu g\u00F6nderilecektir.
+mobileSetupStep1=Telefonunuza bir kimlik do\u011Frulama uygulamas\u0131 y\u00FCkleyin. Burada listelenen uygulamalar desteklenmektedir.
+mobileSetupStep2=Uygulamay\u0131 a\u00E7\u0131n ve barkodu taray\u0131n.
+mobileSetupStep3=Uygulama taraf\u0131ndan sa\u011Flanan tek seferlik kodu girin ve kurulumu tamamlamak i\u00E7in Kaydet''e t\u0131klay\u0131n.
+scanBarCode=Barkodu taramak ister misiniz?
+enterBarCode=Tek seferlik kodu girin
+doCopy=Kopyala
+doFinish=Bitir
+
+#Authenticator - SMS Code setup
+authenticatorSMSCodeSetupTitle=SMS Kodu Kurulumu
+chooseYourCountry=\u00DClkenizi se\u00E7in
+enterYourPhoneNumber=Telefon numaran\u0131z\u0131 girin
+sendVerficationCode=Do\u011Frulama kodu G\u00F6nder
+enterYourVerficationCode=Onaylama kodunu girin
+
+#Authenticator - backup Code setup
+authenticatorBackupCodesSetupTitle=Yedekleme Kodlar\u0131 Kurulumu
+backupcodesIntroMessage=Telefonunuza eri\u015Fimi kaybederseniz, yine de yedek kodlar arac\u0131l\u0131\u011F\u0131yla hesab\u0131n\u0131za giri\u015F yapabilirsiniz. Onlar\u0131 g\u00FCvenli ve eri\u015Filebilir bir yerde saklay\u0131n.
+realmName=Realm
+doDownload=\u0130ndir
+doPrint=Yazd\u0131r
+backupCodesTips-1=Her yedek kod bir kez kullan\u0131labilir.
+backupCodesTips-2=Bu kodlar \u00FCzerinde olu\u015Fturuldu
+generateNewBackupCodes=Yeni Yedekleme Kodlar\u0131 Olu\u015Ftur
+backupCodesTips-3=Yeni yedek kodlar olu\u015Fturdu\u011Funuzda, mevcut kodlar art\u0131k \u00E7al\u0131\u015Fmayacakt\u0131r.
+backtoAuthenticatorPage=Kimlik Do\u011Frulay\u0131c\u0131 Sayfas\u0131na Geri D\u00F6n
+
+#Resources
+resources=Kaynaklar
+sharedwithMe=Benimle payla\u015Ft\u0131
+share=Payla\u015F\u0131m
+sharedwith=\u0130le payla\u015Ft\u0131
+accessPermissions=Eri\u015Fim \u0130zinleri
+permissionRequests=\u0130zin \u0130stekleri
+approve=Onayla
+approveAll=T\u00FCm\u00FCn\u00FC onayla
+people=\u0130nsanlar
+perPage=Sayfa ba\u015F\u0131na
+currentPage=Ge\u00E7erli sayfa
+sharetheResource=Kayna\u011F\u0131 payla\u015F
+group=Grup
+selectPermission=\u0130zin Se\u00E7
+addPeople=Kayna\u011F\u0131n\u0131z\u0131 payla\u015Fmak i\u00E7in kullan\u0131c\u0131 ekleyin
+addTeam=Kayna\u011F\u0131n\u0131z\u0131 payla\u015Fmak i\u00E7in ekip ekleyin
+myPermissions=\u0130zinlerim
+waitingforApproval=Onay bekleniyor
+anyPermission=Herhangi bir izin
diff --git a/account/messages/messages_zh_CN.properties b/account/messages/messages_zh_CN.properties
new file mode 100644
index 0000000..9e9a8a6
--- /dev/null
+++ b/account/messages/messages_zh_CN.properties
@@ -0,0 +1,166 @@
+# encoding: utf-8
+doSave=保存
+doCancel=取消
+doLogOutAllSessions=登出所有会话
+doRemove=删除
+doAdd=添加
+doSignOut=登出
+
+editAccountHtmlTitle=编辑账户
+federatedIdentitiesHtmlTitle=链接的身份
+accountLogHtmlTitle=账户日志
+changePasswordHtmlTitle=更改密码
+sessionsHtmlTitle=会话
+accountManagementTitle=Keycloak账户管理
+authenticatorTitle=认证者
+applicationsHtmlTitle=应用
+
+authenticatorCode=一次性认证码
+email=电子邮件
+firstName=名
+givenName=姓
+fullName=全名
+lastName=姓
+familyName=姓
+password=密码
+passwordConfirm=确认
+passwordNew=新密码
+username=用户名
+address=地址
+street=街道
+locality=城市住所
+region=省,自治区,直辖市
+postal_code=邮政编码
+country=国家
+emailVerified=验证过的Email
+gssDelegationCredential=GSS Delegation Credential
+
+role_admin=管理员
+role_realm-admin=域管理员
+role_create-realm=创建域
+role_view-realm=查看域
+role_view-users=查看用户
+role_view-applications=查看应用
+role_view-clients=查看客户
+role_view-events=查看事件
+role_view-identity-providers=查看身份提供者
+role_manage-realm=管理域
+role_manage-users=管理用户
+role_manage-applications=管理应用
+role_manage-identity-providers=管理身份提供者
+role_manage-clients=管理客户
+role_manage-events=管理事件
+role_view-profile=查看用户信息
+role_manage-account=管理账户
+role_read-token=读取 token
+role_offline-access=离线访问
+role_uma_authorization=获取授权
+client_account=账户
+client_security-admin-console=安全管理终端
+client_admin-cli=管理命令行
+client_realm-management=域管理
+client_broker=代理
+
+
+requiredFields=必填项
+allFieldsRequired=所有项必填
+
+backToApplication=« 回到应用
+backTo=回到 {0}
+
+date=日期
+event=事件
+ip=IP
+client=客户端
+clients=客户端
+details=详情
+started=开始
+lastAccess=最后一次访问
+expires=过期时间
+applications=应用
+
+account=账户
+federatedIdentity=关联身份
+authenticator=认证方
+sessions=会话
+log=日志
+
+application=应用
+availablePermissions=可用权限
+grantedPermissions=授予权限
+grantedPersonalInfo=授权的个人信息
+additionalGrants=可授予的权限
+action=操作
+inResource=in
+fullAccess=所有权限
+offlineToken=离线 token
+revoke=收回授权
+
+configureAuthenticators=配置的认证者
+mobile=手机
+totpStep1=在你的设备上安装 <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> 或者 Google Authenticator.两个应用可以从 <a href="https://play.google.com">Google Play</a> 和 Apple App Store下载。
+totpStep2=打开应用扫描二维码输入验证码
+totpStep3=输入应用提供的一次性验证码单击保存
+
+missingUsernameMessage=请指定用户名
+missingFirstNameMessage=请指定名
+invalidEmailMessage=无效的电子邮箱地址
+missingLastNameMessage=请指定姓
+missingEmailMessage=请指定邮件地址
+missingPasswordMessage=请输入密码
+notMatchPasswordMessage=密码不匹配
+
+missingTotpMessage=请指定认证者代码
+invalidPasswordExistingMessage=无效的旧密码
+invalidPasswordConfirmMessage=确认密码不相符
+invalidTotpMessage=无效的认证码
+
+usernameExistsMessage=用户名已经存在
+emailExistsMessage=电子邮箱已经存在
+
+readOnlyUserMessage=无法修改账户,因为它是只读的。
+readOnlyPasswordMessage=不可以更该账户因为它是只读的。
+
+successTotpMessage=手机认证者配置完毕
+successTotpRemovedMessage=手机认证者已删除
+
+successGrantRevokedMessage=授权成功回收
+
+accountUpdatedMessage=您的账户已经更新
+accountPasswordUpdatedMessage=您的密码已经修改
+
+missingIdentityProviderMessage=身份提供者未指定
+invalidFederatedIdentityActionMessage=无效或者缺少操作
+identityProviderNotFoundMessage=指定的身份提供者未找到
+federatedIdentityLinkNotActiveMessage=这个身份不再使用了。
+federatedIdentityRemovingLastProviderMessage=你不可以移除最后一个身份提供者因为你没有设置密码
+identityProviderRedirectErrorMessage=尝试重定向到身份提供商失败
+identityProviderRemovedMessage=身份提供商成功删除
+identityProviderAlreadyLinkedMessage=链接的身份 {0} 已经连接到已有用户。
+staleCodeAccountMessage=页面过期。请再试一次。
+consentDenied=不同意
+
+accountDisabledMessage=账户已经关闭,请联系管理员
+
+accountTemporarilyDisabledMessage=账户暂时关闭,请联系管理员或稍后再试。
+invalidPasswordMinLengthMessage=无效的密码:最短长度 {0}.
+invalidPasswordMinLowerCaseCharsMessage=无效的密码: 至少包含 {0} 小写字母。
+invalidPasswordMinDigitsMessage=无效的密码: 至少包含 {0} 数字。
+invalidPasswordMinUpperCaseCharsMessage=无效的密码: 至少包含 {0} 大写字母
+invalidPasswordMinSpecialCharsMessage=无效的密码: 至少包含 {0} 个特殊字符
+invalidPasswordNotUsernameMessage=无效的密码: 不能与用户名相同
+invalidPasswordRegexPatternMessage=无效的密码: 无法与正则表达式匹配
+invalidPasswordHistoryMessage=无效的密码: 不能与之前的{0} 个旧密码相同
+locale_ca=Català
+locale_de=Deutsch
+locale_en=English
+locale_es=Español
+locale_fr=Français
+locale_it=Italian
+locale_ja=日本語
+locale_nl=Nederlands
+locale_no=Norsk
+locale_lt=Lietuvių
+locale_pt-BR=Português (Brasil)
+locale_ru=Русский
+locale_zh-CN=中文简体
diff --git a/account/password.ftl b/account/password.ftl
new file mode 100644
index 0000000..4a043f2
--- /dev/null
+++ b/account/password.ftl
@@ -0,0 +1,59 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='password' bodyClass='password'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("changePasswordHtmlTitle")}</h2>
+ </div>
+ <div class="col-md-2 subtitle">
+ <span class="subtitle">${msg("allFieldsRequired")}</span>
+ </div>
+ </div>
+
+ <form action="${url.passwordUrl}" class="form-horizontal" method="post">
+ <input type="text" id="username" name="username" value="${(account.username!'')}" autocomplete="username" readonly="readonly" style="display:none;">
+
+ <#if password.passwordSet>
+ <div class="form-group">
+ <div class="col-sm-2 col-md-2">
+ <label for="password" class="control-label">${msg("password")}</label>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="password" class="form-control" id="password" name="password" autofocus autocomplete="current-password">
+ </div>
+ </div>
+ </#if>
+
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+
+ <div class="form-group">
+ <div class="col-sm-2 col-md-2">
+ <label for="password-new" class="control-label">${msg("passwordNew")}</label>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="password" class="form-control" id="password-new" name="password-new" autocomplete="new-password">
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div class="col-sm-2 col-md-2">
+ <label for="password-confirm" class="control-label" class="two-lines">${msg("passwordConfirm")}</label>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="password" class="form-control" id="password-confirm" name="password-confirm" autocomplete="new-password">
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div id="kc-form-buttons" class="col-md-offset-2 col-md-10 submit">
+ <div class="">
+ <button type="submit" class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}" name="submitAction" value="Save">${msg("doSave")}</button>
+ </div>
+ </div>
+ </div>
+ </form>
+
+</@layout.mainLayout>
diff --git a/account/resource-detail.ftl b/account/resource-detail.ftl
new file mode 100644
index 0000000..2c963d7
--- /dev/null
+++ b/account/resource-detail.ftl
@@ -0,0 +1,277 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='authorization' bodyClass='authorization'; section>
+
+ <style>
+ .search-box,.close-icon,.search-wrapper {
+ position: relative;
+ }
+ .search-wrapper {
+ width: 500px;
+ margin: auto;
+ margin-top: 50px;
+ }
+ .search-box {
+ font-weight: 600;
+ color: white;
+ border: 1px solid #006e9c;
+ outline: 0;
+ border-radius: 15px;
+ background-color: #0085cf;
+ padding: 2px 5px;
+
+ }
+ .search-box:focus {
+ box-shadow: 0 0 15px 5px #b0e0ee;
+ border: 2px solid #bebede;
+ }
+ .close-icon {
+ border:1px solid transparent;
+ background-color: transparent;
+ display: inline-block;
+ float: right;
+ outline: 0;
+ cursor: pointer;
+ }
+ .close-icon:after {
+ display: block;
+ width: 15px;
+ height: 15px;
+ background-color: #FA9595;
+ z-index:1;
+ right: 35px;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ padding: 2px;
+ border-radius: 50%;
+ text-align: center;
+ color: white;
+ font-weight: normal;
+ font-size: 12px;
+ box-shadow: 0 0 2px #E50F0F;
+ cursor: pointer;
+ }
+ .search-box:not(:valid) ~ .close-icon {
+ display: none;
+ }
+ </style>
+ <script>
+ function removeScopeElm(elm) {
+ elm.parentNode.removeChild(elm);
+ }
+
+ function removeAllScopes(id) {
+ var scopesElm = document.getElementsByName('removeScope-' + id);
+
+ for (i = 0; i < scopesElm.length; i++) {
+ var td = scopesElm[i].parentNode.parentNode;
+ var tr = td.parentNode;
+ var tbody = tr.parentNode;
+ tbody.removeChild(tr);
+ }
+ }
+
+ function getChildren(parent, childId) {
+ var childNodes = [];
+
+ for (i = 0; i < parent.childNodes.length; i++) {
+ if (parent.childNodes[i].id == childId) {
+ childNodes.push(parent.childNodes[i]);
+ }
+ }
+
+ return childNodes;
+ }
+ </script>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>
+ <a href="${url.resourceUrl}">${msg("myResources")}</a> <i class="fa fa-angle-right"></i> <#if authorization.resource.displayName??>${authorization.resource.displayName}<#else>${authorization.resource.name}</#if>
+ </h2>
+ </div>
+ </div>
+
+ <#if authorization.resource.iconUri??>
+ <img src="${authorization.resource.iconUri}">
+ <br/>
+ </#if>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h3>
+ ${msg("peopleAccessResource")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th>${msg("user")}</th>
+ <th>${msg("permission")}</th>
+ <th>${msg("date")}</th>
+ <th>${msg("action")}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <#if authorization.resource.shares?size != 0>
+ <#list authorization.resource.shares as permission>
+ <form action="${url.getResourceGrant(authorization.resource.id)}" name="revokeForm-${authorization.resource.id}-${permission.requester.username}" method="post">
+ <input type="hidden" name="action" value="revoke">
+ <input type="hidden" name="requester" value="${permission.requester.username}">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <tr>
+ <td>
+ <#if permission.requester.email??>${permission.requester.email}<#else>${permission.requester.username}</#if>
+ </td>
+ <td>
+ <#if permission.scopes?size != 0>
+ <#list permission.scopes as scope>
+ <#if scope.granted && scope.scope??>
+ <div class="search-box">
+ <#if scope.scope.displayName??>
+ ${scope.scope.displayName}
+ <#else>
+ ${scope.scope.name}
+ </#if>
+ <button class="close-icon" type="button" name="removeScope-${authorization.resource.id}-${permission.requester.username}" onclick="removeScopeElm(this.parentNode);document.forms['revokeForm-${authorization.resource.id}-${permission.requester.username}'].submit();"><i class="fa fa-times" aria-hidden="true"></i></button>
+ <input type="hidden" name="permission_id" value="${scope.id}"/>
+ </div>
+ <#else>
+ ${msg("anyPermission")}
+ </#if>
+ </#list>
+ <#else>
+ Any action
+ </#if>
+ </td>
+ <td>
+ ${permission.createdDate?datetime}
+ </td>
+ <td width="20%" align="middle" style="vertical-align: middle">
+ <a href="#" id="revoke-${authorization.resource.name}-${permission.requester.username}" onclick="removeAllScopes('${authorization.resource.id}-${permission.requester.username}');document.forms['revokeForm-${authorization.resource.id}-${permission.requester.username}'].submit();" type="submit" class="btn btn-primary">${msg("doRevoke")}</a>
+ </td>
+ </tr>
+ </form>
+ </#list>
+ <#else>
+ <tr>
+ <td colspan="4">${msg("resourceIsNotBeingShared")}</td>
+ </tr>
+ </#if>
+ </tbody>
+ </table>
+ </form>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-10">
+ <h3>
+ ${msg("resourceManagedPolicies")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th>${msg("description")}</th>
+ <th>${msg("permission")}</th>
+ <th>${msg("action")}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <#if authorization.resource.policies?size != 0>
+ <#list authorization.resource.policies as permission>
+ <form action="${url.getResourceGrant(authorization.resource.id)}" name="revokePolicyForm-${authorization.resource.id}-${permission.id}" method="post">
+ <input type="hidden" name="action" value="revokePolicy">
+ <input type="hidden" name="permission_id" value="${permission.id}"/>
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <tr>
+ <td>
+ <#if permission.description??>
+ ${permission.description}
+ </#if>
+ </td>
+ <td>
+ <#if permission.scopes?size != 0>
+ <#list permission.scopes as scope>
+ <div class="search-box">
+ <#if scope.displayName??>
+ ${scope.displayName}
+ <#else>
+ ${scope.name}
+ </#if>
+ <button class="close-icon" type="button" name="removePolicyScope-${authorization.resource.id}-${permission.id}-${scope.id}" onclick="removeScopeElm(this.parentNode);document.forms['revokePolicyForm-${authorization.resource.id}-${permission.id}'].submit();"><i class="fa fa-times" aria-hidden="true"></i></button>
+ <input type="hidden" name="permission_id" value="${permission.id}:${scope.id}"/>
+ </div>
+ </#list>
+ <#else>
+ ${msg("anyAction")}
+ </#if>
+ </td>
+ <td width="20%" align="middle" style="vertical-align: middle">
+ <a href="#" id="revokePolicy-${authorization.resource.name}-${permission.id}" onclick="document.forms['revokePolicyForm-${authorization.resource.id}-${permission.id}']['action'].value = 'revokePolicyAll';document.forms['revokePolicyForm-${authorization.resource.id}-${permission.id}'].submit();" type="submit" class="btn btn-primary">${msg("doRevoke")}</a>
+ </td>
+ </tr>
+ </form>
+ </#list>
+ <#else>
+ <tr>
+ <td colspan="3">
+ ${msg("resourceNoPermissionsGrantingAccess")}
+ </td>
+ </tr>
+ </#if>
+ </tbody>
+ </table>
+ </form>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-10">
+ <h3>
+ ${msg("shareWithOthers")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-10">
+ <form action="${url.getResourceShare(authorization.resource.id)}" name="shareForm" method="post">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <div class="col-sm-3 col-md-3">
+ <label for="password" class="control-label">${msg("username")} or ${msg("email")} </label> <span class="required">*</span>
+ </div>
+ <div class="col-sm-8 col-md-8">
+ <div class="row">
+ <div class="col-md-12">
+ <input type="text" class="form-control" id="user_id" name="user_id" autofocus autocomplete="off">
+ </div>
+ <div class="col-md-12">
+ <br/>
+ <#list authorization.resource.scopes as scope>
+ <div id="scope" class="search-box">
+ <#if scope.displayName??>
+ ${scope.displayName}
+ <#else>
+ ${scope.name}
+ </#if>
+ <button class="close-icon" id="share-remove-scope-${authorization.resource.name}-${scope.name}" type="button" onclick="if (getChildren(this.parentNode.parentNode, 'scope').length > 1) {removeScopeElm(this.parentNode)}"><i class="fa fa-times" aria-hidden="true"></i></button>
+ <input type="hidden" name="scope_id" value="${scope.id}"/>
+ </div>
+ </#list>
+ </div>
+ <div class="col-md-12">
+ <br/>
+ <a href="#" onclick="document.forms['shareForm'].submit()" type="submit" id="share-button" class="btn btn-primary">${msg("share")}</a>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <br/>
+</@layout.mainLayout>
diff --git a/account/resources.ftl b/account/resources.ftl
new file mode 100644
index 0000000..011e181
--- /dev/null
+++ b/account/resources.ftl
@@ -0,0 +1,399 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='authorization' bodyClass='authorization'; section>
+ <style>
+ .search-box,.close-icon,.search-wrapper {
+ position: relative;
+ }
+ .search-wrapper {
+ width: 500px;
+ margin: auto;
+ margin-top: 50px;
+ }
+ .search-box {
+ font-weight: 600;
+ color: white;
+ border: 1px solid #006e9c;
+ outline: 0;
+ border-radius: 15px;
+ background-color: #0085cf;
+ padding: 2px 5px;
+ }
+ .search-box:focus {
+ box-shadow: 0 0 15px 5px #b0e0ee;
+ border: 2px solid #bebede;
+ }
+ .close-icon {
+ border:1px solid transparent;
+ background-color: transparent;
+ display: inline-block;
+ float: right;
+ outline: 0;
+ cursor: pointer;
+ }
+ .close-icon:after {
+ display: block;
+ width: 15px;
+ height: 15px;
+ background-color: #FA9595;
+ z-index:1;
+ right: 35px;
+ top: 0;
+ bottom: 0;
+ margin: auto;
+ padding: 2px;
+ border-radius: 50%;
+ text-align: center;
+ color: white;
+ font-weight: normal;
+ font-size: 12px;
+ box-shadow: 0 0 2px #E50F0F;
+ cursor: pointer;
+ }
+ .search-box:not(:valid) ~ .close-icon {
+ display: none;
+ }
+ </style>
+ <script>
+ function showHideActions(elm) {
+ if (elm.style.display == 'none') {
+ elm.style.display = '';
+ } else {
+ elm.style.display = 'none';
+ }
+ }
+ function removeScopeElm(elm) {
+ var td = elm.parentNode;
+ var tr = td.parentNode;
+ var tbody = tr.parentNode;
+
+ td.removeChild(elm);
+
+ var childCount = td.childNodes.length - 1;
+
+ for (i = 0; i < td.childNodes.length; i++) {
+ if (!td.childNodes[i].tagName || td.childNodes[i].tagName.toUpperCase() != 'DIV') {
+ td.removeChild(td.childNodes[i]);
+ childCount--;
+ }
+ }
+
+ if (childCount <= 0) {
+ tbody.removeChild(tr);
+ }
+ }
+
+ function removeAllScopes(id) {
+ var scopesElm = document.getElementsByName('removeScope-' + id);
+
+ for (i = 0; i < scopesElm.length; i++) {
+ var td = scopesElm[i].parentNode.parentNode;
+ var tr = td.parentNode;
+ var tbody = tr.parentNode;
+ tbody.removeChild(tr);
+ }
+ }
+
+ function selectAllCheckBoxes(formName, elm, name) {
+ var shares = document.forms[formName].getElementsByTagName('input');
+
+ for (i = 0; i < shares.length; i++) {
+ if (shares[i].name == name) {
+ shares[i].checked = elm.checked;
+ }
+ }
+ }
+ </script>
+ <div class="row">
+ <div class="col-md-10">
+ <h2>
+ ${msg("myResources")}
+ </h2>
+ </div>
+ </div>
+
+ <#if authorization.resourcesWaitingApproval?size != 0>
+ <div class="row">
+ <div class="col-md-12">
+ <h3>
+ ${msg("needMyApproval")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th>${msg("resource")}</th>
+ <th>${msg("requestor")}</th>
+ <th>${msg("permissionRequestion")}</th>
+ <th>${msg("action")}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <#list authorization.resourcesWaitingApproval as resource>
+ <#list resource.permissions as permission>
+ <form action="${url.getResourceGrant(resource.id)}" name="approveForm-${resource.id}-${permission.requester.username}" method="post">
+ <input type="hidden" name="action" value="grant">
+ <input type="hidden" name="requester" value="${permission.requester.username}">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <tr>
+ <td>
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
+ </td>
+ <td>
+ <#if permission.requester.email??>${permission.requester.email}<#else>${permission.requester.username}</#if>
+ </td>
+ <td>
+ <#list permission.scopes as scope>
+ <#if scope.scope??>
+ <div class="search-box">
+ <#if scope.scope.displayName??>
+ ${scope.scope.displayName}
+ <#else>
+ ${scope.scope.name}
+ </#if>
+ <button class="close-icon" type="button" id="grant-remove-scope-${resource.name}-${permission.requester.username}-${scope.scope.name}" name="removeScope-${resource.id}-${permission.requester.username}" onclick="removeScopeElm(this.parentNode);document.forms['approveForm-${resource.id}-${permission.requester.username}']['action'].value = 'deny';document.forms['approveForm-${resource.id}-${permission.requester.username}'].submit();"><i class="fa fa-times" aria-hidden="true"></i></button>
+ <input type="hidden" name="permission_id" value="${scope.id}"/>
+ </div>
+ <#else>
+ ${msg("anyPermission")}
+ </#if>
+ </#list>
+ </td>
+ <td width="20%" align="middle" style="vertical-align: middle">
+ <a href="#" id="grant-${resource.name}-${permission.requester.username}" onclick="document.forms['approveForm-${resource.id}-${permission.requester.username}']['action'].value = 'grant';document.forms['approveForm-${resource.id}-${permission.requester.username}'].submit();" type="submit" class="btn btn-primary">${msg("doApprove")}</a>
+ <a href="#" id="deny-${resource.name}-${permission.requester.username}" onclick="removeAllScopes('${resource.id}-${permission.requester.username}');document.forms['approveForm-${resource.id}-${permission.requester.username}']['action'].value = 'deny';document.forms['approveForm-${resource.id}-${permission.requester.username}'].submit();" type="submit" class="btn btn-danger">${msg("doDeny")}</a>
+ </td>
+ </tr>
+ </form>
+ </#list>
+ </#list>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </#if>
+
+ <div class="row">
+ <div class="col-md-12">
+ <h3>
+ ${msg("myResourcesSub")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th>${msg("resource")}</th>
+ <th>${msg("application")}</th>
+ <th>${msg("peopleSharingThisResource")}</th>
+ </tr>
+ </thead>
+
+ <tbody>
+ <#if authorization.resources?size != 0>
+ <#list authorization.resources as resource>
+ <tr>
+ <td>
+ <a id="detail-${resource.name}" href="${url.getResourceDetailUrl(resource.id)}">
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
+ </a>
+ </td>
+ <td>
+ <#if resource.resourceServer.baseUri??>
+ <a href="${resource.resourceServer.baseUri}">${resource.resourceServer.name}</a>
+ <#else>
+ ${resource.resourceServer.name}
+ </#if>
+ </td>
+ <td>
+ <#if resource.shares?size != 0>
+ <a href="${url.getResourceDetailUrl(resource.id)}">${resource.shares?size} <i class="fa fa-users"></i></a>
+ <#else>
+ ${msg("notBeingShared")}
+ </#if>
+ </td>
+ </tr>
+ </#list>
+ <#else>
+ <tr>
+ <td colspan="4">${msg("notHaveAnyResource")}</td>
+ </tr>
+ </#if>
+ </tbody>
+ </table>
+ </div>
+ </div>
+
+ <div class="row">
+ <div class="col-md-12">
+ <h3>
+ ${msg("resourcesSharedWithMe")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <form action="${url.resourceUrl}" name="shareForm" method="post">
+ <input type="hidden" name="action" value="cancel"/>
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th width="5%"><input type="checkbox" onclick="selectAllCheckBoxes('shareForm', this, 'resource_id');" <#if authorization.sharedResources?size == 0>disabled="true"</#if></td>
+ <th>${msg("resource")}</th>
+ <th>${msg("owner")}</th>
+ <th>${msg("application")}</th>
+ <th>${msg("permission")}</th>
+ <th>${msg("date")}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <#if authorization.sharedResources?size != 0>
+ <#list authorization.sharedResources as resource>
+ <tr>
+ <td>
+ <input type="checkbox" name="resource_id" value="${resource.id}"/>
+ </td>
+ <td>
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
+ </td>
+ <td>
+ <#if resource.owner.email??>${resource.owner.email}<#else>${resource.owner.username}</#if>
+ </td>
+ <td>
+ <a href="${resource.resourceServer.baseUri}">${resource.resourceServer.name}</a>
+ </td>
+ <td>
+ <#if resource.permissions?size != 0>
+ <ul>
+ <#list resource.permissions as permission>
+ <#list permission.scopes as scope>
+ <#if scope.granted && scope.scope??>
+ <li>
+ <#if scope.scope.displayName??>
+ ${scope.scope.displayName}
+ <#else>
+ ${scope.scope.name}
+ </#if>
+ </li>
+ <#else>
+ ${msg("anyPermission")}
+ </#if>
+ </#list>
+ </#list>
+ </ul>
+ <#else>
+ Any action
+ </#if>
+ </td>
+ <td>
+ ${resource.permissions[0].grantedDate?datetime}
+ </td>
+ </tr>
+ </#list>
+ <#else>
+ <tr>
+ <td colspan="6">${msg("noResourcesSharedWithYou")}</td>
+ </tr>
+ </#if>
+ </tbody>
+ </table>
+ </form>
+ </div>
+ <#if authorization.sharedResources?size != 0>
+ <div class="col-md-12">
+ <a href="#" onclick="document.forms['shareForm'].submit();" type="submit" class="btn btn-danger">${msg("doRemoveSharing")}</a>
+ </div>
+ </#if>
+ </div>
+
+ <#if authorization.resourcesWaitingOthersApproval?size != 0>
+ <br/>
+ <div class="row">
+ <div class="col-md-12">
+ <h3>
+ ${msg("requestsWaitingApproval")}
+ </h3>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <i class="pficon pficon-info"></i> ${msg("havePermissionRequestsWaitingForApproval",authorization.resourcesWaitingOthersApproval?size)}
+ <a href="#" onclick="document.getElementById('waitingApproval').style.display=''">${msg("clickHereForDetails")}</a>
+ <div class="row">
+ <div class="col-md-12"></div>
+ </div>
+ <div class="row">
+ <div class="col-md-12"></div>
+ </div>
+ <div class="row">
+ <div class="col-md-12"></div>
+ </div>
+ <div class="row" id="waitingApproval" style="display:none">
+ <div class="col-md-12">
+ <form action="${url.resourceUrl}" name="waitingApprovalForm" method="post">
+ <input type="hidden" name="action" value="cancelRequest"/>
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <th width="5%"><input type="checkbox" onclick="selectAllCheckBoxes('waitingApprovalForm', this, 'resource_id');" <#if authorization.resourcesWaitingOthersApproval?size == 0>disabled="true"</#if></th>
+ <th>${msg("resource")}</th>
+ <th>${msg("owner")}</th>
+ <th>${msg("action")}</th>
+ <th>${msg("date")}</th>
+ </tr>
+ </thead>
+ <tbody>
+ <#list authorization.resourcesWaitingOthersApproval as resource>
+ <tr>
+ <td>
+ <input type="checkbox" name="resource_id" value="${resource.id}"/>
+ </td>
+ <td>
+ <#if resource.displayName??>${resource.displayName}<#else>${resource.name}</#if>
+ </td>
+ <td>
+ <#if resource.owner.email??>${resource.owner.email}<#else>${resource.owner.username}</#if>
+ </td>
+ <td>
+ <ul>
+ <#list resource.permissions as permission>
+ <#list permission.scopes as scope>
+ <li>
+ <#if scope.scope??>
+ <#if scope.scope.displayName??>
+ ${scope.scope.displayName}
+ <#else>
+ ${scope.scope.name}
+ </#if>
+ <#else>
+ ${msg("anyPermission")}
+ </#if>
+ </li>
+ </#list>
+ </#list>
+ </ul>
+ </td>
+ <td>
+ ${resource.permissions[0].createdDate?datetime}
+ </td>
+ </tr>
+ </#list>
+ </tbody>
+ </table>
+ </form>
+ </div>
+ <div class="col-md-12">
+ <a href="#" onclick="document.forms['waitingApprovalForm'].submit();" type="submit" class="btn btn-danger">${msg("doRemoveRequest")}</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </#if>
+
+</@layout.mainLayout> \ No newline at end of file
diff --git a/account/sessions.ftl b/account/sessions.ftl
new file mode 100644
index 0000000..89dbf65
--- /dev/null
+++ b/account/sessions.ftl
@@ -0,0 +1,44 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='sessions' bodyClass='sessions'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("sessionsHtmlTitle")}</h2>
+ </div>
+ </div>
+
+ <table class="table table-striped table-bordered">
+ <thead>
+ <tr>
+ <td>${msg("ip")}</td>
+ <td>${msg("started")}</td>
+ <td>${msg("lastAccess")}</td>
+ <td>${msg("expires")}</td>
+ <td>${msg("clients")}</td>
+ </tr>
+ </thead>
+
+ <tbody>
+ <#list sessions.sessions as session>
+ <tr>
+ <td>${session.ipAddress}</td>
+ <td>${session.started?datetime}</td>
+ <td>${session.lastAccess?datetime}</td>
+ <td>${session.expires?datetime}</td>
+ <td>
+ <#list session.clients as client>
+ ${client}<br/>
+ </#list>
+ </td>
+ </tr>
+ </#list>
+ </tbody>
+
+ </table>
+
+ <form action="${url.sessionsUrl}" method="post">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <button id="logout-all-sessions" class="btn btn-default">${msg("doLogOutAllSessions")}</button>
+ </form>
+
+</@layout.mainLayout>
diff --git a/account/template.ftl b/account/template.ftl
new file mode 100644
index 0000000..fc4ebe3
--- /dev/null
+++ b/account/template.ftl
@@ -0,0 +1,83 @@
+<#macro mainLayout active bodyClass>
+<!doctype html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta name="robots" content="noindex, nofollow">
+
+ <title>${msg("accountManagementTitle")}</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 type="text/javascript" src="${url.resourcesPath}/${script}"></script>
+ </#list>
+ </#if>
+</head>
+<body class="admin-console user ${bodyClass}">
+
+ <header class="navbar navbar-default navbar-pf navbar-main header">
+ <nav class="navbar" role="navigation">
+ <div class="navbar-header">
+ <div class="container">
+ <h1 class="navbar-title">Keycloak</h1>
+ </div>
+ </div>
+ <div class="navbar-collapse navbar-collapse-1">
+ <div class="container">
+ <ul class="nav navbar-nav navbar-utility">
+ <#if realm.internationalizationEnabled>
+ <li>
+ <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>
+ <li>
+ </#if>
+ <#if referrer?has_content && referrer.url?has_content><li><a href="${referrer.url}" id="referrer">${msg("backTo",referrer.name)}</a></li></#if>
+ <li><a href="${url.logoutUrl}">${msg("doSignOut")}</a></li>
+ </ul>
+ </div>
+ </div>
+ </nav>
+ </header>
+
+ <div class="container">
+ <div class="bs-sidebar col-sm-3">
+ <ul>
+ <li class="<#if active=='account'>active</#if>"><a href="${url.accountUrl}">${msg("account")}</a></li>
+ <#if features.passwordUpdateSupported><li class="<#if active=='password'>active</#if>"><a href="${url.passwordUrl}">${msg("password")}</a></li></#if>
+ <li class="<#if active=='totp'>active</#if>"><a href="${url.totpUrl}">${msg("authenticator")}</a></li>
+ <#if features.identityFederation><li class="<#if active=='social'>active</#if>"><a href="${url.socialUrl}">${msg("federatedIdentity")}</a></li></#if>
+ <li class="<#if active=='sessions'>active</#if>"><a href="${url.sessionsUrl}">${msg("sessions")}</a></li>
+ <li class="<#if active=='applications'>active</#if>"><a href="${url.applicationsUrl}">${msg("applications")}</a></li>
+ <#if features.log><li class="<#if active=='log'>active</#if>"><a href="${url.logUrl}">${msg("log")}</a></li></#if>
+ <#if realm.userManagedAccessAllowed && features.authorization><li class="<#if active=='authorization'>active</#if>"><a href="${url.resourceUrl}">${msg("myResources")}</a></li></#if>
+ </ul>
+ </div>
+
+ <div class="col-sm-9 content-area">
+ <#if message?has_content>
+ <div class="alert alert-${message.type}">
+ <#if message.type=='success' ><span class="pficon pficon-ok"></span></#if>
+ <#if message.type=='error' ><span class="pficon pficon-error-circle-o"></span></#if>
+ <span class="kc-feedback-text">${kcSanitize(message.summary)?no_esc}</span>
+ </div>
+ </#if>
+
+ <#nested "content">
+ </div>
+ </div>
+
+</body>
+</html>
+</#macro> \ No newline at end of file
diff --git a/account/theme.properties b/account/theme.properties
new file mode 100644
index 0000000..1b3474b
--- /dev/null
+++ b/account/theme.properties
@@ -0,0 +1 @@
+locales=ca,de,en,es,fr,it,ja,lt,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN
diff --git a/account/totp.ftl b/account/totp.ftl
new file mode 100644
index 0000000..987fe24
--- /dev/null
+++ b/account/totp.ftl
@@ -0,0 +1,141 @@
+<#import "template.ftl" as layout>
+<@layout.mainLayout active='totp' bodyClass='totp'; section>
+
+ <div class="row">
+ <div class="col-md-10">
+ <h2>${msg("authenticatorTitle")}</h2>
+ </div>
+ <#if totp.otpCredentials?size == 0>
+ <div class="col-md-2 subtitle">
+ <span class="subtitle"><span class="required">*</span> ${msg("requiredFields")}</span>
+ </div>
+ </#if>
+ </div>
+
+ <#if totp.enabled>
+ <table class="table table-bordered table-striped">
+ <thead>
+ <#if totp.otpCredentials?size gt 1>
+ <tr>
+ <th colspan="4">${msg("configureAuthenticators")}</th>
+ </tr>
+ <#else>
+ <tr>
+ <th colspan="3">${msg("configureAuthenticators")}</th>
+ </tr>
+ </#if>
+ </thead>
+ <tbody>
+ <#list totp.otpCredentials as credential>
+ <tr>
+ <td class="provider">${msg("mobile")}</td>
+ <#if totp.otpCredentials?size gt 1>
+ <td class="provider">${credential.id}</td>
+ </#if>
+ <td class="provider">${credential.userLabel!}</td>
+ <td class="action">
+ <form action="${url.totpUrl}" method="post" class="form-inline">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <input type="hidden" id="submitAction" name="submitAction" value="Delete">
+ <input type="hidden" id="credentialId" name="credentialId" value="${credential.id}">
+ <button id="remove-mobile" class="btn btn-default">
+ <i class="pficon pficon-delete"></i>
+ </button>
+ </form>
+ </td>
+ </tr>
+ </#list>
+ </tbody>
+ </table>
+ <#else>
+
+ <hr/>
+
+ <ol>
+ <li>
+ <p>${msg("totpStep1")}</p>
+
+ <ul>
+ <#list totp.policy.supportedApplications as app>
+ <li>${app}</li>
+ </#list>
+ </ul>
+ </li>
+
+ <#if mode?? && mode = "manual">
+ <li>
+ <p>${msg("totpManualStep2")}</p>
+ <p><span id="kc-totp-secret-key">${totp.totpSecretEncoded}</span></p>
+ <p><a href="${totp.qrUrl}" id="mode-barcode">${msg("totpScanBarcode")}</a></p>
+ </li>
+ <li>
+ <p>${msg("totpManualStep3")}</p>
+ <ul>
+ <li id="kc-totp-type">${msg("totpType")}: ${msg("totp." + totp.policy.type)}</li>
+ <li id="kc-totp-algorithm">${msg("totpAlgorithm")}: ${totp.policy.getAlgorithmKey()}</li>
+ <li id="kc-totp-digits">${msg("totpDigits")}: ${totp.policy.digits}</li>
+ <#if totp.policy.type = "totp">
+ <li id="kc-totp-period">${msg("totpInterval")}: ${totp.policy.period}</li>
+ <#elseif totp.policy.type = "hotp">
+ <li id="kc-totp-counter">${msg("totpCounter")}: ${totp.policy.initialCounter}</li>
+ </#if>
+ </ul>
+ </li>
+ <#else>
+ <li>
+ <p>${msg("totpStep2")}</p>
+ <p><img src="data:image/png;base64, ${totp.totpSecretQrCode}" alt="Figure: Barcode"></p>
+ <p><a href="${totp.manualUrl}" id="mode-manual">${msg("totpUnableToScan")}</a></p>
+ </li>
+ </#if>
+ <li>
+ <p>${msg("totpStep3")}</p>
+ <p>${msg("totpStep3DeviceName")}</p>
+ </li>
+ </ol>
+
+ <hr/>
+
+ <form action="${url.totpUrl}" class="form-horizontal" method="post">
+ <input type="hidden" id="stateChecker" name="stateChecker" value="${stateChecker}">
+ <div class="form-group">
+ <div class="col-sm-2 col-md-2">
+ <label for="totp" class="control-label">${msg("authenticatorCode")}</label> <span class="required">*</span>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="totp" name="totp" autocomplete="off" autofocus>
+ <input type="hidden" id="totpSecret" name="totpSecret" value="${totp.totpSecret}"/>
+ </div>
+
+
+ </div>
+
+ <div class="form-group" ${messagesPerField.printIfExists('userLabel',properties.kcFormGroupErrorClass!)}">
+ <div class="col-sm-2 col-md-2">
+ <label for="userLabel" class="control-label">${msg("totpDeviceName")}</label> <#if totp.otpCredentials?size gte 1><span class="required">*</span></#if>
+ </div>
+
+ <div class="col-sm-10 col-md-10">
+ <input type="text" class="form-control" id="userLabel" name="userLabel" autocomplete="off">
+ </div>
+ </div>
+
+ <div class="form-group">
+ <div id="kc-form-buttons" class="col-md-offset-2 col-md-10 submit">
+ <div class="">
+ <button type="submit"
+ class="${properties.kcButtonClass!} ${properties.kcButtonPrimaryClass!} ${properties.kcButtonLargeClass!}"
+ id="saveTOTPBtn" name="submitAction" value="Save">${msg("doSave")}
+ </button>
+ <button type="submit"
+ class="${properties.kcButtonClass!} ${properties.kcButtonDefaultClass!} ${properties.kcButtonLargeClass!}"
+ id="cancelTOTPBtn" name="submitAction" value="Cancel">${msg("doCancel")}
+ </button>
+ </div>
+ </div>
+ </div>
+ </form>
+ </#if>
+
+</@layout.mainLayout>