add new locale endpoint that returns the messages

This commit is contained in:
Erik Jan de Wit 2023-09-27 14:55:07 +02:00 committed by Pedro Igor
parent bc55846809
commit 0f878566ab
3 changed files with 95 additions and 1 deletions

View file

@ -109,6 +109,7 @@ public class KeycloakApplication extends Application {
singletons.add(new ObjectMapperResolver());
classes.add(WelcomeResource.class);
classes.add(LocaleResource.class);
platform.onStartup(this::startup);
platform.onShutdown(this::shutdown);

View file

@ -0,0 +1,93 @@
package org.keycloak.services.resources;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.MediaType;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.services.managers.RealmManager;
import org.keycloak.services.util.LocaleUtil;
import org.keycloak.theme.Theme;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import static java.util.stream.Collectors.*;
@Path("/localisation")
@Produces(MediaType.APPLICATION_JSON)
public class LocaleResource {
@Context
protected KeycloakSession session;
@GET
@Path("{realm}/{theme}/{locale}")
public List<KeySource> getLocalizationTexts(@PathParam("realm") String realmName, @PathParam("theme") String theme,
@PathParam("locale") String localeString, @QueryParam("source") boolean showSource) throws IOException {
RealmManager realmManager = new RealmManager(session);
RealmModel realm = realmManager.getRealmByName(realmName);
session.getContext().setRealm(realm);
Theme theTheme = session.theme().getTheme(Theme.Type.valueOf(theme.toUpperCase()));
final Locale locale = Locale.forLanguageTag(localeString);
if (showSource) {
Properties messagesByLocale = theTheme.getMessages("messages", locale);
Set<KeySource> result = messagesByLocale.entrySet().stream().map(e ->
new KeySource((String) e.getKey(), (String) e.getValue(), Source.THEME)).collect(toSet());
Map<Locale, Properties> realmLocalizationMessages = LocaleUtil.getRealmLocalizationTexts(realm, locale);
for (Locale currentLocale = locale; currentLocale != null; currentLocale = LocaleUtil.getParentLocale(currentLocale)) {
final List<KeySource> realmOverride = realmLocalizationMessages.get(currentLocale).entrySet().stream().map(e ->
new KeySource((String) e.getKey(), (String) e.getValue(), Source.OVERRIDE)).collect(toList());
result.addAll(realmOverride);
}
return new ArrayList<>(result);
}
return theTheme.getEnhancedMessages(realm, locale).entrySet().stream().map(e ->
new KeySource((String) e.getKey(), (String) e.getValue())).collect(toList());
}
}
enum Source {
THEME,
OVERRIDE
}
class KeySource {
private String key;
private String value;
private Source source;
public KeySource(String key, String value) {
this.key = key;
this.value = value;
}
public KeySource(String key, String value, Source source) {
this(key, value);
this.source = source;
}
public String getKey() {
return key;
}
public String getValue() {
return value;
}
public Source getSource() {
return source;
}
}

View file

@ -200,7 +200,7 @@ public class LocaleUtil {
return mergeGroupedMessages(locale, realmLocalizationMessages, themeMessages);
}
private static Map<Locale, Properties> getRealmLocalizationTexts(RealmModel realm, Locale locale) {
public static Map<Locale, Properties> getRealmLocalizationTexts(RealmModel realm, Locale locale) {
LinkedHashMap<Locale, Properties> groupedMessages = new LinkedHashMap<>();
List<Locale> applicableLocales = getApplicableLocales(locale);