Merge pull request #1097 from gerbermichi/i18n
[KEYCLOAK-301] Internationalization support (4rd pr)
This commit is contained in:
commit
f8b25cad7f
17 changed files with 433 additions and 20 deletions
|
@ -112,10 +112,12 @@ public class ImportUtils {
|
||||||
|
|
||||||
RoleModel createRealmRole = realm.addRole(AdminRoles.CREATE_REALM);
|
RoleModel createRealmRole = realm.addRole(AdminRoles.CREATE_REALM);
|
||||||
adminRole.addCompositeRole(createRealmRole);
|
adminRole.addCompositeRole(createRealmRole);
|
||||||
|
createRealmRole.setDescription("${role_"+AdminRoles.CREATE_REALM+"}");
|
||||||
} else {
|
} else {
|
||||||
adminRealm = model.getRealmByName(Config.getAdminRealm());
|
adminRealm = model.getRealmByName(Config.getAdminRealm());
|
||||||
adminRole = adminRealm.getRole(AdminRoles.ADMIN);
|
adminRole = adminRealm.getRole(AdminRoles.ADMIN);
|
||||||
}
|
}
|
||||||
|
adminRole.setDescription("${role_"+AdminRoles.ADMIN+"}");
|
||||||
|
|
||||||
ApplicationModel realmAdminApp = KeycloakModelUtils.createApplication(adminRealm, KeycloakModelUtils.getMasterRealmAdminApplicationName(realm));
|
ApplicationModel realmAdminApp = KeycloakModelUtils.createApplication(adminRealm, KeycloakModelUtils.getMasterRealmAdminApplicationName(realm));
|
||||||
realmAdminApp.setBearerOnly(true);
|
realmAdminApp.setBearerOnly(true);
|
||||||
|
@ -123,6 +125,7 @@ public class ImportUtils {
|
||||||
|
|
||||||
for (String r : AdminRoles.ALL_REALM_ROLES) {
|
for (String r : AdminRoles.ALL_REALM_ROLES) {
|
||||||
RoleModel role = realmAdminApp.addRole(r);
|
RoleModel role = realmAdminApp.addRole(r);
|
||||||
|
role.setDescription("${role_"+r+"}");
|
||||||
adminRole.addCompositeRole(role);
|
adminRole.addCompositeRole(role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,8 @@
|
||||||
<ul class="nav navbar-nav navbar-utility">
|
<ul class="nav navbar-nav navbar-utility">
|
||||||
<#if realm.internationalizationEnabled>
|
<#if realm.internationalizationEnabled>
|
||||||
<li>
|
<li>
|
||||||
<div class="kc-dropdown">
|
<div class="kc-dropdown" id="kc-locale-dropdown">
|
||||||
<a href="#">${locale.current}</a>
|
<a href="#" id="kc-current-locale-link">${locale.current}</a>
|
||||||
<ul>
|
<ul>
|
||||||
<#list locale.supported as l>
|
<#list locale.supported as l>
|
||||||
<li class="kc-dropdown-item"><a href="${l.url}">${l.label}</a></li>
|
<li class="kc-dropdown-item"><a href="${l.url}">${l.label}</a></li>
|
||||||
|
|
|
@ -29,8 +29,10 @@ noAccount=Neuer Benutzer?
|
||||||
username=Benutzername
|
username=Benutzername
|
||||||
usernameOrEmail=Benutzername oder E-Mail
|
usernameOrEmail=Benutzername oder E-Mail
|
||||||
firstName=Vorname
|
firstName=Vorname
|
||||||
fullName=Name
|
givenName=Vorname
|
||||||
|
fullName=voller Name
|
||||||
lastName=Nachname
|
lastName=Nachname
|
||||||
|
familyName=Nachname
|
||||||
email=E-Mail
|
email=E-Mail
|
||||||
password=Passwort
|
password=Passwort
|
||||||
passwordConfirm=Passwort best\u00E4tigen
|
passwordConfirm=Passwort best\u00E4tigen
|
||||||
|
@ -38,11 +40,14 @@ passwordNew=Neues Passwort
|
||||||
passwordNewConfirm=Neues Passwort best\u00E4tigen
|
passwordNewConfirm=Neues Passwort best\u00E4tigen
|
||||||
rememberMe=Angemeldet bleiben
|
rememberMe=Angemeldet bleiben
|
||||||
authenticatorCode=One-time Code
|
authenticatorCode=One-time Code
|
||||||
|
address=Adresse
|
||||||
street=Strasse
|
street=Strasse
|
||||||
region=Staat, Provinz, Region
|
region=Staat, Provinz, Region
|
||||||
postal_code=PLZ
|
postal_code=PLZ
|
||||||
locality=Stadt oder Ortschaft
|
locality=Stadt oder Ortschaft
|
||||||
country=Land
|
country=Land
|
||||||
|
emailVerified=E-Mail verifiziert
|
||||||
|
gssDelegationCredential=GSS delegierte Berechtigung
|
||||||
|
|
||||||
loginTotpStep1=Installieren Sie <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> oder <a href="http://code.google.com/p/google-authenticator/" target="_blank">Google Authenticator</a> auf Ihrem Smartphone.
|
loginTotpStep1=Installieren Sie <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> oder <a href="http://code.google.com/p/google-authenticator/" target="_blank">Google Authenticator</a> auf Ihrem Smartphone.
|
||||||
loginTotpStep2=\u00D6ffnen Sie die Applikation und scannen Sie den Barcode oder geben sie den Code ein.
|
loginTotpStep2=\u00D6ffnen Sie die Applikation und scannen Sie den Barcode oder geben sie den Code ein.
|
||||||
|
@ -65,6 +70,24 @@ copyCodeInstruction=Bitte kopieren sie den folgenden Code und f\u00FCgen ihn in
|
||||||
|
|
||||||
personalInfo=Pers\u00F6nliche Informationen:
|
personalInfo=Pers\u00F6nliche Informationen:
|
||||||
|
|
||||||
|
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=Applicationen ansehen
|
||||||
|
role_view-clients=Clients ansehen
|
||||||
|
role_view-events=Events ansehen
|
||||||
|
role_view-identity-providers=Identity Providers 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
|
||||||
|
|
||||||
invalidUserMessage=Ung\u00FCltiger Benutzername oder Passwort.
|
invalidUserMessage=Ung\u00FCltiger Benutzername oder Passwort.
|
||||||
invalidEmailMessage=Ung\u00FCltige E-Mail Adresse.
|
invalidEmailMessage=Ung\u00FCltige E-Mail Adresse.
|
||||||
accountDisabledMessage=Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin.
|
accountDisabledMessage=Benutzerkonto ist gesperrt, bitte kontaktieren Sie den Admin.
|
||||||
|
|
|
@ -29,8 +29,10 @@ noAccount=New user?
|
||||||
username=Username
|
username=Username
|
||||||
usernameOrEmail=Username or email
|
usernameOrEmail=Username or email
|
||||||
firstName=First name
|
firstName=First name
|
||||||
|
givenName=Given name
|
||||||
fullName=Full name
|
fullName=Full name
|
||||||
lastName=Last name
|
lastName=Last name
|
||||||
|
familyName=Family name
|
||||||
email=Email
|
email=Email
|
||||||
password=Password
|
password=Password
|
||||||
passwordConfirm=Confirm password
|
passwordConfirm=Confirm password
|
||||||
|
@ -38,11 +40,14 @@ passwordNew=New Password
|
||||||
passwordNewConfirm=New Password confirmation
|
passwordNewConfirm=New Password confirmation
|
||||||
rememberMe=Remember me
|
rememberMe=Remember me
|
||||||
authenticatorCode=One-time code
|
authenticatorCode=One-time code
|
||||||
|
address=Address
|
||||||
street=Street
|
street=Street
|
||||||
locality=City or Locality
|
locality=City or Locality
|
||||||
region=State, Province, or Region
|
region=State, Province, or Region
|
||||||
postal_code=Zip or Postal code
|
postal_code=Zip or Postal code
|
||||||
country=Country
|
country=Country
|
||||||
|
emailVerified=Email verified
|
||||||
|
gssDelegationCredential=gss delegation credential
|
||||||
|
|
||||||
loginTotpStep1=Install <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> or <a href="http://code.google.com/p/google-authenticator/" target="_blank">Google Authenticator</a> on your mobile
|
loginTotpStep1=Install <a href="https://fedorahosted.org/freeotp/" target="_blank">FreeOTP</a> or <a href="http://code.google.com/p/google-authenticator/" target="_blank">Google Authenticator</a> on your mobile
|
||||||
loginTotpStep2=Open the application and scan the barcode or enter the key
|
loginTotpStep2=Open the application and scan the barcode or enter the key
|
||||||
|
@ -64,6 +69,24 @@ copyCodeInstruction=Please copy this code and paste it into your application:
|
||||||
|
|
||||||
personalInfo=Personal Info:
|
personalInfo=Personal Info:
|
||||||
|
|
||||||
|
role_admin=Admin
|
||||||
|
role_realm-admin=Realm Admin
|
||||||
|
role_create-realm=Crate 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_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
|
||||||
|
|
||||||
invalidUserMessage=Invalid username or password.
|
invalidUserMessage=Invalid username or password.
|
||||||
invalidEmailMessage=Invalid email address.
|
invalidEmailMessage=Invalid email address.
|
||||||
accountDisabledMessage=Account is disabled, contact admin.
|
accountDisabledMessage=Account is disabled, contact admin.
|
||||||
|
|
|
@ -48,8 +48,8 @@
|
||||||
<#if realm.internationalizationEnabled>
|
<#if realm.internationalizationEnabled>
|
||||||
<div id="kc-locale" class="${properties.kcLocaleClass!}">
|
<div id="kc-locale" class="${properties.kcLocaleClass!}">
|
||||||
<div id="kc-locale-wrapper" class="${properties.kcLocaleWrapperClass!}">
|
<div id="kc-locale-wrapper" class="${properties.kcLocaleWrapperClass!}">
|
||||||
<div class="kc-dropdown">
|
<div class="kc-dropdown" id="kc-locale-dropdown">
|
||||||
<a href="#">${locale.current}</a>
|
<a href="#" id="kc-current-locale-link">${locale.current}</a>
|
||||||
<ul>
|
<ul>
|
||||||
<#list locale.supported as l>
|
<#list locale.supported as l>
|
||||||
<li class="kc-dropdown-item"><a href="${l.url}">${l.label}</a></li>
|
<li class="kc-dropdown-item"><a href="${l.url}">${l.label}</a></li>
|
||||||
|
|
|
@ -66,21 +66,21 @@ public class SamlProtocolFactory extends AbstractLoginProtocolFactory {
|
||||||
X500SAMLProfileConstants.EMAIL.get(),
|
X500SAMLProfileConstants.EMAIL.get(),
|
||||||
JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(),
|
JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(),
|
||||||
X500SAMLProfileConstants.EMAIL.getFriendlyName(),
|
X500SAMLProfileConstants.EMAIL.getFriendlyName(),
|
||||||
true, "email");
|
true, "${email}");
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
model = UserPropertyAttributeStatementMapper.createAttributeMapper("X500 givenName",
|
model = UserPropertyAttributeStatementMapper.createAttributeMapper("X500 givenName",
|
||||||
"firstName",
|
"firstName",
|
||||||
X500SAMLProfileConstants.GIVEN_NAME.get(),
|
X500SAMLProfileConstants.GIVEN_NAME.get(),
|
||||||
JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(),
|
JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(),
|
||||||
X500SAMLProfileConstants.GIVEN_NAME.getFriendlyName(),
|
X500SAMLProfileConstants.GIVEN_NAME.getFriendlyName(),
|
||||||
true, "given name");
|
true, "${givenName}");
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
model = UserPropertyAttributeStatementMapper.createAttributeMapper("X500 surname",
|
model = UserPropertyAttributeStatementMapper.createAttributeMapper("X500 surname",
|
||||||
"lastName",
|
"lastName",
|
||||||
X500SAMLProfileConstants.SURNAME.get(),
|
X500SAMLProfileConstants.SURNAME.get(),
|
||||||
JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(),
|
JBossSAMLURIConstants.ATTRIBUTE_FORMAT_URI.get(),
|
||||||
X500SAMLProfileConstants.SURNAME.getFriendlyName(),
|
X500SAMLProfileConstants.SURNAME.getFriendlyName(),
|
||||||
true, "family name");
|
true, "${familyName}");
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
model = RoleListMapper.create("role list", "Role", AttributeStatementHelper.BASIC, null, false);
|
model = RoleListMapper.create("role list", "Role", AttributeStatementHelper.BASIC, null, false);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
|
|
|
@ -32,6 +32,13 @@ public class OIDCLoginProtocolFactory extends AbstractLoginProtocolFactory {
|
||||||
public static final String GIVEN_NAME = "given name";
|
public static final String GIVEN_NAME = "given name";
|
||||||
public static final String FAMILY_NAME = "family name";
|
public static final String FAMILY_NAME = "family name";
|
||||||
public static final String FULL_NAME = "full name";
|
public static final String FULL_NAME = "full name";
|
||||||
|
public static final String USERNAME_CONSENT_TEXT = "${username}";
|
||||||
|
public static final String EMAIL_CONSENT_TEXT = "${email}";
|
||||||
|
public static final String EMAIL_VERIFIED_CONSENT_TEXT = "${emailVerified}";
|
||||||
|
public static final String GIVEN_NAME_CONSENT_TEXT = "${givenName}";
|
||||||
|
public static final String FAMILY_NAME_CONSENT_TEXT = "${familyName}";
|
||||||
|
public static final String FULL_NAME_CONSENT_TEXT = "${fullName}";
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LoginProtocol create(KeycloakSession session) {
|
public LoginProtocol create(KeycloakSession session) {
|
||||||
|
@ -57,35 +64,35 @@ public class OIDCLoginProtocolFactory extends AbstractLoginProtocolFactory {
|
||||||
model = UserPropertyMapper.createClaimMapper(USERNAME,
|
model = UserPropertyMapper.createClaimMapper(USERNAME,
|
||||||
"username",
|
"username",
|
||||||
"preferred_username", "String",
|
"preferred_username", "String",
|
||||||
true, USERNAME,
|
true, USERNAME_CONSENT_TEXT,
|
||||||
true, true);
|
true, true);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
defaultBuiltins.add(model);
|
defaultBuiltins.add(model);
|
||||||
model = UserPropertyMapper.createClaimMapper(EMAIL,
|
model = UserPropertyMapper.createClaimMapper(EMAIL,
|
||||||
"email",
|
"email",
|
||||||
"email", "String",
|
"email", "String",
|
||||||
true, EMAIL,
|
true, EMAIL_CONSENT_TEXT,
|
||||||
true, true);
|
true, true);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
defaultBuiltins.add(model);
|
defaultBuiltins.add(model);
|
||||||
model = UserPropertyMapper.createClaimMapper(GIVEN_NAME,
|
model = UserPropertyMapper.createClaimMapper(GIVEN_NAME,
|
||||||
"firstName",
|
"firstName",
|
||||||
"given_name", "String",
|
"given_name", "String",
|
||||||
true, GIVEN_NAME,
|
true, GIVEN_NAME_CONSENT_TEXT,
|
||||||
true, true);
|
true, true);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
defaultBuiltins.add(model);
|
defaultBuiltins.add(model);
|
||||||
model = UserPropertyMapper.createClaimMapper(FAMILY_NAME,
|
model = UserPropertyMapper.createClaimMapper(FAMILY_NAME,
|
||||||
"lastName",
|
"lastName",
|
||||||
"family_name", "String",
|
"family_name", "String",
|
||||||
true, FAMILY_NAME,
|
true, FAMILY_NAME_CONSENT_TEXT,
|
||||||
true, true);
|
true, true);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
defaultBuiltins.add(model);
|
defaultBuiltins.add(model);
|
||||||
model = UserPropertyMapper.createClaimMapper(EMAIL_VERIFIED,
|
model = UserPropertyMapper.createClaimMapper(EMAIL_VERIFIED,
|
||||||
"emailVerified",
|
"emailVerified",
|
||||||
"email_verified", "boolean",
|
"email_verified", "boolean",
|
||||||
false, null,
|
false, EMAIL_VERIFIED_CONSENT_TEXT,
|
||||||
true, true);
|
true, true);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
|
|
||||||
|
@ -94,7 +101,7 @@ public class OIDCLoginProtocolFactory extends AbstractLoginProtocolFactory {
|
||||||
fullName.setProtocolMapper(FullNameMapper.PROVIDER_ID);
|
fullName.setProtocolMapper(FullNameMapper.PROVIDER_ID);
|
||||||
fullName.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
|
fullName.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
|
||||||
fullName.setConsentRequired(true);
|
fullName.setConsentRequired(true);
|
||||||
fullName.setConsentText(FULL_NAME);
|
fullName.setConsentText(FULL_NAME_CONSENT_TEXT);
|
||||||
Map<String, String> config = new HashMap<String, String>();
|
Map<String, String> config = new HashMap<String, String>();
|
||||||
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, "true");
|
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, "true");
|
||||||
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, "true");
|
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, "true");
|
||||||
|
@ -108,7 +115,7 @@ public class OIDCLoginProtocolFactory extends AbstractLoginProtocolFactory {
|
||||||
model = UserSessionNoteMapper.createClaimMapper(KerberosConstants.GSS_DELEGATION_CREDENTIAL_DISPLAY_NAME,
|
model = UserSessionNoteMapper.createClaimMapper(KerberosConstants.GSS_DELEGATION_CREDENTIAL_DISPLAY_NAME,
|
||||||
KerberosConstants.GSS_DELEGATION_CREDENTIAL,
|
KerberosConstants.GSS_DELEGATION_CREDENTIAL,
|
||||||
KerberosConstants.GSS_DELEGATION_CREDENTIAL, "String",
|
KerberosConstants.GSS_DELEGATION_CREDENTIAL, "String",
|
||||||
true, KerberosConstants.GSS_DELEGATION_CREDENTIAL_DISPLAY_NAME,
|
true, "${gssDelegationCredential}",
|
||||||
true, false);
|
true, false);
|
||||||
builtins.add(model);
|
builtins.add(model);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ public class AddressMapper extends AbstractOIDCProtocolMapper implements OIDCAcc
|
||||||
address.setProtocolMapper(PROVIDER_ID);
|
address.setProtocolMapper(PROVIDER_ID);
|
||||||
address.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
|
address.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
|
||||||
address.setConsentRequired(true);
|
address.setConsentRequired(true);
|
||||||
address.setConsentText("address");
|
address.setConsentText("${address}");
|
||||||
config = new HashMap<String, String>();
|
config = new HashMap<String, String>();
|
||||||
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, "true");
|
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, "true");
|
||||||
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, "true");
|
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, "true");
|
||||||
|
@ -66,7 +66,7 @@ public class AddressMapper extends AbstractOIDCProtocolMapper implements OIDCAcc
|
||||||
address.setProtocolMapper(PROVIDER_ID);
|
address.setProtocolMapper(PROVIDER_ID);
|
||||||
address.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
|
address.setProtocol(OIDCLoginProtocol.LOGIN_PROTOCOL);
|
||||||
address.setConsentRequired(true);
|
address.setConsentRequired(true);
|
||||||
address.setConsentText("address");
|
address.setConsentText("${address}");
|
||||||
config = new HashMap<String, String>();
|
config = new HashMap<String, String>();
|
||||||
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, Boolean.toString(idToken));
|
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ACCESS_TOKEN, Boolean.toString(idToken));
|
||||||
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, Boolean.toString(accessToken));
|
config.put(OIDCAttributeMapperHelper.INCLUDE_IN_ID_TOKEN, Boolean.toString(accessToken));
|
||||||
|
|
|
@ -179,11 +179,13 @@ public class RealmManager {
|
||||||
realmAdminApp = applicationManager.createApplication(realm, realmAdminApplicationName);
|
realmAdminApp = applicationManager.createApplication(realm, realmAdminApplicationName);
|
||||||
}
|
}
|
||||||
RoleModel adminRole = realmAdminApp.addRole(AdminRoles.REALM_ADMIN);
|
RoleModel adminRole = realmAdminApp.addRole(AdminRoles.REALM_ADMIN);
|
||||||
|
adminRole.setDescription("${role_"+AdminRoles.REALM_ADMIN+"}");
|
||||||
realmAdminApp.setBearerOnly(true);
|
realmAdminApp.setBearerOnly(true);
|
||||||
realmAdminApp.setFullScopeAllowed(false);
|
realmAdminApp.setFullScopeAllowed(false);
|
||||||
|
|
||||||
for (String r : AdminRoles.ALL_REALM_ROLES) {
|
for (String r : AdminRoles.ALL_REALM_ROLES) {
|
||||||
RoleModel role = realmAdminApp.addRole(r);
|
RoleModel role = realmAdminApp.addRole(r);
|
||||||
|
role.setDescription("${role_"+r+"}");
|
||||||
adminRole.addCompositeRole(role);
|
adminRole.addCompositeRole(role);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -202,6 +204,7 @@ public class RealmManager {
|
||||||
|
|
||||||
for (String role : AccountRoles.ALL) {
|
for (String role : AccountRoles.ALL) {
|
||||||
application.addDefaultRole(role);
|
application.addDefaultRole(role);
|
||||||
|
application.getRole(role).setDescription("${role_"+role+"}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ import org.junit.Assert;
|
||||||
import org.keycloak.OAuth2Constants;
|
import org.keycloak.OAuth2Constants;
|
||||||
import org.keycloak.RSATokenVerifier;
|
import org.keycloak.RSATokenVerifier;
|
||||||
import org.keycloak.VerificationException;
|
import org.keycloak.VerificationException;
|
||||||
|
import org.keycloak.freemarker.LocaleHelper;
|
||||||
import org.keycloak.jose.jws.JWSInput;
|
import org.keycloak.jose.jws.JWSInput;
|
||||||
import org.keycloak.jose.jws.crypto.RSAProvider;
|
import org.keycloak.jose.jws.crypto.RSAProvider;
|
||||||
import org.keycloak.protocol.oidc.OIDCLoginProtocolService;
|
import org.keycloak.protocol.oidc.OIDCLoginProtocolService;
|
||||||
|
@ -73,6 +74,8 @@ public class OAuthClient {
|
||||||
|
|
||||||
private String state = "mystate";
|
private String state = "mystate";
|
||||||
|
|
||||||
|
private String uiLocales = null;
|
||||||
|
|
||||||
private PublicKey realmPublicKey;
|
private PublicKey realmPublicKey;
|
||||||
|
|
||||||
public OAuthClient(WebDriver driver) {
|
public OAuthClient(WebDriver driver) {
|
||||||
|
@ -296,6 +299,9 @@ public class OAuthClient {
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
b.queryParam(OAuth2Constants.STATE, state);
|
b.queryParam(OAuth2Constants.STATE, state);
|
||||||
}
|
}
|
||||||
|
if(uiLocales != null){
|
||||||
|
b.queryParam(LocaleHelper.UI_LOCALES_PARAM, uiLocales);
|
||||||
|
}
|
||||||
return b.build(realm).toString();
|
return b.build(realm).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,6 +355,11 @@ public class OAuthClient {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public OAuthClient uiLocales(String uiLocales){
|
||||||
|
this.uiLocales = uiLocales;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public String getRealm() {
|
public String getRealm() {
|
||||||
return realm;
|
return realm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,6 @@ public class ProfileTest {
|
||||||
assertEquals("Last", profile.getString("lastName"));
|
assertEquals("Last", profile.getString("lastName"));
|
||||||
|
|
||||||
JSONObject attributes = profile.getJSONObject("attributes");
|
JSONObject attributes = profile.getJSONObject("attributes");
|
||||||
assertEquals(2, attributes.length());
|
|
||||||
assertEquals("value1", attributes.getString("key1"));
|
assertEquals("value1", attributes.getString("key1"));
|
||||||
assertEquals("value2", attributes.getString("key2"));
|
assertEquals("value2", attributes.getString("key2"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source.
|
||||||
|
* Copyright 2012, Red Hat, Inc., and individual contributors
|
||||||
|
* as indicated by the @author tags. See the copyright.txt file in the
|
||||||
|
* distribution for a full listing of individual contributors.
|
||||||
|
*
|
||||||
|
* This is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this software; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
||||||
|
*/
|
||||||
|
package org.keycloak.testsuite.i18n;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.ClassRule;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.models.RealmModel;
|
||||||
|
import org.keycloak.models.UserCredentialModel;
|
||||||
|
import org.keycloak.models.UserModel;
|
||||||
|
import org.keycloak.representations.idm.CredentialRepresentation;
|
||||||
|
import org.keycloak.services.managers.RealmManager;
|
||||||
|
import org.keycloak.testsuite.pages.AccountUpdateProfilePage;
|
||||||
|
import org.keycloak.testsuite.pages.LoginPage;
|
||||||
|
import org.keycloak.testsuite.rule.KeycloakRule;
|
||||||
|
import org.keycloak.testsuite.rule.WebResource;
|
||||||
|
import org.keycloak.testsuite.rule.WebRule;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:gerbermichi@me.com">Michael Gerber</a>
|
||||||
|
*/
|
||||||
|
public class AccountPageTest {
|
||||||
|
|
||||||
|
@ClassRule
|
||||||
|
public static KeycloakRule keycloakRule = new KeycloakRule(new KeycloakRule.KeycloakSetup() {
|
||||||
|
@Override
|
||||||
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
|
UserModel user = manager.getSession().users().addUser(appRealm, "login-test");
|
||||||
|
user.setEmail("login@test.com");
|
||||||
|
user.setEnabled(true);
|
||||||
|
|
||||||
|
UserCredentialModel creds = new UserCredentialModel();
|
||||||
|
creds.setType(CredentialRepresentation.PASSWORD);
|
||||||
|
creds.setValue("password");
|
||||||
|
|
||||||
|
user.updateCredential(creds);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public WebRule webRule = new WebRule(this);
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected AccountUpdateProfilePage accountUpdateProfilePage;
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected LoginPage loginPage;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void languageDropdown() {
|
||||||
|
accountUpdateProfilePage.open();
|
||||||
|
loginPage.login("login@test.com", "password");
|
||||||
|
Assert.assertTrue(accountUpdateProfilePage.isCurrent());
|
||||||
|
|
||||||
|
Assert.assertEquals("English", accountUpdateProfilePage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
accountUpdateProfilePage.openLanguage("German");
|
||||||
|
Assert.assertEquals("Deutsch", accountUpdateProfilePage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
accountUpdateProfilePage.openLanguage("Englisch");
|
||||||
|
Assert.assertEquals("English", accountUpdateProfilePage.getLanguageDropdownText());
|
||||||
|
accountUpdateProfilePage.logout();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source.
|
||||||
|
* Copyright 2012, Red Hat, Inc., and individual contributors
|
||||||
|
* as indicated by the @author tags. See the copyright.txt file in the
|
||||||
|
* distribution for a full listing of individual contributors.
|
||||||
|
*
|
||||||
|
* This is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this software; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
||||||
|
*/
|
||||||
|
package org.keycloak.testsuite.i18n;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.ClassRule;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.models.RealmModel;
|
||||||
|
import org.keycloak.models.UserCredentialModel;
|
||||||
|
import org.keycloak.models.UserModel;
|
||||||
|
import org.keycloak.representations.idm.CredentialRepresentation;
|
||||||
|
import org.keycloak.services.managers.RealmManager;
|
||||||
|
import org.keycloak.testsuite.pages.LoginPage;
|
||||||
|
import org.keycloak.testsuite.pages.LoginPasswordResetPage;
|
||||||
|
import org.keycloak.testsuite.rule.GreenMailRule;
|
||||||
|
import org.keycloak.testsuite.rule.KeycloakRule;
|
||||||
|
import org.keycloak.testsuite.rule.WebResource;
|
||||||
|
import org.keycloak.testsuite.rule.WebRule;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:gerbermichi@me.com">Michael Gerber</a>
|
||||||
|
*/
|
||||||
|
public class EmailTest {
|
||||||
|
@ClassRule
|
||||||
|
public static KeycloakRule keycloakRule = new KeycloakRule(new KeycloakRule.KeycloakSetup() {
|
||||||
|
@Override
|
||||||
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
|
UserModel user = manager.getSession().users().addUser(appRealm, "login-test");
|
||||||
|
user.setEmail("login@test.com");
|
||||||
|
user.setEnabled(true);
|
||||||
|
user.setAttribute(UserModel.LOCALE, "de");
|
||||||
|
|
||||||
|
UserCredentialModel creds = new UserCredentialModel();
|
||||||
|
creds.setType(CredentialRepresentation.PASSWORD);
|
||||||
|
creds.setValue("password");
|
||||||
|
|
||||||
|
user.updateCredential(creds);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public WebRule webRule = new WebRule(this);
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public GreenMailRule greenMail = new GreenMailRule();
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected LoginPage loginPage;
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected LoginPasswordResetPage resetPasswordPage;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void restPasswordEmail() throws IOException, MessagingException {
|
||||||
|
loginPage.open();
|
||||||
|
loginPage.resetPassword();
|
||||||
|
resetPasswordPage.changePassword("login-test");
|
||||||
|
|
||||||
|
assertEquals(1, greenMail.getReceivedMessages().length);
|
||||||
|
|
||||||
|
MimeMessage message = greenMail.getReceivedMessages()[0];
|
||||||
|
|
||||||
|
Assert.assertEquals("Passwort zurückzusetzen", message.getSubject());
|
||||||
|
|
||||||
|
keycloakRule.update(new KeycloakRule.KeycloakSetup() {
|
||||||
|
@Override
|
||||||
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
|
manager.getSession().users().getUserByUsername("login-test", appRealm).setAttribute(UserModel.LOCALE, "en");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
resetPasswordPage.changePassword("login-test");
|
||||||
|
|
||||||
|
assertEquals(2, greenMail.getReceivedMessages().length);
|
||||||
|
|
||||||
|
message = greenMail.getReceivedMessages()[1];
|
||||||
|
|
||||||
|
Assert.assertEquals("Reset password", message.getSubject());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,122 @@
|
||||||
|
/*
|
||||||
|
* JBoss, Home of Professional Open Source.
|
||||||
|
* Copyright 2012, Red Hat, Inc., and individual contributors
|
||||||
|
* as indicated by the @author tags. See the copyright.txt file in the
|
||||||
|
* distribution for a full listing of individual contributors.
|
||||||
|
*
|
||||||
|
* This is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as
|
||||||
|
* published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This software is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this software; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
||||||
|
*/
|
||||||
|
package org.keycloak.testsuite.i18n;
|
||||||
|
|
||||||
|
import org.apache.http.impl.client.DefaultHttpClient;
|
||||||
|
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
|
||||||
|
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
|
||||||
|
import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.ClassRule;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.keycloak.adapters.HttpClientBuilder;
|
||||||
|
import org.keycloak.freemarker.LocaleHelper;
|
||||||
|
import org.keycloak.models.RealmModel;
|
||||||
|
import org.keycloak.services.managers.RealmManager;
|
||||||
|
import org.keycloak.testsuite.OAuthClient;
|
||||||
|
import org.keycloak.testsuite.pages.LoginPage;
|
||||||
|
import org.keycloak.testsuite.rule.KeycloakRule;
|
||||||
|
import org.keycloak.testsuite.rule.WebResource;
|
||||||
|
import org.keycloak.testsuite.rule.WebRule;
|
||||||
|
import org.openqa.selenium.WebDriver;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:gerbermichi@me.com">Michael Gerber</a>
|
||||||
|
*/
|
||||||
|
public class LoginPageTest {
|
||||||
|
|
||||||
|
@ClassRule
|
||||||
|
public static KeycloakRule keycloakRule = new KeycloakRule(new KeycloakRule.KeycloakSetup() {
|
||||||
|
@Override
|
||||||
|
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public WebRule webRule = new WebRule(this);
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected OAuthClient oauth;
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected WebDriver driver;
|
||||||
|
|
||||||
|
@WebResource
|
||||||
|
protected LoginPage loginPage;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void languageDropdown() {
|
||||||
|
loginPage.open();
|
||||||
|
Assert.assertEquals("English", loginPage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
loginPage.openLanguage("German");
|
||||||
|
Assert.assertEquals("Deutsch", loginPage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
loginPage.openLanguage("Englisch");
|
||||||
|
Assert.assertEquals("English", loginPage.getLanguageDropdownText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void uiLocalesParameter() {
|
||||||
|
loginPage.open();
|
||||||
|
Assert.assertEquals("English", loginPage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
//test if cookie works
|
||||||
|
oauth.uiLocales("de");
|
||||||
|
loginPage.open();
|
||||||
|
Assert.assertEquals("English", loginPage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
driver.manage().deleteAllCookies();
|
||||||
|
loginPage.open();
|
||||||
|
Assert.assertEquals("Deutsch", loginPage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
oauth.uiLocales("en de");
|
||||||
|
driver.manage().deleteAllCookies();
|
||||||
|
loginPage.open();
|
||||||
|
Assert.assertEquals("English", loginPage.getLanguageDropdownText());
|
||||||
|
|
||||||
|
oauth.uiLocales("fr de");
|
||||||
|
driver.manage().deleteAllCookies();
|
||||||
|
loginPage.open();
|
||||||
|
Assert.assertEquals("Deutsch", loginPage.getLanguageDropdownText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void acceptLanguageHeader() {
|
||||||
|
DefaultHttpClient httpClient = (DefaultHttpClient) new HttpClientBuilder().build();
|
||||||
|
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
|
||||||
|
ResteasyClient client = new ResteasyClientBuilder().httpEngine(engine).build();
|
||||||
|
|
||||||
|
loginPage.open();
|
||||||
|
Response response = client.target(driver.getCurrentUrl()).request().acceptLanguage("de").get();
|
||||||
|
Assert.assertTrue(response.readEntity(String.class).contains("Anmeldung bei test"));
|
||||||
|
Assert.assertEquals("de", response.getCookies().get(LocaleHelper.LOCALE_COOKIE).getValue());
|
||||||
|
|
||||||
|
response = client.target(driver.getCurrentUrl()).request().acceptLanguage("en").get();
|
||||||
|
Assert.assertTrue(response.readEntity(String.class).contains("Log in to test"));
|
||||||
|
Assert.assertEquals("en", response.getCookies().get(LocaleHelper.LOCALE_COOKIE).getValue());
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@
|
||||||
*/
|
*/
|
||||||
package org.keycloak.testsuite.pages;
|
package org.keycloak.testsuite.pages;
|
||||||
|
|
||||||
|
import org.openqa.selenium.By;
|
||||||
import org.openqa.selenium.WebElement;
|
import org.openqa.selenium.WebElement;
|
||||||
import org.openqa.selenium.support.FindBy;
|
import org.openqa.selenium.support.FindBy;
|
||||||
|
|
||||||
|
@ -32,8 +33,21 @@ public abstract class AbstractAccountPage extends AbstractPage {
|
||||||
@FindBy(linkText = "Sign Out")
|
@FindBy(linkText = "Sign Out")
|
||||||
private WebElement logoutLink;
|
private WebElement logoutLink;
|
||||||
|
|
||||||
|
@FindBy(id = "kc-current-locale-link")
|
||||||
|
private WebElement languageText;
|
||||||
|
|
||||||
|
@FindBy(id = "kc-locale-dropdown")
|
||||||
|
private WebElement localeDropdown;
|
||||||
|
|
||||||
public void logout() {
|
public void logout() {
|
||||||
logoutLink.click();
|
logoutLink.click();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getLanguageDropdownText() {
|
||||||
|
return languageText.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void openLanguage(String language){
|
||||||
|
localeDropdown.findElement(By.linkText(language)).click();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,12 @@ public class LoginPage extends AbstractPage {
|
||||||
@FindBy(className = "feedback-warning")
|
@FindBy(className = "feedback-warning")
|
||||||
private WebElement loginWarningMessage;
|
private WebElement loginWarningMessage;
|
||||||
|
|
||||||
|
@FindBy(id = "kc-current-locale-link")
|
||||||
|
private WebElement languageText;
|
||||||
|
|
||||||
|
@FindBy(id = "kc-locale-dropdown")
|
||||||
|
private WebElement localeDropdown;
|
||||||
|
|
||||||
public void login(String username, String password) {
|
public void login(String username, String password) {
|
||||||
usernameInput.clear();
|
usernameInput.clear();
|
||||||
usernameInput.sendKeys(username);
|
usernameInput.sendKeys(username);
|
||||||
|
@ -103,7 +109,7 @@ public class LoginPage extends AbstractPage {
|
||||||
|
|
||||||
|
|
||||||
public boolean isCurrent() {
|
public boolean isCurrent() {
|
||||||
return driver.getTitle().equals("Log in to test");
|
return driver.getTitle().equals("Log in to test") || driver.getTitle().equals("Anmeldung bei test");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void clickRegister() {
|
public void clickRegister() {
|
||||||
|
@ -145,4 +151,12 @@ public class LoginPage extends AbstractPage {
|
||||||
assertCurrent();
|
assertCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getLanguageDropdownText() {
|
||||||
|
return languageText.getText();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void openLanguage(String language){
|
||||||
|
localeDropdown.findElement(By.linkText(language)).click();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,5 +112,9 @@
|
||||||
"roles": ["customer-user"]
|
"roles": ["customer-user"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
|
||||||
|
"internationalizationEnabled": true,
|
||||||
|
"supportedLocales": ["en", "de"],
|
||||||
|
"defaultLocale": "en"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue