This is an automated email from the ASF dual-hosted git repository.

massi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new a35dd0f789 [SYNCOPE-1942] added getString to retrieve the label from 
localization properties file (#1278)
a35dd0f789 is described below

commit a35dd0f789c6ca297ecb1ecdb68494786272acd1
Author: Massimiliano Perrone <[email protected]>
AuthorDate: Mon Jan 19 11:33:09 2026 +0100

    [SYNCOPE-1942] added getString to retrieve the label from localization 
properties file (#1278)
---
 .../client/console/topology/Topology.properties    |  2 +
 .../console/topology/Topology_fr_CA.properties     |  2 +
 .../client/console/topology/Topology_it.properties |  2 +
 .../client/console/topology/Topology_ja.properties |  2 +
 .../console/topology/Topology_pt_BR.properties     |  2 +
 .../client/console/topology/Topology_ru.properties |  3 +-
 .../commons/DynamicMenuStringResourceLoader.java   | 82 ++++++++++++++++++++++
 .../client/console/IdRepoConsoleContext.java       |  7 ++
 .../client/console/SyncopeConsoleApplication.java  |  8 ++-
 .../client/console/SyncopeWebApplication.java      | 26 ++++++-
 .../syncope/client/console/pages/BasePage.java     |  7 +-
 .../console/SyncopeWebApplication.properties       |  1 -
 .../console/SyncopeWebApplication_fr_CA.properties |  2 +
 .../console/SyncopeWebApplication_it.properties    |  1 -
 .../console/SyncopeWebApplication_ja.properties    |  5 +-
 .../console/SyncopeWebApplication_pt_BR.properties |  1 -
 .../console/SyncopeWebApplication_ru.properties    |  4 +-
 .../syncope/client/console/AbstractTest.java       | 11 ++-
 .../client/enduser/IdRepoEnduserContext.java       |  7 ++
 .../client/enduser/SyncopeEnduserApplication.java  |  7 +-
 .../client/enduser/SyncopeWebApplication.java      | 26 ++++++-
 .../syncope/client/enduser/panels/Sidebar.java     |  9 +--
 .../syncope/client/enduser/AbstractTest.java       | 11 ++-
 .../client/console/pages/Flowable.properties       |  2 +
 ...ble_ru.properties => Flowable_fr_CA.properties} |  2 +
 .../client/console/pages/Flowable_it.properties    |  2 +
 .../client/console/pages/Flowable_ja.properties    |  2 +
 .../client/console/pages/Flowable_pt_BR.properties |  2 +
 .../client/console/pages/Flowable_ru.properties    |  2 +
 .../syncope/client/enduser/pages/Flowable.java     |  2 +-
 .../client/enduser/pages/Flowable.properties       |  2 +
 ...ble_it.properties => Flowable_fr_CA.properties} |  2 +
 .../client/enduser/pages/Flowable_it.properties    |  2 +
 .../client/enduser/pages/Flowable_ja.properties    |  2 +
 .../client/enduser/pages/Flowable_pt_BR.properties |  3 +
 .../client/enduser/pages/Flowable_ru.properties    |  2 +
 .../syncope/client/console/pages/OIDCC4UI.java     |  2 +-
 .../client/console/pages/OIDCC4UI.properties       |  2 +
 ...DCC4UI_it.properties => OIDCC4UI_fr.properties} |  2 +
 .../client/console/pages/OIDCC4UI_it.properties    |  2 +
 ...{OIDCC4UI.properties => OIDCC4UI_ja.properties} |  2 +
 ...DCC4UI_it.properties => OIDCC4UI_pt.properties} |  2 +
 .../client/console/pages/OIDCC4UI_ru.properties    |  2 +
 .../syncope/client/console/pages/SAML2SP4UI.java   |  2 +-
 .../client/console/pages/SAML2SP4UI.properties     |  2 +
 ...P4UI.properties => SAML2SP4UI_fr_CA.properties} |  2 +
 .../client/console/pages/SAML2SP4UI_it.properties  |  2 +
 ...L2SP4UI.properties => SAML2SP4UI_ja.properties} |  2 +
 .../console/pages/SAML2SP4UI_pt_BR.properties      |  2 +
 .../client/console/pages/SAML2SP4UI_ru.properties  |  2 +
 .../syncope/client/console/pages/SCIMConfPage.java |  2 +-
 .../client/console/pages/SCIMConfPage.properties   |  2 +
 ...fPage.properties => SCIMConfPage_fr.properties} |  2 +
 .../console/pages/SCIMConfPage_it.properties       |  2 +
 ...fPage.properties => SCIMConfPage_ja.properties} |  2 +
 .../console/pages/SCIMConfPage_pt_BR.properties    |  2 +
 .../console/pages/SCIMConfPage_ru.properties       |  3 +
 57 files changed, 267 insertions(+), 31 deletions(-)

diff --git 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.properties
 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.properties
index 14e381db28..7b2a714ee5 100644
--- 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.properties
+++ 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 missingEntitlement=MISSING ENTITLEMENT: CONNECTOR_READ
+
+menu.Topology=Topology
diff --git 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_fr_CA.properties
 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_fr_CA.properties
index dc297fc5ad..796fbdb546 100644
--- 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_fr_CA.properties
+++ 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_fr_CA.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 missingEntitlement=DROIT MANQUANT : CONNECTOR_READ
+
+menu.Topology=Topologie
diff --git 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_it.properties
 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_it.properties
index 5a3d4c8d0c..06e80ac5f0 100644
--- 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_it.properties
+++ 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_it.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 missingEntitlement=ENTITLEMENT MANCANTE: CONNECTOR_READ
+
+menu.Topology=Topologia
diff --git 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ja.properties
 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ja.properties
index 932f656acd..5406bef554 100644
--- 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ja.properties
+++ 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ja.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 
missingEntitlement=\u6a29\u5229\u4ed8\u4e0e\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093:
 CONNECTOR_READ
+
+menu.Topology=\u30c8\u30dd\u30ed\u30b8\u30fc
diff --git 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_pt_BR.properties
 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_pt_BR.properties
index 14e381db28..fc21cf12f1 100644
--- 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_pt_BR.properties
+++ 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_pt_BR.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 missingEntitlement=MISSING ENTITLEMENT: CONNECTOR_READ
+
+menu.Topology=Topologia
diff --git 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ru.properties
 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ru.properties
index 7f3248a23b..ed2f267c40 100644
--- 
a/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ru.properties
+++ 
b/client/idm/console/src/main/resources/org/apache/syncope/client/console/topology/Topology_ru.properties
@@ -14,5 +14,6 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-# missingEntitlement=Нет прав доступа на просмотр коннектора (CONNECTOR_READ)
 missingEntitlement=\u041d\u0435\u0442 \u043f\u0440\u0430\u0432 
\u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0430 
\u0447\u0442\u0435\u043d\u0438\u0435 
\u043a\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 
\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 (CONNECTOR_READ)
+
+menu.Topology=\u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f
diff --git 
a/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DynamicMenuStringResourceLoader.java
 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DynamicMenuStringResourceLoader.java
new file mode 100644
index 0000000000..61a8415724
--- /dev/null
+++ 
b/client/idrepo/common-ui/src/main/java/org/apache/syncope/client/ui/commons/DynamicMenuStringResourceLoader.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.ui.commons;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import org.apache.wicket.core.util.resource.locator.IResourceNameIterator;
+import org.apache.wicket.resource.IPropertiesFactory;
+import org.apache.wicket.resource.loader.ClassStringResourceLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DynamicMenuStringResourceLoader extends ClassStringResourceLoader 
{
+
+    protected static final Logger LOG = 
LoggerFactory.getLogger(DynamicMenuStringResourceLoader.class);
+
+    private final Map<String, Class<?>> keysForPages;
+
+    public DynamicMenuStringResourceLoader() {
+        super(DynamicMenuStringResourceLoader.class);
+        keysForPages = new HashMap<>();
+    }
+
+    @Override
+    public String loadStringResource(
+            final Class<?> clazz,
+            final String key,
+            final Locale locale,
+            final String style,
+            final String variation) {
+        if (key == null || !key.startsWith("menu.")) {
+            return null;
+        }
+
+        final Class<?> pageClass = getPage(key);
+        if (pageClass == null) {
+            return null;
+        }
+
+        final String path = pageClass.getName().replace('.', '/');
+        final IResourceNameIterator resourceNameIterator = 
newResourceNameIterator(path, locale, style, variation);
+        final IPropertiesFactory propertiesFactory = getPropertiesFactory();
+
+        while (resourceNameIterator.hasNext()) {
+            final var props = propertiesFactory.load(pageClass, 
resourceNameIterator.next());
+            if (props == null) {
+                continue;
+            }
+
+            final String localeLabel = props.getString(key);
+            LOG.debug("Found label \"{}\" for key: {}", localeLabel, key);
+            return localeLabel;
+        }
+
+        return null;
+    }
+
+    private Class<?> getPage(final String key) {
+        return keysForPages.get(key);
+    }
+
+    public void register(final String key, final Class<?> pageClass) {
+        keysForPages.put(key, pageClass);
+    }
+}
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
index 0f85093b9e..b1a3c8fb91 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/IdRepoConsoleContext.java
@@ -69,6 +69,7 @@ import 
org.apache.syncope.client.console.rest.SyncopeRestClient;
 import org.apache.syncope.client.console.rest.TaskRestClient;
 import org.apache.syncope.client.console.rest.UserRestClient;
 import org.apache.syncope.client.console.rest.UserSelfRestClient;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.client.ui.commons.MIMETypesLoader;
 import org.apache.syncope.client.ui.commons.PreviewUtils;
 import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -334,4 +335,10 @@ public class IdRepoConsoleContext {
     public UserSelfRestClient userSelfRestClient() {
         return new UserSelfRestClient();
     }
+    
+    @ConditionalOnMissingBean
+    @Bean
+    public DynamicMenuStringResourceLoader dynamicMenuStringResourceLoader() {
+        return new DynamicMenuStringResourceLoader();
+    }
 }
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
index 74bb1be384..a92b9227f4 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
@@ -33,6 +33,7 @@ import 
org.apache.syncope.client.console.commons.PolicyTabProvider;
 import org.apache.syncope.client.console.commons.StatusProvider;
 import 
org.apache.syncope.client.console.init.ClassPathScanImplementationLookup;
 import org.apache.syncope.client.console.wizards.any.UserFormFinalizer;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.client.ui.commons.actuate.SyncopeCoreHealthIndicator;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
@@ -87,7 +88,9 @@ public class SyncopeConsoleApplication extends 
SpringBootServletInitializer {
             @Qualifier(SyncopeWebApplication.LOGGEDOUT_SESSIONID_CACHE)
             final Cache<String, OffsetDateTime> loggedoutSessionIdCache,
             @Qualifier(SyncopeWebApplication.DESTROYED_SESSIONID_CACHE)
-            final Cache<String, OffsetDateTime> destroyedSessionIdCache) {
+            final Cache<String, OffsetDateTime> destroyedSessionIdCache,
+            final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader
+    ) {
 
         return new SyncopeWebApplication(
                 props,
@@ -103,7 +106,8 @@ public class SyncopeConsoleApplication extends 
SpringBootServletInitializer {
                 userFormFinalizers,
                 resources,
                 loggedoutSessionIdCache,
-                destroyedSessionIdCache);
+                destroyedSessionIdCache,
+                dynamicMenuStringResourceLoader);
     }
 
     @ConditionalOnMissingBean
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
index 9d32acacfa..8dae943ce0 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeWebApplication.java
@@ -40,6 +40,7 @@ import 
org.apache.syncope.client.console.commons.PolicyTabProvider;
 import org.apache.syncope.client.console.commons.RealmsUtils;
 import org.apache.syncope.client.console.commons.StatusProvider;
 import 
org.apache.syncope.client.console.init.ClassPathScanImplementationLookup;
+import org.apache.syncope.client.console.pages.BaseExtPage;
 import org.apache.syncope.client.console.pages.BasePage;
 import org.apache.syncope.client.console.pages.Dashboard;
 import org.apache.syncope.client.console.pages.Login;
@@ -52,7 +53,9 @@ import org.apache.syncope.client.ui.commons.BaseLogin;
 import org.apache.syncope.client.ui.commons.BaseSession;
 import org.apache.syncope.client.ui.commons.BaseWebApplication;
 import org.apache.syncope.client.ui.commons.Constants;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.client.ui.commons.SyncopeUIRequestCycleListener;
+import org.apache.syncope.client.ui.commons.annotations.ExtPage;
 import org.apache.syncope.client.ui.commons.annotations.Resource;
 import org.apache.syncope.client.ui.commons.themes.AdminLTE;
 import org.apache.syncope.client.ui.commons.wizards.AjaxWizard;
@@ -125,6 +128,8 @@ public class SyncopeWebApplication extends 
WicketBootSecuredWebApplication imple
 
     protected final Cache<String, OffsetDateTime> destroyedSessionIdCache;
 
+    protected final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader;
+
     public SyncopeWebApplication(
             final ConsoleProperties props,
             final ClassPathScanImplementationLookup lookup,
@@ -140,7 +145,8 @@ public class SyncopeWebApplication extends 
WicketBootSecuredWebApplication imple
             final List<UserFormFinalizer> userFormFinalizers,
             final List<IResource> resources,
             final Cache<String, OffsetDateTime> loggedoutSessionIdCache,
-            final Cache<String, OffsetDateTime> destroyedSessionIdCache) {
+            final Cache<String, OffsetDateTime> destroyedSessionIdCache,
+            final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader) {
 
         this.props = props;
         this.lookup = lookup;
@@ -157,6 +163,7 @@ public class SyncopeWebApplication extends 
WicketBootSecuredWebApplication imple
         this.resources = resources;
         this.loggedoutSessionIdCache = loggedoutSessionIdCache;
         this.destroyedSessionIdCache = destroyedSessionIdCache;
+        this.dynamicMenuStringResourceLoader = dynamicMenuStringResourceLoader;
     }
 
     protected SyncopeUIRequestCycleListener 
buildSyncopeUIRequestCycleListener() {
@@ -240,6 +247,23 @@ public class SyncopeWebApplication extends 
WicketBootSecuredWebApplication imple
 
         mountPage("/login", getSignInPageClass());
 
+        final List<Class<? extends BasePage>> amPageClasses = 
lookup.getAMPageClasses();
+        amPageClasses.forEach(claz -> {
+            dynamicMenuStringResourceLoader.register("menu." + 
claz.getSimpleName(), claz);
+        });
+
+        final List<Class<? extends BasePage>> idmPageClasses = 
lookup.getIdMPageClasses();
+        idmPageClasses.forEach(claz -> {
+            dynamicMenuStringResourceLoader.register("menu." + 
claz.getSimpleName(), claz);
+        });
+
+        final List<Class<? extends BaseExtPage>> extPageClasses = 
lookup.getClasses(BaseExtPage.class);
+        extPageClasses.stream().filter(claz -> 
(claz.isAnnotationPresent(ExtPage.class))).forEach(claz -> {
+            dynamicMenuStringResourceLoader.register("menu." + 
claz.getSimpleName(), claz);
+        });
+
+        
getResourceSettings().getStringResourceLoaders().add(dynamicMenuStringResourceLoader);
+
         for (IResource resource : resources) {
             Class<?> resourceClass = AopUtils.getTargetClass(resource);
             Resource annotation = resourceClass.getAnnotation(Resource.class);
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
index a77b56ad17..a2ceee3406 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/BasePage.java
@@ -187,7 +187,7 @@ public class BasePage extends BaseWebPage {
                 IdMPage ann = 
item.getModelObject().getAnnotation(IdMPage.class);
 
                 BookmarkablePageLink<Page> link = new 
BookmarkablePageLink<>("idmPage", item.getModelObject());
-                link.add(new Label("idmPageLabel", ann.label()));
+                link.add(new Label("idmPageLabel", getString("menu." + 
ann.label(), null, ann.label())));
                 if (StringUtils.isNotBlank(ann.listEntitlement())) {
                     MetaDataRoleAuthorizationStrategy.authorize(link, 
WebPage.RENDER, ann.listEntitlement());
                 }
@@ -226,7 +226,8 @@ public class BasePage extends BaseWebPage {
                 AMPage ann = item.getModelObject().getAnnotation(AMPage.class);
 
                 BookmarkablePageLink<Page> link = new 
BookmarkablePageLink<>("amPage", item.getModelObject());
-                link.add(new Label("amPageLabel", ann.label()));
+                link.add(new Label("amPageLabel", getString("menu." + 
ann.label(), null, ann.label())));
+
                 if (StringUtils.isNotBlank(ann.listEntitlement())) {
                     MetaDataRoleAuthorizationStrategy.authorize(link, 
WebPage.RENDER, ann.listEntitlement());
                 }
@@ -521,7 +522,7 @@ public class BasePage extends BaseWebPage {
                 ExtPage ann = 
item.getModelObject().getAnnotation(ExtPage.class);
 
                 BookmarkablePageLink<Page> link = new 
BookmarkablePageLink<>("extPage", item.getModelObject());
-                link.add(new Label("extPageLabel", ann.label()));
+                link.add(new Label("extPageLabel", getString("menu." + 
ann.label(), null, ann.label())));
                 if (StringUtils.isNotBlank(ann.listEntitlement())) {
                     MetaDataRoleAuthorizationStrategy.authorize(link, 
WebPage.RENDER, ann.listEntitlement());
                 }
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
index d42b8e7ab2..26a10800ed 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication.properties
@@ -78,7 +78,6 @@ domains=Domains
 nomatch=No matches found
 tooLargeFile=File is too large, max upload file size is ${maxUploadSizeB} 
bytes (${maxUploadSizeMB} MB). 
 confirmDelegation=Do you really want to switch user?
-topology=Topology
 engagements=Engagements
 confirmProvisionMembers=Do you really want to provision all group members?
 confirmDeprovisionMembers=Do you really want to deprovision all group members?
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_fr_CA.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_fr_CA.properties
index 7c7556c35d..1a46ab4fa2 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_fr_CA.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_fr_CA.properties
@@ -30,6 +30,7 @@ confirmDelete=Voulez-vous vraiment supprimer le(s) article(s) 
s\u00e9lectionn\u0
 confirmUnlink=Voulez-vous vraiment supprimer le lien entre le(s) article(s) 
s\u00e9lectionn\u00e9(s) et la ressource?
 confirmUnassign=Souhaitez-vous vraiment supprimer l'affectation entre le(s) 
article(s) s\u00e9lectionn\u00e9(s) et la ressource?
 confirmClone=Voulez-vous vraiment cloner le(s) article(s) 
s\u00e9lectionn\u00e9(s)?
+
 dropDownChoiceField.nullValid=Faire un choix
 DateTimeField$HoursValidator=La valeur horaire doit \u00eatre dans la gamme 
(1, 12)
 error=Erreur
@@ -66,6 +67,7 @@ audit=Audit
 connectors.confirm.reload=Cette demande est potentiellement dangereuse pour le 
d\u00e9roulement des op\u00e9rations, continuer?
 intAttrNameInfo.help=En plus des attributs auto-compl\u00e9t\u00e9s, vous 
pouvez \u00e9galement faire r\u00e9f\u00e9rence \u00e0 des groupes, des objets 
ou des appartenances, par exemple:
 confirmGlobalLogout=Voulez-vous vraiment effectuer une d\u00e9connexion 
compl\u00e8te?
+
 implementations=Impl\u00e9mentations
 timeout=L'op\u00e9ration prend trop de temps: elle sera ex\u00e9cut\u00e9e en 
arri\u00e8re-plan. Veuillez v\u00e9rifier plus tard le r\u00e9sultat (les 
erreurs ne seront pas d\u00e9tect\u00e9es).
 security=S\u00e9curit\u00e9
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
index 4eb410e933..18ad328a65 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_it.properties
@@ -78,7 +78,6 @@ domains=Domini
 nomatch=Nessun risultato trovato
 tooLargeFile=File troppo grande, la dimensione massima ammessa \u00e8 
${maxUploadSizeB} bytes (${maxUploadSizeMB} MB). 
 confirmDelegation=Vuoi davvero cambiare utenza?
-topology=Topologia
 engagements=Impegni
 confirmProvisionMembers=Vuoi davvero procedere con il provisioning di tutti i 
membri del gruppo?
 confirmDeprovisionMembers=Vuoi davvero procedere con il deprovisioning di 
tutti i membri del gruppo?
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
index 0b7a5ab741..db22123820 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ja.properties
@@ -30,6 +30,7 @@ 
confirmDelete=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u3092\u524a\u9664
 
confirmUnlink=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u3068\u30ea\u30bd\u30fc\u30b9\u306e\u9593\u306e\u30ea\u30f3\u30af\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
 
confirmUnassign=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u3068\u30ea\u30bd\u30fc\u30b9\u306e\u9593\u306e\u5272\u308a\u5f53\u3066\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
 
confirmClone=\u9078\u629e\u3057\u305f\u30a2\u30a4\u30c6\u30e0\u3092\u8907\u88fd\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
+
 dropDownChoiceField.nullValid=\uff11\u3064\u9078\u629e
 DateTimeField$HoursValidator=\u6642\u9593\u306e\u5024\u306f 1\uff5e12 
\u306e\u7bc4\u56f2
 error=\u30a8\u30e9\u30fc
@@ -66,6 +67,7 @@ 
connectors.confirm.reload=\u3053\u306e\u8981\u6c42\u306f\u3001\u5b9f\u884c\u4e2d
 
intAttrNameInfo.help=\u30aa\u30fc\u30c8\u30b3\u30f3\u30d7\u30ea\u30fc\u30c8\u306e\u5c5e\u6027\u4ee5\u5916\u306b\u3001\u30b0\u30eb\u30fc\u30d7\u3001\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3001\u30e1\u30f3\u30d0\u30fc\u30b7\u30c3\u30d7\u3082\u53c2\u7167\u53ef\u80fd\u3067\u3059
 (\u8a72\u5f53\u3059\u308b\u5834\u5408)\u3002\u4f8b\:
 
confirmGlobalLogout=\u30b0\u30ed\u30fc\u30d0\u30eb\u30ed\u30b0\u30a2\u30a6\u30c8\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
 implementations=\u5c0e\u5165
+
 
timeout=\u64cd\u4f5c\u306b\u9577\u6642\u9593\u304b\u304b\u3063\u3066\u3044\u307e\u3059\:
 
\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u3067\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002
 \u7d50\u679c\u3092\u5f8c\u3067\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044 
(\u30a8\u30e9\u30fc\u306f\u5f15\u304d\u8d77\u3053\u3057\u307e\u305b\u3093)\u3002
 security=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3
 before=\u524d
@@ -76,7 +78,6 @@ domains=\u30c9\u30e1\u30a4\u30f3
 nomatch=No matches found
 tooLargeFile=File is too large, max upload file size is ${maxUploadSizeB} 
bytes (${maxUploadSizeMB} MB). 
 confirmDelegation=Do you really want to switch user?
-topology=Topology
-engagements=Engagements
+engagements=\u5a5a\u7d04
 confirmProvisionMembers=Do you really want to provision all group members?
 confirmDeprovisionMembers=Do you really want to deprovision all group members?
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
index 3cac8cb746..217839b66f 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_pt_BR.properties
@@ -78,7 +78,6 @@ domains=Dom\u00ednios
 nomatch=Nenhuma correspond\u00eancia encontrada
 tooLargeFile=File is too large, max upload file size is ${maxUploadSizeB} 
bytes (${maxUploadSizeMB} MB). 
 confirmDelegation=Voc\u00ea realmente deseja mudar de usu\u00e1rio?
-topology=Topology
 engagements=Engagements
 confirmProvisionMembers=Voc\u00ea realmente deseja provisionar todos os 
membros do grupo?
 confirmDeprovisionMembers=Voc\u00ea realmente deseja desprovisionar todos os 
membros do grupo?
diff --git 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
index f0af199476..2affea016e 100644
--- 
a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
+++ 
b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/SyncopeWebApplication_ru.properties
@@ -30,6 +30,7 @@ confirmDelete=\u0412\u044b 
\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u043
 confirmUnlink=\u0412\u044b 
\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e 
\u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c 
\u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 
\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c\u0438 
\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 
\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c?
 confirmUnassign=\u0412\u044b 
\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e 
\u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c 
\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 
\u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0434\u043b\u044f 
\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 
\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432?
 confirmClone=\u0412\u044b 
\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e 
\u0445\u043e\u0442\u0438\u0442\u0435 
\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c 
\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 
\u043e\u0431\u044a\u0435\u043a\u0442\u044b?
+
 dropDownChoiceField.nullValid=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 
\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435
 DateTimeField$HoursValidator=\u0427\u0430\u0441\u044b 
\u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c 
\u0443\u043a\u0430\u0437\u0430\u043d\u044b \u0432 
\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 (1, 12)
 error=\u041e\u0448\u0438\u0431\u043a\u0430
@@ -77,7 +78,6 @@ domains=Domains
 nomatch=No matches found
 tooLargeFile=File is too large, max upload file size is ${maxUploadSizeB} 
bytes (${maxUploadSizeMB} MB). 
 confirmDelegation=Do you really want to switch user?
-topology=Topology
-engagements=Engagements
+engagements=\u043f\u043e\u043c\u043e\u043b\u0432\u043a\u0438
 confirmProvisionMembers=Do you really want to provision all group members?
 confirmDeprovisionMembers=Do you really want to deprovision all group members?
diff --git 
a/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
 
b/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
index 217c3268a9..17f968ad08 100644
--- 
a/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
+++ 
b/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
@@ -52,6 +52,7 @@ import org.apache.syncope.client.lib.AuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeAnonymousClient;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.JPADomain;
@@ -145,6 +146,11 @@ public abstract class AbstractTest {
             when(cacheManager.createCache(anyString(), any())).thenAnswer(ic 
-> mock(Cache.class));
             return cacheManager;
         }
+        
+        @Bean
+        public DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader() {
+            return new DynamicMenuStringResourceLoader();
+        }
     }
 
     public static class TestSyncopeWebApplication extends 
SyncopeWebApplication {
@@ -164,12 +170,13 @@ public abstract class AbstractTest {
                 final List<UserFormFinalizer> userFormFinalizers,
                 final List<IResource> resources,
                 final Cache<String, OffsetDateTime> loggedoutSessionIdCache,
-                final Cache<String, OffsetDateTime> destroyedSessionIdCache) {
+                final Cache<String, OffsetDateTime> destroyedSessionIdCache,
+                final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader) {
 
             super(props, lookup, serviceOps, resourceProvider, 
anyDirectoryPanelAdditionalActionsProvider,
                     anyDirectoryPanelAdditionalActionLinksProvider, 
anyWizardBuilderAdditionalSteps, statusProvider,
                     implementationInfoProvider, accessPolicyConfProvider, 
policyTabProviders, userFormFinalizers,
-                    resources, loggedoutSessionIdCache, 
destroyedSessionIdCache);
+                    resources, loggedoutSessionIdCache, 
destroyedSessionIdCache, dynamicMenuStringResourceLoader);
         }
 
         public interface SyncopeServiceClient extends SyncopeService, Client {
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/IdRepoEnduserContext.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/IdRepoEnduserContext.java
index 4cbe7b47be..6db50844ab 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/IdRepoEnduserContext.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/IdRepoEnduserContext.java
@@ -25,6 +25,7 @@ import 
org.apache.syncope.client.enduser.rest.SchemaRestClient;
 import org.apache.syncope.client.enduser.rest.SecurityQuestionRestClient;
 import org.apache.syncope.client.enduser.rest.SyncopeRestClient;
 import org.apache.syncope.client.enduser.rest.UserSelfRestClient;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.client.ui.commons.MIMETypesLoader;
 import org.apache.syncope.client.ui.commons.PreviewUtils;
 import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -91,4 +92,10 @@ public class IdRepoEnduserContext {
     public UserSelfRestClient userSelfRestClient() {
         return new UserSelfRestClient();
     }
+    
+    @ConditionalOnMissingBean
+    @Bean
+    public DynamicMenuStringResourceLoader dynamicMenuStringResourceLoader() {
+        return new DynamicMenuStringResourceLoader();
+    }
 }
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
index 96c0f065f7..21ef0d75c1 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
@@ -22,6 +22,7 @@ import 
com.giffing.wicket.spring.boot.starter.web.config.WicketWebInitializerAut
 import java.util.List;
 import java.util.Map;
 import 
org.apache.syncope.client.enduser.init.ClassPathScanImplementationLookup;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.client.ui.commons.actuate.SyncopeCoreHealthIndicator;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
@@ -62,9 +63,11 @@ public class SyncopeEnduserApplication extends 
SpringBootServletInitializer {
             final EnduserProperties props,
             final ClassPathScanImplementationLookup lookup,
             final ServiceOps serviceOps,
-            final List<IResource> resources) {
+            final List<IResource> resources,
+            final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader) {
 
-        return new SyncopeWebApplication(resourceLoader, props, lookup, 
serviceOps, resources);
+        return new SyncopeWebApplication(
+                resourceLoader, props, lookup, serviceOps, resources, 
dynamicMenuStringResourceLoader);
     }
 
     @ConditionalOnMissingBean
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
index e21b847534..97dcf13ccb 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeWebApplication.java
@@ -41,7 +41,9 @@ import org.apache.syncope.client.lib.SyncopeAnonymousClient;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
 import org.apache.syncope.client.ui.commons.BaseLogin;
 import org.apache.syncope.client.ui.commons.BaseWebApplication;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.client.ui.commons.SyncopeUIRequestCycleListener;
+import org.apache.syncope.client.ui.commons.annotations.ExtPage;
 import org.apache.syncope.client.ui.commons.annotations.Resource;
 import org.apache.syncope.client.ui.commons.themes.AdminLTE;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
@@ -91,18 +93,23 @@ public class SyncopeWebApplication extends 
WicketBootSecuredWebApplication imple
 
     protected UserFormLayoutInfo customFormLayout;
 
+    protected final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader;
+
     public SyncopeWebApplication(
             final ResourceLoader resourceLoader,
             final EnduserProperties props,
             final ClassPathScanImplementationLookup lookup,
             final ServiceOps serviceOps,
-            final List<IResource> resources) {
+            final List<IResource> resources,
+            final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader
+    ) {
 
         this.resourceLoader = resourceLoader;
         this.props = props;
         this.lookup = lookup;
         this.serviceOps = serviceOps;
         this.resources = resources;
+        this.dynamicMenuStringResourceLoader = dynamicMenuStringResourceLoader;
     }
 
     protected SyncopeUIRequestCycleListener 
buildSyncopeUIRequestCycleListener() {
@@ -203,6 +210,23 @@ public class SyncopeWebApplication extends 
WicketBootSecuredWebApplication imple
             }
         }
 
+        final List<Class<? extends BasePage>> amPageClasses = 
lookup.getAMPageClasses();
+        amPageClasses.forEach(claz -> {
+            dynamicMenuStringResourceLoader.register("menu." + 
claz.getSimpleName(), claz);
+        });
+
+        final List<Class<? extends BasePage>> idmPageClasses = 
lookup.getIdMPageClasses();
+        idmPageClasses.forEach(claz -> {
+            dynamicMenuStringResourceLoader.register("menu." + 
claz.getSimpleName(), claz);
+        });
+
+        final List<Class<? extends BasePage>> extPageClasses = 
lookup.getExtPageClasses();
+        extPageClasses.stream().filter(claz -> 
(claz.isAnnotationPresent(ExtPage.class))).forEach(claz -> {
+            dynamicMenuStringResourceLoader.register("menu." + 
claz.getSimpleName(), claz);
+        });
+
+        
getResourceSettings().getStringResourceLoaders().add(dynamicMenuStringResourceLoader);
+
         try (InputStream is = 
resourceLoader.getResource(props.getCustomFormLayout()).getInputStream()) {
             customFormLayout = MAPPER.readValue(is, new TypeReference<>() {
             });
diff --git 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/Sidebar.java
 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/Sidebar.java
index 647ae087d9..48fd029c5a 100644
--- 
a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/Sidebar.java
+++ 
b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/panels/Sidebar.java
@@ -141,8 +141,7 @@ public class Sidebar extends Panel {
                 IdMPage ann = 
item.getModelObject().getAnnotation(IdMPage.class);
 
                 BookmarkablePageLink<Page> link = new 
BookmarkablePageLink<>("idmPage", item.getModelObject());
-
-                link.add(new Label("idmPageLabel", ann.label()));
+                link.add(new Label("idmPageLabel", getString("menu." + 
ann.label(), null, ann.label())));
 
                 if 
(item.getModelObject().equals(pageRef.getPage().getClass())) {
                     link.add(new Behavior() {
@@ -177,8 +176,7 @@ public class Sidebar extends Panel {
                 AMPage ann = item.getModelObject().getAnnotation(AMPage.class);
 
                 BookmarkablePageLink<Page> link = new 
BookmarkablePageLink<>("amPage", item.getModelObject());
-
-                link.add(new Label("amPageLabel", ann.label()));
+                link.add(new Label("amPageLabel", getString("menu." + 
ann.label(), null, ann.label())));
 
                 if 
(item.getModelObject().equals(pageRef.getPage().getClass())) {
                     link.add(new Behavior() {
@@ -216,8 +214,7 @@ public class Sidebar extends Panel {
                 ExtPage ann = 
item.getModelObject().getAnnotation(ExtPage.class);
 
                 BookmarkablePageLink<Page> link = new 
BookmarkablePageLink<>("extPage", item.getModelObject());
-
-                link.add(new Label("extPageLabel", ann.label()));
+                link.add(new Label("extPageLabel", getString("menu." + 
ann.label(), null, ann.label())));
 
                 if 
(item.getModelObject().equals(pageRef.getPage().getClass())) {
                     link.add(new Behavior() {
diff --git 
a/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
 
b/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
index 3016d1af58..64ac9d197f 100644
--- 
a/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
+++ 
b/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
@@ -40,6 +40,7 @@ import org.apache.syncope.client.lib.AuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeAnonymousClient;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
+import org.apache.syncope.client.ui.commons.DynamicMenuStringResourceLoader;
 import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.JPADomain;
@@ -126,6 +127,11 @@ public abstract class AbstractTest {
             lookup.load();
             return lookup;
         }
+        
+        @Bean
+        public DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader() {
+            return new DynamicMenuStringResourceLoader();
+        }
     }
 
     public static class TestSyncopeWebApplication extends 
SyncopeWebApplication {
@@ -135,9 +141,10 @@ public abstract class AbstractTest {
                 final EnduserProperties props,
                 final ClassPathScanImplementationLookup lookup,
                 final ServiceOps serviceOps,
-                final List<IResource> resources) {
+                final List<IResource> resources,
+                final DynamicMenuStringResourceLoader 
dynamicMenuStringResourceLoader) {
 
-            super(resourceLoader, props, lookup, serviceOps, resources);
+            super(resourceLoader, props, lookup, serviceOps, resources, 
dynamicMenuStringResourceLoader);
         }
 
         public interface SyncopeServiceClient extends SyncopeService, Client {
diff --git 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable.properties
 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable.properties
index 5b088d6d6c..208b8c3ae0 100644
--- 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable.properties
+++ 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable.properties
@@ -17,3 +17,5 @@
 xmlEditorTitle=Workflow XML Editor
 userWorkflow=User workflow
 external_editor.title=Flowable Modeler
+
+menu.Flowable=Flowable
diff --git 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_fr_CA.properties
similarity index 97%
copy from 
ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
copy to 
ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_fr_CA.properties
index 515fa3ae72..f970823aef 100644
--- 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
+++ 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_fr_CA.properties
@@ -17,3 +17,5 @@
 xmlEditorTitle=XML \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 
\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 
\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f
 userWorkflow=User workflow
 external_editor.title=Flowable Modeler
+
+menu.Flowable=Flowable
diff --git 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_it.properties
 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_it.properties
index 37fd8593b3..a76f4dbd3f 100644
--- 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_it.properties
+++ 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_it.properties
@@ -17,3 +17,5 @@
 xmlEditorTitle=Workflow XML Editor
 userWorkflow=Workflow utenti
 external_editor.title=Flowable Modeler
+
+menu.Flowable=Flowable
diff --git 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ja.properties
 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ja.properties
index 45b48142e2..8328db6857 100644
--- 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ja.properties
+++ 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ja.properties
@@ -17,3 +17,5 @@
 xmlEditorTitle=\u30ef\u30fc\u30af\u30d5\u30ed\u30fc XML 
\u30a8\u30c7\u30a3\u30bf\u30fc
 userWorkflow=\u30e6\u30fc\u30b6\u30fc\u30ef\u30fc\u30af\u30d5\u30ed\u30fc
 external_editor.title=Flowable \u30e2\u30c7\u30e9\u30fc
+
+menu.Flowable=Flowable
diff --git 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_pt_BR.properties
 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_pt_BR.properties
index 5b088d6d6c..208b8c3ae0 100644
--- 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_pt_BR.properties
+++ 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_pt_BR.properties
@@ -17,3 +17,5 @@
 xmlEditorTitle=Workflow XML Editor
 userWorkflow=User workflow
 external_editor.title=Flowable Modeler
+
+menu.Flowable=Flowable
diff --git 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
index 515fa3ae72..f970823aef 100644
--- 
a/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
+++ 
b/ext/flowable/client-console/src/main/resources/org/apache/syncope/client/console/pages/Flowable_ru.properties
@@ -17,3 +17,5 @@
 xmlEditorTitle=XML \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 
\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 
\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f
 userWorkflow=User workflow
 external_editor.title=Flowable Modeler
+
+menu.Flowable=Flowable
diff --git 
a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
 
b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
index 30d9cd2827..f4d6345807 100644
--- 
a/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
+++ 
b/ext/flowable/client-enduser/src/main/java/org/apache/syncope/client/enduser/pages/Flowable.java
@@ -48,7 +48,7 @@ import org.apache.wicket.model.StringResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-@ExtPage(label = "User Requests", icon = "fa fa-briefcase", listEntitlement = 
"")
+@ExtPage(label = "Flowable", icon = "fa fa-briefcase", listEntitlement = "")
 public class Flowable extends BaseExtPage {
 
     private static final long serialVersionUID = -8781434495150074529L;
diff --git 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
index 17cc65dccf..0462c18517 100644
--- 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
+++ 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable.properties
@@ -23,3 +23,5 @@ delete=Delete
 start=Start
 requests.to.be.approved=Your active requests
 activityId=Activity Id
+
+menu.Flowable=User Requests
diff --git 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_fr_CA.properties
similarity index 96%
copy from 
ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
copy to 
ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_fr_CA.properties
index aba7051a6d..3fb74cc04c 100644
--- 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
+++ 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_fr_CA.properties
@@ -23,3 +23,5 @@ delete=Cancella
 start=Esegui
 requests.to.be.approved=Richieste in lavorazione
 activityId=Id attivit\u00e0
+
+menu.Flowable=Demandes des utilisateurs
diff --git 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
index aba7051a6d..f52e354375 100644
--- 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
+++ 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_it.properties
@@ -23,3 +23,5 @@ delete=Cancella
 start=Esegui
 requests.to.be.approved=Richieste in lavorazione
 activityId=Id attivit\u00e0
+
+menu.Flowable=Richieste utente
diff --git 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
index 2a8e4033b7..235838f236 100644
--- 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
+++ 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ja.properties
@@ -23,3 +23,5 @@ delete=\u30af\u30ea\u30a2
 start=\u958b\u59cb
 
requests.to.be.approved=\u3042\u306a\u305f\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u30ea\u30af\u30a8\u30b9\u30c8
 activityId=Activity Id
+
+menu.Flowable=\u30e6\u30fc\u30b6\u30fc\u8981\u8acb
diff --git 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
index 57b7d62683..29c98da459 100644
--- 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
+++ 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_pt_BR.properties
@@ -23,3 +23,6 @@ delete=Limpa
 start=Come\u00e7ar
 requests.to.be.approved=Seus pedidos ativos
 activityId=Activity Id
+
+menu.Flowable=Solicita\u00e7\u00f5es dos usu\u00e1rios
+
diff --git 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
index 87cfaccc4a..1471ccd533 100644
--- 
a/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
+++ 
b/ext/flowable/client-enduser/src/main/resources/org/apache/syncope/client/enduser/pages/Flowable_ru.properties
@@ -23,3 +23,5 @@ delete=\u0440\u0430\u0441\u0441\u0435\u0435\u0442\u0441\u044f
 start=\u041d\u0430\u0447\u043d\u0438\u0442\u0435
 requests.to.be.approved=\u0412\u0430\u0448\u0438 
\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 
\u0437\u0430\u043f\u0440\u043e\u0441\u044b
 activityId=Activity Id
+
+menu.Flowable=\u0417\u0430\u043f\u0440\u043e\u0441\u044b 
\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439
diff --git 
a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/OIDCC4UI.java
 
b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/OIDCC4UI.java
index afa8fbec4a..a1924650ff 100644
--- 
a/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/OIDCC4UI.java
+++ 
b/ext/oidcc4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/OIDCC4UI.java
@@ -34,7 +34,7 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-@ExtPage(label = "OIDC 1.0 C4UI", icon = "fab fa-openid",
+@ExtPage(label = "OIDCC4UI", icon = "fab fa-openid",
         listEntitlement = OIDCC4UIEntitlement.OP_READ, priority = 300)
 public class OIDCC4UI extends BaseExtPage {
 
diff --git 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
index b34f11c366..5712591ae5 100644
--- 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
+++ 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 op=OIDC Providers
+
+menu.OIDCC4UI=OIDC 1.0 C4UI
diff --git 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_fr.properties
similarity index 96%
copy from 
ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
copy to 
ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_fr.properties
index e78fe314b3..51e437f0f7 100644
--- 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
+++ 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_fr.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 op=Provider OIDC
+
+menu.OIDCC4UI=OIDC 1.0 C4UI
diff --git 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
index e78fe314b3..51e437f0f7 100644
--- 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
+++ 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 op=Provider OIDC
+
+menu.OIDCC4UI=OIDC 1.0 C4UI
diff --git 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ja.properties
similarity index 96%
copy from 
ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
copy to 
ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ja.properties
index b34f11c366..5712591ae5 100644
--- 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI.properties
+++ 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ja.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 op=OIDC Providers
+
+menu.OIDCC4UI=OIDC 1.0 C4UI
diff --git 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_pt.properties
similarity index 96%
copy from 
ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
copy to 
ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_pt.properties
index e78fe314b3..51e437f0f7 100644
--- 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_it.properties
+++ 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_pt.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 op=Provider OIDC
+
+menu.OIDCC4UI=OIDC 1.0 C4UI
diff --git 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ru.properties
 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ru.properties
index b34f11c366..5712591ae5 100644
--- 
a/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ru.properties
+++ 
b/ext/oidcc4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/OIDCC4UI_ru.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 op=OIDC Providers
+
+menu.OIDCC4UI=OIDC 1.0 C4UI
diff --git 
a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/SAML2SP4UI.java
 
b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/SAML2SP4UI.java
index 9bffc91379..28431bf9ea 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/SAML2SP4UI.java
+++ 
b/ext/saml2sp4ui/client-console/src/main/java/org/apache/syncope/client/console/pages/SAML2SP4UI.java
@@ -36,7 +36,7 @@ import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-@ExtPage(label = "SAML 2.0 SP4UI", icon = "fas fa-sign-in-alt",
+@ExtPage(label = "SAML2SP4UI", icon = "fas fa-sign-in-alt",
         listEntitlement = SAML2SP4UIEntitlement.IDP_READ, priority = 400)
 public class SAML2SP4UI extends BaseExtPage {
 
diff --git 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
index ead24e7b81..734c6a71db 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
+++ 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
@@ -16,3 +16,5 @@
 # under the License.
 idps=Identity Providers
 sp=Service Provider
+
+menu.SAML2SP4UI=SAML 2.0 SP4UI
diff --git 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_fr_CA.properties
similarity index 96%
copy from 
ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
copy to 
ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_fr_CA.properties
index ead24e7b81..734c6a71db 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
+++ 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_fr_CA.properties
@@ -16,3 +16,5 @@
 # under the License.
 idps=Identity Providers
 sp=Service Provider
+
+menu.SAML2SP4UI=SAML 2.0 SP4UI
diff --git 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_it.properties
 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_it.properties
index ead24e7b81..734c6a71db 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_it.properties
+++ 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_it.properties
@@ -16,3 +16,5 @@
 # under the License.
 idps=Identity Providers
 sp=Service Provider
+
+menu.SAML2SP4UI=SAML 2.0 SP4UI
diff --git 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ja.properties
similarity index 96%
copy from 
ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
copy to 
ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ja.properties
index ead24e7b81..734c6a71db 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI.properties
+++ 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ja.properties
@@ -16,3 +16,5 @@
 # under the License.
 idps=Identity Providers
 sp=Service Provider
+
+menu.SAML2SP4UI=SAML 2.0 SP4UI
diff --git 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_pt_BR.properties
 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_pt_BR.properties
index ead24e7b81..734c6a71db 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_pt_BR.properties
+++ 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_pt_BR.properties
@@ -16,3 +16,5 @@
 # under the License.
 idps=Identity Providers
 sp=Service Provider
+
+menu.SAML2SP4UI=SAML 2.0 SP4UI
diff --git 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ru.properties
 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ru.properties
index ead24e7b81..734c6a71db 100644
--- 
a/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ru.properties
+++ 
b/ext/saml2sp4ui/client-console/src/main/resources/org/apache/syncope/client/console/pages/SAML2SP4UI_ru.properties
@@ -16,3 +16,5 @@
 # under the License.
 idps=Identity Providers
 sp=Service Provider
+
+menu.SAML2SP4UI=SAML 2.0 SP4UI
diff --git 
a/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/pages/SCIMConfPage.java
 
b/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/pages/SCIMConfPage.java
index 798d95161b..73c08db918 100644
--- 
a/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/pages/SCIMConfPage.java
+++ 
b/ext/scimv2/client-console/src/main/java/org/apache/syncope/client/console/pages/SCIMConfPage.java
@@ -28,7 +28,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 
-@ExtPage(label = "SCIM 2.0", icon = "fa fa-cloud", listEntitlement = 
SCIMEntitlement.SCIM_CONF_GET, priority = 500)
+@ExtPage(label = "SCIMConfPage", icon = "fa fa-cloud", listEntitlement = 
SCIMEntitlement.SCIM_CONF_GET, priority = 500)
 public class SCIMConfPage extends BaseExtPage {
 
     private static final long serialVersionUID = -8156063343062111770L;
diff --git 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
index cbcf4a3254..a82bf5e4df 100644
--- 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
+++ 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 scimConfGeneral=General
+
+menu.SCIMConfPage=SCIM 2.0
diff --git 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_fr.properties
similarity index 96%
copy from 
ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
copy to 
ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_fr.properties
index cbcf4a3254..a82bf5e4df 100644
--- 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
+++ 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_fr.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 scimConfGeneral=General
+
+menu.SCIMConfPage=SCIM 2.0
diff --git 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_it.properties
 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_it.properties
index cbcf4a3254..a82bf5e4df 100644
--- 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_it.properties
+++ 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_it.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 scimConfGeneral=General
+
+menu.SCIMConfPage=SCIM 2.0
diff --git 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ja.properties
similarity index 96%
copy from 
ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
copy to 
ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ja.properties
index cbcf4a3254..a82bf5e4df 100644
--- 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage.properties
+++ 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ja.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 scimConfGeneral=General
+
+menu.SCIMConfPage=SCIM 2.0
diff --git 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_pt_BR.properties
 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_pt_BR.properties
index cbcf4a3254..a82bf5e4df 100644
--- 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_pt_BR.properties
+++ 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_pt_BR.properties
@@ -15,3 +15,5 @@
 # specific language governing permissions and limitations
 # under the License.
 scimConfGeneral=General
+
+menu.SCIMConfPage=SCIM 2.0
diff --git 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ru.properties
 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ru.properties
index cbcf4a3254..66cff14474 100644
--- 
a/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ru.properties
+++ 
b/ext/scimv2/client-console/src/main/resources/org/apache/syncope/client/console/pages/SCIMConfPage_ru.properties
@@ -15,3 +15,6 @@
 # specific language governing permissions and limitations
 # under the License.
 scimConfGeneral=General
+
+menu.SCIMConfPage=SCIM 2.0
+

Reply via email to