From 06e02e8026ba404e971770e240e9f995bce61ebd Mon Sep 17 00:00:00 2001 From: Michael Gerber Date: Fri, 20 Mar 2015 10:36:42 +0100 Subject: [PATCH] i18n for code.ftl i18n for login-oauth-grant.ftl i18n for account.ftl i18n for account.ftl i18n for federatedIdentity.ftl i18n for log.ftl i18n for password.ftl i18n for sessions.ftl i18n for template.ftl i18n for totp.ftl i18nfix i18n messages cleanup advanced message formater for claim and role --- .../beans/AdvancedMessageFormatterMethod.java | 36 ++++++++ .../beans/MessageFormatterMethod.java | 2 +- .../resources/theme/account/base/account.ftl | 10 +- .../theme/account/base/federatedIdentity.ftl | 6 +- .../main/resources/theme/account/base/log.ftl | 12 +-- .../base/messages/messages_de.properties | 57 ++++++++++-- .../base/messages/messages_en.properties | 92 ++++++++++++++----- .../resources/theme/account/base/password.ftl | 8 +- .../resources/theme/account/base/sessions.ftl | 14 +-- .../resources/theme/account/base/template.ftl | 18 ++-- .../resources/theme/account/base/totp.ftl | 20 ++-- .../keycloak/messages/messages_de.properties | 2 +- .../main/resources/theme/login/base/code.ftl | 6 +- .../theme/login/base/login-oauth-grant.ftl | 10 +- .../base/messages/messages_de.properties | 39 ++++---- .../base/messages/messages_en.properties | 27 ++++-- .../FreeMarkerLoginFormsProvider.java | 2 + .../testsuite/account/AccountTest.java | 10 +- .../federation/AbstractKerberosTest.java | 2 +- .../FederationProvidersIntegrationTest.java | 4 +- .../federation/KerberosLdapTest.java | 4 +- .../testsuite/forms/RegisterTest.java | 2 +- .../testsuite/forms/ResetPasswordTest.java | 6 +- .../oauth/AuthorizationCodeTest.java | 6 +- 24 files changed, 264 insertions(+), 131 deletions(-) create mode 100644 forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/AdvancedMessageFormatterMethod.java diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/AdvancedMessageFormatterMethod.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/AdvancedMessageFormatterMethod.java new file mode 100644 index 0000000000..007d445e88 --- /dev/null +++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/AdvancedMessageFormatterMethod.java @@ -0,0 +1,36 @@ +package org.keycloak.freemarker.beans; + +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Locale; +import java.util.Properties; + +/** + * @author Michael Gerber + */ +public class AdvancedMessageFormatterMethod implements TemplateMethodModelEx { + private final Properties messages; + private final Locale locale; + + public AdvancedMessageFormatterMethod(Locale locale, Properties messages) { + this.locale = locale; + this.messages = messages; + } + + @Override + public Object exec(List list) throws TemplateModelException { + if (list.size() >= 1) { + String key = list.get(0).toString(); + if (key.startsWith("${") && key.endsWith("}")) { + key = key.substring(2, key.length() - 1); + return new MessageFormat(messages.getProperty(key, key), locale).format(list.subList(1, list.size()).toArray()); + } else { + return key; + } + } + return null; + } +} diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/MessageFormatterMethod.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/MessageFormatterMethod.java index 37bfc56a29..db57676a9f 100644 --- a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/MessageFormatterMethod.java +++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/beans/MessageFormatterMethod.java @@ -22,8 +22,8 @@ public class MessageFormatterMethod implements TemplateMethodModelEx { @Override public Object exec(List list) throws TemplateModelException { - String key = list.get(0).toString(); if (list.size() >= 1) { + String key = list.get(0).toString(); return new MessageFormat(messages.getProperty(key,key),locale).format(list.subList(1, list.size()).toArray()); } else { return null; diff --git a/forms/common-themes/src/main/resources/theme/account/base/account.ftl b/forms/common-themes/src/main/resources/theme/account/base/account.ftl index 34487d7e24..8a6559995f 100755 --- a/forms/common-themes/src/main/resources/theme/account/base/account.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/account.ftl @@ -3,10 +3,10 @@
-

Edit Account

+

${msg("editAccountHtmlTtile")}

- * Required fields + * ${msg("requiredFields")}
@@ -104,9 +104,9 @@
- <#if url.referrerURI??>Back to application - - + <#if url.referrerURI??>${msg("backToApplication")}/a> + +
diff --git a/forms/common-themes/src/main/resources/theme/account/base/federatedIdentity.ftl b/forms/common-themes/src/main/resources/theme/account/base/federatedIdentity.ftl index d15ba106ff..a9cf3213b5 100755 --- a/forms/common-themes/src/main/resources/theme/account/base/federatedIdentity.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/federatedIdentity.ftl @@ -3,7 +3,7 @@
-

Federated Identities

+

${msg("federatedIdentitiesHtmlTitle")}

@@ -19,10 +19,10 @@
<#if identity.connected> <#if federatedIdentity.removeLinkPossible> - Remove ${identity.providerName!} + ${msg("doRemove")} <#else> - Add ${identity.providerName!} + ${msg("doAdd")}
diff --git a/forms/common-themes/src/main/resources/theme/account/base/log.ftl b/forms/common-themes/src/main/resources/theme/account/base/log.ftl index 8f6473656c..29046cf0d2 100644 --- a/forms/common-themes/src/main/resources/theme/account/base/log.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/log.ftl @@ -3,18 +3,18 @@
-

Account Log

+

${msg("accountLogHtmlTitle")}

- - - - - + + + + + diff --git a/forms/common-themes/src/main/resources/theme/account/base/messages/messages_de.properties b/forms/common-themes/src/main/resources/theme/account/base/messages/messages_de.properties index 4d3e4b37bc..79bc9efc44 100644 --- a/forms/common-themes/src/main/resources/theme/account/base/messages/messages_de.properties +++ b/forms/common-themes/src/main/resources/theme/account/base/messages/messages_de.properties @@ -1,9 +1,24 @@ +doLogOutAllSessions=Alle Sessionen abmelden +doSave=Speichern +doCancel=Abbrechen +doRemove=Entfernen +doAdd=Hinzufügen +doSignOut=Abmelden + +editAccountHtmlTtile=Benutzerkonto Bearbeiten +federatedIdentitiesHtmlTitle=Federated Identities +accountLogHtmlTitle=Benutzerkonto Log +changePasswordHtmlTitle=Passwort Ändern +sessionsHtmlTitle=Sessions +accountManagementTitle=Keycloak Benutzerkontoverwaltung +authenticatorTitle=Authenticator + authenticatorCode=One-time code email=E-Mail firstName=Vorname lastName=Nachname password=Passwort -passwordConfirm=Passwort bestätigung +passwordConfirm=Passwortbestätigung passwordNew=Neues Passwort username=Benutzernamen street=Strasse @@ -12,6 +27,36 @@ postal_code=PLZ locality=Stadt oder Ortschaft country=Land +requiredFields=Erforderliche Felder +allFieldsRequired=Alle Felder sind Erforderlich + +backToApplication=« Zurück zur Applikation +backTo=Zurück zu {0} + +date=Datum +event=Ereignis +ip=IP +client=Client +clients=Clients +details=Details +started=Startdatum +lastAccess=Letzter Zugriff +expires=Ablaufdatum +applications= + +account=Benutzerkonto +federatedIdentity=Federated Identity +authenticator=Authenticator +sessions=Sessions +log=Log + +configureAuthenticators=Authenticators konfigurieren +mobile=Mobile +totpStep1=Installieren Sie FreeOTP oder Google Authenticator auf Ihrem Smartphone. +totpStep2=Öffnen Sie die Applikation und scannen Sie den Barcode oder geben sie den Code ein. +totpStep3=Geben Sie den One-time Code welcher die Applikation generiert hat ein und klicken Sie auf Speichern. + + missingFirstNameMessage=Bitte geben Sie einen Vornamen ein. missingEmailMessage=Bitte geben Sie eine E-Mail Adresse ein. missingLastNameMessage=Bitte geben Sie einen Nachnamen ein. @@ -20,7 +65,7 @@ notMatchPasswordMessage=Passw missingTotpMessage=Bitte geben Sie den One-time Code ein. invalidPasswordExistingMessage=Das aktuelle Passwort is ungültig. -invalidPasswordConfirmMessage=Die Passwort bestätigung ist nicht identisch. +invalidPasswordConfirmMessage=Die Passwortbestätigung ist nicht identisch. invalidTotpMessage=Ungültiger One-time Code. invalidEmailMessage=Ungültige E-Mail Adresse. @@ -37,15 +82,13 @@ missingIdentityProviderMessage=Identity Provider nicht angegeben. invalidFederatedIdentityActionMessage=Ungültige oder fehlende Aktion. identityProviderNotFoundMessage=Angegebener Identity Provider nicht gefunden. federatedIdentityLinkNotActiveMessage=Diese Identität ist nicht mehr aktiv. -federatedIdentityRemovingLastProviderMessage=Sie können den letzen Eintrag nicht enfernen, da Sie kein Passwort haben. -identityProviderRedirectErrorMessage=Fehler bei der Weiterleitung zum Identity Proivder. +federatedIdentityRemovingLastProviderMessage=Sie können den letzen Eintrag nicht entfernen, da Sie kein Passwort haben. +identityProviderRedirectErrorMessage=Fehler bei der Weiterleitung zum Identity Provider. identityProviderRemovedMessage=Identity Provider erfolgreich entfernt. accountDisabledMessage=Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin. -doLogOutAllSessions=Alle Sessionen abmelden - -accountTemporarilyDisabledMessage=Benutzerkonto ist temporär gespert, bitte kontaktieren Sie den Admin oder versuchen Sie es später nocheinmal. +accountTemporarilyDisabledMessage=Benutzerkonto ist temporär gesperrt, bitte kontaktieren Sie den Admin oder versuchen Sie es später noch einmal. invalidPasswordMinLengthMessage=Ungültiges Passwort: minimum länge {0}. invalidPasswordMinDigitsMessage=Ungültiges Passwort: muss mindestens {0} Zahl(en) beinhalten. invalidPasswordMinLowerCaseCharsMessage=Ungültiges Passwort: muss mindestens {0} Kleinbuchstaben beinhalten. diff --git a/forms/common-themes/src/main/resources/theme/account/base/messages/messages_en.properties b/forms/common-themes/src/main/resources/theme/account/base/messages/messages_en.properties index 7cf27a4f53..0d995cd3aa 100755 --- a/forms/common-themes/src/main/resources/theme/account/base/messages/messages_en.properties +++ b/forms/common-themes/src/main/resources/theme/account/base/messages/messages_en.properties @@ -1,3 +1,18 @@ +doSave=Save +doCancel=Cancel +doLogOutAllSessions=Log out all sessions +doRemove=Remove +doAdd=Add +doSignOut=Sign Out + +editAccountHtmlTtile=Edit Account +federatedIdentitiesHtmlTitle=Federated Identities +accountLogHtmlTitle=Account Log +changePasswordHtmlTitle=Change Password +sessionsHtmlTitle=Sessions +accountManagementTitle=Keycloak Account Management +authenticatorTitle=Authenticator + authenticatorCode=One-time code email=Email firstName=First name @@ -12,6 +27,35 @@ region=State, Province, or Region postal_code=Zip or Postal code country=Country +requiredFields=Required fields +allFieldsRequired=All fields required + +backToApplication=« 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 +sessions=Sessions +log=Log + +configureAuthenticators=Configured Authenticators +mobile=Mobile +totpStep1=Install FreeOTP or Google Authenticator on your mobile. +totpStep2=Open the application and scan the barcode or enter the key. +totpStep3=Enter the one-time code provided by the application and click Save to finish the setup. + missingFirstNameMessage=Please specify first name. invalidEmailMessage=Invalid email address. missingLastNameMessage=Please specify last name. @@ -19,39 +63,37 @@ missingEmailMessage=Please specify email. missingPasswordMessage=Please specify password. notMatchPasswordMessage=Passwords don''t match. -missingTotpMessage=Please specify authenticator code -invalidPasswordExistingMessage=Invalid existing password -invalidPasswordConfirmMessage=Password confirmation doesn''t match -invalidTotpMessage=Invalid authenticator code +missingTotpMessage=Please specify authenticator code. +invalidPasswordExistingMessage=Invalid existing password. +invalidPasswordConfirmMessage=Password confirmation doesn''t match. +invalidTotpMessage=Invalid authenticator code. -readOnlyUserMessage=You can''t update your account as it is read only -readOnlyPasswordMessage=You can''t update your password as your account is read only +readOnlyUserMessage=You can''t update your account 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. -accountUpdatedMessage=Your account has been updated -accountPasswordUpdatedMessage=Your password has been updated +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 password -identityProviderRedirectErrorMessage=Failed to redirect to identity provider -identityProviderRemovedMessage=Identity provider removed successfully +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 password. +identityProviderRedirectErrorMessage=Failed to redirect to identity provider. +identityProviderRemovedMessage=Identity provider removed successfully. -accountDisabledMessage=Account is disabled, contact admin +accountDisabledMessage=Account is disabled, contact admin. -doLogOutAllSessions=Log out all sessions - -accountTemporarilyDisabledMessage=Account is temporarily disabled, contact admin 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 +accountTemporarilyDisabledMessage=Account is temporarily disabled, contact admin 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. locale_de=German locale_en=English diff --git a/forms/common-themes/src/main/resources/theme/account/base/password.ftl b/forms/common-themes/src/main/resources/theme/account/base/password.ftl index b0a38132c8..40acc6e7e9 100755 --- a/forms/common-themes/src/main/resources/theme/account/base/password.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/password.ftl @@ -3,10 +3,10 @@
-

Change Password

+

${msg("changePasswordHtmlTitle")}

- All fields required + ${msg("allFieldsRequired")}
@@ -48,8 +48,8 @@
- - + +
diff --git a/forms/common-themes/src/main/resources/theme/account/base/sessions.ftl b/forms/common-themes/src/main/resources/theme/account/base/sessions.ftl index 30107438d4..c781c79381 100755 --- a/forms/common-themes/src/main/resources/theme/account/base/sessions.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/sessions.ftl @@ -3,19 +3,19 @@
-

Sessions

+

${msg("sessionsHtmlTitle")}

DateEventIPClientDetails${msg("date")}${msg("event")}${msg("ip")}${msg("client")}${msg("details")}
- - - - - - + + + + + + diff --git a/forms/common-themes/src/main/resources/theme/account/base/template.ftl b/forms/common-themes/src/main/resources/theme/account/base/template.ftl index adfd52ca5b..22bade4791 100644 --- a/forms/common-themes/src/main/resources/theme/account/base/template.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/template.ftl @@ -3,7 +3,7 @@ - Keycloak Account Management + ${msg("accountManagementTitle")} <#if properties.styles?has_content> <#list properties.styles?split(' ') as style> @@ -40,8 +40,8 @@
  • - <#if referrer?has_content && referrer.url?has_content>
  • Back to ${referrer.name}
  • -
  • Sign Out
  • + <#if referrer?has_content && referrer.url?has_content>
  • ${msg("backTo",referrer.name)}
  • +
  • ${msg("doSignOut")}
  • @@ -51,12 +51,12 @@
    diff --git a/forms/common-themes/src/main/resources/theme/account/base/totp.ftl b/forms/common-themes/src/main/resources/theme/account/base/totp.ftl index 45e782934b..96021009f3 100755 --- a/forms/common-themes/src/main/resources/theme/account/base/totp.ftl +++ b/forms/common-themes/src/main/resources/theme/account/base/totp.ftl @@ -2,17 +2,17 @@ <@layout.mainLayout active='totp' bodyClass='totp'; section> <#if totp.enabled> -

    Authenticators

    +

    ${msg("authenticatorTitle")}

    IPStartedLast AccessExpiresApplicationsClients${msg("ip")}${msg("started")}${msg("lastAccess")}${msg("expires")}${msg("applications")}${msg("clients")}
    - + - + @@ -20,23 +20,21 @@
    Configured Authenticators${msg("configureAuthenticators")}/th>
    Mobile${msg("mobile")}
    <#else> -

    Authenticator

    +

    ${msg("authenticatorTitle")}


    1. - Install FreeOTP or - Google Authenticator - on your mobile +

      ${msg("totpStep1")}

    2. - Open the application and scan the barcode or enter the key
      +

      ${msg("totpStep2")}

      Figure: Barcode
      ${totp.totpSecretEncoded}
    3. - Enter the one-time code provided by the application and click Submit to finish the setup. +

      ${msg("totpStep3")}

    @@ -58,8 +56,8 @@
    - - + +
    diff --git a/forms/common-themes/src/main/resources/theme/email/keycloak/messages/messages_de.properties b/forms/common-themes/src/main/resources/theme/email/keycloak/messages/messages_de.properties index a5a85f9ecf..60228c3472 100644 --- a/forms/common-themes/src/main/resources/theme/email/keycloak/messages/messages_de.properties +++ b/forms/common-themes/src/main/resources/theme/email/keycloak/messages/messages_de.properties @@ -1,6 +1,6 @@ emailVerificationSubject=E-Mail verifizieren passwordResetSubject=Passwort zurückzusetzen -passwordResetBody=Jemand hat angeforder Ihr Keycloak Passwort zurückzusetzen. Falls das Sie waren, dann klicken Sie auf den folgenden Link um das Passwort zurückzusetzen.\n\n{0}\n\nDieser Link wird in {1} Minuten ablaufen.\n\nFalls Sie das Passwort nicht zurücksetzen möchten, dann können Sie diese E-Mail ignorieren. +passwordResetBody=Jemand hat angefordert Ihr Keycloak Passwort zurückzusetzen. Falls das Sie waren, dann klicken Sie auf den folgenden Link um das Passwort zurückzusetzen.\n\n{0}\n\nDieser Link wird in {1} Minuten ablaufen.\n\nFalls Sie das Passwort nicht zurücksetzen möchten, dann können Sie diese E-Mail ignorieren. emailVerificationBody=Jemand hat ein Keycloak Konto mit dieser E-Mail Adresse erstellt. Fall das Sie waren, dann klicken Sie auf den Link um die E-Mail Adresse zu verifizieren.\n\n{0}\n\nDieser Link wird in {1} Minuten ablaufen.\n\nFalls Sie dieses Konto nicht erstellt haben, dann können sie diese Nachricht ignorieren. eventLoginErrorSubject=Fehlgeschlagene Anmeldung eventLoginErrorBody=Jemand hat um {0} von {1} versucht sich mit ihrem Konto anzumelden. Falls das nicht Sie waren, dann kontaktieren Sie bitte Ihren Admin. diff --git a/forms/common-themes/src/main/resources/theme/login/base/code.ftl b/forms/common-themes/src/main/resources/theme/login/base/code.ftl index eb84d7b652..f266bdade6 100755 --- a/forms/common-themes/src/main/resources/theme/login/base/code.ftl +++ b/forms/common-themes/src/main/resources/theme/login/base/code.ftl @@ -2,14 +2,14 @@ <@layout.registrationLayout; section> <#if section = "title"> <#if code.success> - Success code=${code.code} + ${msg("codeSuccessTitle")} <#else> - Error error=${code.error} + ${msg("codeErrorTitle", code.error)} <#elseif section = "form">
    <#if code.success> -

    Please copy this code and paste it into your application:

    +

    ${msg("copyCodeInstruction")}

    <#else>

    ${code.error}

    diff --git a/forms/common-themes/src/main/resources/theme/login/base/login-oauth-grant.ftl b/forms/common-themes/src/main/resources/theme/login/base/login-oauth-grant.ftl index 757a715bcf..9b0637bebe 100755 --- a/forms/common-themes/src/main/resources/theme/login/base/login-oauth-grant.ftl +++ b/forms/common-themes/src/main/resources/theme/login/base/login-oauth-grant.ftl @@ -12,9 +12,9 @@ <#if oauth.claimsRequested??>
  • - Personal Info:  + ${msg("personalInfo")}  <#list oauth.claimsRequested as claim> - ${claim}  + ${advancedMsg(claim)}<#if claim_has_next>, 
  • @@ -29,7 +29,7 @@ <#if oauth.realmRolesRequested??> <#list oauth.realmRolesRequested as role>
  • - <#if role.description??>${role.description}<#else>${role.name} + <#if role.description??>${advancedMsg(role.description)}<#else>${advancedMsg(role.name)}
  • @@ -37,8 +37,8 @@ <#list oauth.resourceRolesRequested?keys as resource> <#list oauth.resourceRolesRequested[resource] as role>
  • - <#if role.description??>${role.description}<#else>${role.name} - in ${resource} + <#if role.description??>${advancedMsg(role.description)}<#else>${advancedMsg(role.name)} + ${msg("inResource", resource)}
  • diff --git a/forms/common-themes/src/main/resources/theme/login/base/messages/messages_de.properties b/forms/common-themes/src/main/resources/theme/login/base/messages/messages_de.properties index c4c2bef3fd..dc5acea5cf 100644 --- a/forms/common-themes/src/main/resources/theme/login/base/messages/messages_de.properties +++ b/forms/common-themes/src/main/resources/theme/login/base/messages/messages_de.properties @@ -12,16 +12,18 @@ registerWithTitleHtml=Registrierung bei {0} loginTitle=Anmeldung bei {0} loginTitleHtml=Anmeldung bei {0} loginOauthTitle=Temporärer zugriff auf {0} -loginOauthTitleHtml=Temporärer zugriff auf {0} angefordert von {1}. +loginOauthTitleHtml=Temporärer zugriff auf {0} angefordert von {1}. loginTotpTitle=Mobile Authentifizierung Einrichten -loginProfileTitle=Benutzer Konto Informatinen aktualisieren +loginProfileTitle=Benutzerkonto Informationen aktualisieren oauthGrantTitle=OAuth gewähren -oauthGrantTitleHtml=Temporärer zugriff auf {0} angefordert von {1}. +oauthGrantTitleHtml=Temporärer zugriff auf {0} angefordert von {1}. errorTitle=Es tut uns leid... errorTitleHtml=Es tut uns leid... emailVerifyTitle=E-Mail verifizieren emailForgotTitle=Passwort vergessen? updatePasswordTitle=Passwort aktualisieren +codeSuccessTitle=Erfolgreicher code +codeErrorTitle=Fehler code\: {0} noAccount=Neuer Benutzer? username=Benutzername @@ -47,7 +49,8 @@ loginTotpStep2= loginTotpStep3=Geben Sie den One-time Code welcher die Applikation generiert hat ein und klicken Sie auf Absenden. loginTotpOneTime=One-time Code -oauthGrantRequest=Do you grant these access privileges? +oauthGrantRequest=Wollen Sie diese Zugriffsreche gewähren? +inResource=in {0} emailVerifyInstruction1=Ein E-Mail mit weitern Anweisungen wurde an Sie versendet. emailVerifyInstruction2=Falls Sie kein E-Mail erhalten haben, dann können Sie @@ -58,10 +61,14 @@ backToApplication=« Zur emailInstruction=Geben Sie ihren Benutzernamen oder E-Mail Adresse ein und klicken Sie auf Absenden. Danach werden wir ihnen ein E-Mail mit weiteren Instruktionen zusenden. +copyCodeInstruction=Bitte kopieren sie den folgenden Code und fügen ihn in die Applikation ein\: + +personalInfo=Persönliche Informationen: + invalidUserMessage=Ungültiger Benutzername oder Passwort. invalidEmailMessage=Ungültige E-Mail Adresse. accountDisabledMessage=Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin. -accountTemporarilyDisabledMessage=Benutzerkonto ist temporär gespert, bitte kontaktieren Sie den Admin oder versuchen Sie es später nocheinmal. +accountTemporarilyDisabledMessage=Benutzerkonto ist temporär gesperrt, bitte kontaktieren Sie den Admin oder versuchen Sie es später noch einmal. expiredCodeMessage=Zeitüberschreitung bei der Anmeldung. Bitter melden Sie sich erneut an. missingFirstNameMessage=Bitte geben Sie einen Vornamen ein. @@ -73,14 +80,14 @@ missingTotpMessage=Bitte geben Sie den One-time Code ein. notMatchPasswordMessage=Passwörter sind nicht identisch. invalidPasswordExistingMessage=Das aktuelle Passwort is ungültig. -invalidPasswordConfirmMessage=Die Passwort bestätigung ist nicht identisch. +invalidPasswordConfirmMessage=Die Passwortbestätigung ist nicht identisch. invalidTotpMessage=Ungültiger One-time Code. -usernameExistsMessage=Benutzermane exisitert bereits. +usernameExistsMessage=Benutzername existiert bereits. emailExistsMessage=E-Mail existiert bereits. -federatedIdentityEmailExistsMessage=Es exisitert bereits ein Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich bei der Benutzerverwaltung an um das Benutzerkonto zu verknüpfen. -federatedIdentityUsernameExistsMessage=Es exisitert bereits ein Benutzer mit diesem Benutzernamen. Bitte melden Sie sich bei der Benutzerverwaltung an um das Benutzerkonto zu verknüpfen. +federatedIdentityEmailExistsMessage=Es existiert bereits ein Benutzer mit dieser E-Mail Adresse. Bitte melden Sie sich bei der Benutzerverwaltung an um das Benutzerkonto zu verknüpfen. +federatedIdentityUsernameExistsMessage=Es existiert bereits ein Benutzer mit diesem Benutzernamen. Bitte melden Sie sich bei der Benutzerverwaltung an um das Benutzerkonto zu verknüpfen. configureTotpMessage=Sie müssen eine Mobile Authentifizierung einrichten um das Benutzerkonto zu aktivieren. updateProfileMessage=Sie müssen ihr Benutzerkonto aktualisieren um das Benutzerkonto zu aktivieren. @@ -118,28 +125,28 @@ registrationNotAllowedMessage=Registrierung nicht erlaubt. permissionNotApprovedMessage=Berechtigung nicht bestätigt. noRelayStateInResponseMessage=Kein relay state in der Antwort von dem Identity Provider [{0}]. identityProviderAlreadyLinkedMessage=Die Identität welche von dem Identity Provider [{0}] zurückgegeben wurde, ist bereits mit einem anderen Benutzer verknüpft. -insufficientPermissionMessage=Nicht genügtend Rechte um die Identität zu verknüpfen. +insufficientPermissionMessage=Nicht genügend Rechte um die Identität zu verknüpfen. couldNotProceedWithAuthenticationRequestMessage=Konnte den Authentifizierungs Request nicht weiter verarbeiten. couldNotObtainTokenMessage=Konnte kein token vom Identity Provider [{0}] entnehmen. unexpectedErrorRetrievingTokenMessage=Unerwarteter Fehler während dem Empfang des Token von dem Identity Provider [{0}]. -unexpectedErrorHandlingResponseMessage=Unerwarteter Fehler während der bearbeitung des Respons vom Identity Provider [{0}]. +unexpectedErrorHandlingResponseMessage=Unerwarteter Fehler während der Bearbeitung des Respons vom Identity Provider [{0}]. identityProviderAuthenticationFailedMessage=Authentifizierung Fehlgeschlagen. Konnte sich mit dem Identity Provider [{0}] nicht authentifizieren. -couldNotSendAuthenticationRequestMessage=Konnte Authentifizierungs Request nicht an den Identity Provider [{0}] schiken. -unexpectedErrorHandlingRequestMessage=Unerwarteter Fehler während der bearbeitung des Requests zum Identity Provider [{0}]. +couldNotSendAuthenticationRequestMessage=Konnte Authentifizierungs Request nicht an den Identity Provider [{0}] schicken. +unexpectedErrorHandlingRequestMessage=Unerwarteter Fehler während der Bearbeitung des Requests zum Identity Provider [{0}]. invalidAccessCodeMessage=Ungültiger Access-Code. sessionNotActiveMessage=Session nicht aktiv. unknownCodeMessage=Unbekannter Code, bitte melden Sie sich erneut über die Applikation an. invalidCodeMessage=Ungültiger Code, bitte melden Sie sich erneut über die Applikation an. identityProviderUnexpectedErrorMessage=Unerwarteter Fehler während der Authentifizierung mit dem Identity Provider. -identityProviderNotFoundMessage=Konnte kein Identity Provider mit der Idenität [{0}] finden. -realmSupportsNoCredentialsMessage=Realm [{0}] unterstützt keine Credential Typen.. +identityProviderNotFoundMessage=Konnte kein Identity Provider mit der Identität [{0}] finden. +realmSupportsNoCredentialsMessage=Realm [{0}] unterstützt keine Credential Typen. identityProviderNotUniqueMessage=Realm [{0}] unterstütz mehrere Identity Providers. invalidParameterMessage=Invalid parameter\: {0} missingParameterMessage=Missing parameter\: {0} clientNotFoundMessage=Client not found. -emailVerifiedMessage=Ihr E-Mail Addresse wurde erfolgreich verifiziert. +emailVerifiedMessage=Ihr E-Mail Adresse wurde erfolgreich verifiziert. locale_de=Deutsch locale_en=Englisch diff --git a/forms/common-themes/src/main/resources/theme/login/base/messages/messages_en.properties b/forms/common-themes/src/main/resources/theme/login/base/messages/messages_en.properties index afbe5844a4..5ed7cece57 100755 --- a/forms/common-themes/src/main/resources/theme/login/base/messages/messages_en.properties +++ b/forms/common-themes/src/main/resources/theme/login/base/messages/messages_en.properties @@ -12,7 +12,7 @@ registerWithTitleHtml=Register with {0} loginTitle=Log in to {0} loginTitleHtml=Log in to {0} loginOauthTitle=Temporary access for {0} -loginOauthTitleHtml=Temporary access for {0} requested by {1}. +loginOauthTitleHtml=Temporary access for {0} requested by {1}. loginTotpTitle=Mobile Authenticator Setup loginProfileTitle=Update Account Information oauthGrantTitle=OAuth Grant @@ -22,6 +22,8 @@ errorTitleHtml=We''re sorry ... emailVerifyTitle=Email verification emailForgotTitle=Forgot Your Password? updatePasswordTitle=Update password +codeSuccessTitle=Success code +codeErrorTitle=Error code\: {0} noAccount=New user? username=Username @@ -48,6 +50,7 @@ loginTotpStep3=Enter the one-time code provided by the application and click Sub loginTotpOneTime=One-time code oauthGrantRequest=Do you grant these access privileges? +inResource=in {0} emailVerifyInstruction1=An email with instructions to verify your email address has been sent to you. emailVerifyInstruction2=Haven''t received a verification code in your email? @@ -57,6 +60,10 @@ backToLogin=« Back to Login emailInstruction=Enter your username or email address and we will send you instructions on how to create a new password. +copyCodeInstruction=Please copy this code and paste it into your application: + +personalInfo=Personal Info: + invalidUserMessage=Invalid username or password. invalidEmailMessage=Invalid email address. accountDisabledMessage=Account is disabled, contact admin. @@ -87,19 +94,19 @@ updatePasswordMessage=You need to change your password to activate your account. verifyEmailMessage=You need to verify your email address to activate your account. emailSentMessage=You should receive an email shortly with further instructions. -emailSendErrorMessage=Failed to send email, please try again later +emailSendErrorMessage=Failed to send email, please try again later. -accountUpdatedMessage=Your account has been updated -accountPasswordUpdatedMessage=Your password has been updated +accountUpdatedMessage=Your account has been updated. +accountPasswordUpdatedMessage=Your password has been updated. noAccessMessage=No access -invalidPasswordMinLengthMessage=Invalid password: minimum length {0} -invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits -invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters -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 +invalidPasswordMinLengthMessage=Invalid password: minimum length {0}. +invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits. +invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters. +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. failedToProcessResponseMessage=Failed to process response httpsRequiredMessage=HTTPS required diff --git a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java index 44c8bad83f..9aca77f006 100755 --- a/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java +++ b/forms/login-freemarker/src/main/java/org/keycloak/login/freemarker/FreeMarkerLoginFormsProvider.java @@ -6,6 +6,7 @@ import org.keycloak.OAuth2Constants; import org.keycloak.email.EmailException; import org.keycloak.email.EmailProvider; import org.keycloak.freemarker.*; +import org.keycloak.freemarker.beans.AdvancedMessageFormatterMethod; import org.keycloak.freemarker.beans.MessageFormatterMethod; import org.keycloak.login.LoginFormsPages; import org.keycloak.login.LoginFormsProvider; @@ -239,6 +240,7 @@ import java.util.concurrent.TimeUnit; break; case OAUTH_GRANT: attributes.put("oauth", new OAuthGrantBean(accessCode, clientSession, client, realmRolesRequested, resourceRolesRequested, this.accessRequestMessage)); + attributes.put("advancedMsg", new AdvancedMessageFormatterMethod(locale, messages)); break; case CODE: attributes.put(OAuth2Constants.CODE, new CodeBean(accessCode, messageType == MessageType.ERROR ? message : null)); diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java index fb782990b6..00b071e25c 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/account/AccountTest.java @@ -207,11 +207,11 @@ public class AccountTest { changePasswordPage.changePassword("password", "new-password", "new-password2"); - Assert.assertEquals("Password confirmation doesn't match", profilePage.getError()); + Assert.assertEquals("Password confirmation doesn't match.", profilePage.getError()); changePasswordPage.changePassword("password", "new-password", "new-password"); - Assert.assertEquals("Your password has been updated", profilePage.getSuccess()); + Assert.assertEquals("Your password has been updated.", profilePage.getSuccess()); events.expectAccount(EventType.UPDATE_PASSWORD).assertEvent(); @@ -256,7 +256,7 @@ public class AccountTest { changePasswordPage.changePassword("password", "new-password", "new-password"); - Assert.assertEquals("Your password has been updated", profilePage.getSuccess()); + Assert.assertEquals("Your password has been updated.", profilePage.getSuccess()); events.expectAccount(EventType.UPDATE_PASSWORD).assertEvent(); } finally { @@ -318,7 +318,7 @@ public class AccountTest { profilePage.updateProfile("New first", "New last", "new@email.com"); - Assert.assertEquals("Your account has been updated", profilePage.getSuccess()); + Assert.assertEquals("Your account has been updated.", profilePage.getSuccess()); Assert.assertEquals("New first", profilePage.getFirstName()); Assert.assertEquals("New last", profilePage.getLastName()); Assert.assertEquals("new@email.com", profilePage.getEmail()); @@ -341,7 +341,7 @@ public class AccountTest { // Error with false code totpPage.configure(totp.generate(totpPage.getTotpSecret() + "123")); - Assert.assertEquals("Invalid authenticator code", profilePage.getError()); + Assert.assertEquals("Invalid authenticator code.", profilePage.getError()); totpPage.configure(totp.generate(totpPage.getTotpSecret())); diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/AbstractKerberosTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/AbstractKerberosTest.java index 9d59ad9899..af994f4a0e 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/AbstractKerberosTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/AbstractKerberosTest.java @@ -146,7 +146,7 @@ public abstract class AbstractKerberosTest { // Successfully change password now changePasswordPage.changePassword("theduke", "newPass", "newPass"); - Assert.assertTrue(driver.getPageSource().contains("Your password has been updated")); + Assert.assertTrue(driver.getPageSource().contains("Your password has been updated.")); changePasswordPage.logout(); // Login with old password doesn't work, but with new password works diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java index 5f484dc8b2..cfaae07ec8 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/FederationProvidersIntegrationTest.java @@ -209,7 +209,7 @@ public class FederationProvidersIntegrationTest { loginPage.login("johnkeycloak", "Password1"); changePasswordPage.changePassword("Password1", "New-password1", "New-password1"); - Assert.assertEquals("Your password has been updated", profilePage.getSuccess()); + Assert.assertEquals("Your password has been updated.", profilePage.getSuccess()); changePasswordPage.logout(); @@ -224,7 +224,7 @@ public class FederationProvidersIntegrationTest { // Change password back to previous value changePasswordPage.open(); changePasswordPage.changePassword("New-password1", "Password1", "Password1"); - Assert.assertEquals("Your password has been updated", profilePage.getSuccess()); + Assert.assertEquals("Your password has been updated.", profilePage.getSuccess()); } @Test diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/KerberosLdapTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/KerberosLdapTest.java index 07ca87cf9d..1d94c68e2e 100644 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/KerberosLdapTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/federation/KerberosLdapTest.java @@ -109,7 +109,7 @@ public class KerberosLdapTest extends AbstractKerberosTest { // Successfully change password now changePasswordPage.changePassword("theduke", "newPass", "newPass"); - Assert.assertTrue(driver.getPageSource().contains("Your password has been updated")); + Assert.assertTrue(driver.getPageSource().contains("Your password has been updated.")); changePasswordPage.logout(); // Login with old password doesn't work, but with new password works @@ -136,7 +136,7 @@ public class KerberosLdapTest extends AbstractKerberosTest { loginPage.login("jduke", "newPass"); changePasswordPage.assertCurrent(); changePasswordPage.changePassword("newPass", "theduke", "theduke"); - Assert.assertTrue(driver.getPageSource().contains("Your password has been updated")); + Assert.assertTrue(driver.getPageSource().contains("Your password has been updated.")); changePasswordPage.logout(); spnegoResponse.close(); diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/RegisterTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/RegisterTest.java index b2ac90e04e..13c628a2ba 100644 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/RegisterTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/RegisterTest.java @@ -128,7 +128,7 @@ public class RegisterTest { registerPage.register("firstName", "lastName", "registerPasswordPolicy@email", "registerPasswordPolicy", "pass", "pass"); registerPage.assertCurrent(); - Assert.assertEquals("Invalid password: minimum length 8", registerPage.getError()); + Assert.assertEquals("Invalid password: minimum length 8.", registerPage.getError()); events.expectRegister("registerPasswordPolicy", "registerPasswordPolicy@email").user((String) null).error("invalid_registration").assertEvent(); diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/ResetPasswordTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/ResetPasswordTest.java index a96b660a54..1b53664835 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/ResetPasswordTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/forms/ResetPasswordTest.java @@ -394,7 +394,7 @@ public class ResetPasswordTest { errorPage.assertCurrent(); - assertEquals("Failed to send email, please try again later", errorPage.getError()); + assertEquals("Failed to send email, please try again later.", errorPage.getError()); Thread.sleep(1000); @@ -446,7 +446,7 @@ public class ResetPasswordTest { updatePasswordPage.changePassword("invalid", "invalid"); - assertEquals("Invalid password: minimum length 8", resetPasswordPage.getErrorMessage()); + assertEquals("Invalid password: minimum length 8.", resetPasswordPage.getErrorMessage()); updatePasswordPage.changePassword("resetPasswordWithPasswordPolicy", "resetPasswordWithPasswordPolicy"); @@ -504,7 +504,7 @@ public class ResetPasswordTest { events.expectRequiredAction(EventType.UPDATE_PASSWORD).user(userId).session(sessionId).detail(Details.USERNAME, username).assertEvent(); assertTrue(infoPage.isCurrent()); - assertEquals("Your password has been updated", infoPage.getInfo()); + assertEquals("Your password has been updated.", infoPage.getInfo()); loginPage.open(); diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/AuthorizationCodeTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/AuthorizationCodeTest.java index 0c56d7a37a..90a0e29783 100755 --- a/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/AuthorizationCodeTest.java +++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/oauth/AuthorizationCodeTest.java @@ -28,10 +28,8 @@ import org.junit.Test; import org.keycloak.OAuth2Constants; import org.keycloak.events.Details; import org.keycloak.events.Errors; -import org.keycloak.events.EventType; import org.keycloak.models.Constants; import org.keycloak.models.RealmModel; -import org.keycloak.protocol.oidc.OIDCLoginProtocolService; import org.keycloak.services.managers.ClientSessionCode; import org.keycloak.services.managers.RealmManager; import org.keycloak.testsuite.AssertEvents; @@ -106,7 +104,7 @@ public class AuthorizationCodeTest { oauth.doLogin("test-user@localhost", "password"); String title = driver.getTitle(); - Assert.assertTrue(title.startsWith("Success code=")); + Assert.assertEquals("Success code", title); String code = driver.findElement(By.id(OAuth2Constants.CODE)).getAttribute("value"); keycloakRule.verifyCode(code); @@ -136,7 +134,7 @@ public class AuthorizationCodeTest { driver.findElement(By.name("cancel")).click(); String title = driver.getTitle(); - Assert.assertTrue(title.equals("Error error=access_denied")); + Assert.assertEquals("Error code: access_denied",title); String error = driver.findElement(By.id(OAuth2Constants.ERROR)).getText(); assertEquals("access_denied", error);