KEYCLOAK-12926 Improve Locale based message lookup
We now consider intermediate Locales when performing a Locale based ResourceBundle lookup, before using an Locale.ENGLISH fallback. Co-authored-by: stianst <stianst@gmail.com>
This commit is contained in:
parent
d352d3fa8e
commit
67ddd3b0eb
8 changed files with 68 additions and 3 deletions
|
@ -255,8 +255,10 @@ public class ExtendingThemeManager implements ThemeProvider {
|
||||||
if (messages.get(baseBundlename) == null || messages.get(baseBundlename).get(locale) == null) {
|
if (messages.get(baseBundlename) == null || messages.get(baseBundlename).get(locale) == null) {
|
||||||
Properties messages = new Properties();
|
Properties messages = new Properties();
|
||||||
|
|
||||||
if (!Locale.ENGLISH.equals(locale)) {
|
Locale parent = getParent(locale);
|
||||||
messages.putAll(getMessages(baseBundlename, Locale.ENGLISH));
|
|
||||||
|
if (parent != null) {
|
||||||
|
messages.putAll(getMessages(baseBundlename, parent));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ThemeResourceProvider t : themeResourceProviders ){
|
for (ThemeResourceProvider t : themeResourceProviders ){
|
||||||
|
@ -309,4 +311,21 @@ public class ExtendingThemeManager implements ThemeProvider {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Locale getParent(Locale locale) {
|
||||||
|
if (Locale.ENGLISH.equals(locale)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locale.getVariant() != null && !locale.getVariant().isEmpty()) {
|
||||||
|
return new Locale(locale.getLanguage(), locale.getCountry());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locale.getCountry() != null && !locale.getCountry().isEmpty()) {
|
||||||
|
return new Locale(locale.getLanguage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Locale.ENGLISH;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
test.keycloak-12926-only_de=only de
|
|
@ -0,0 +1 @@
|
||||||
|
test.keycloak-12926-resolving2=only de_AT
|
|
@ -0,0 +1 @@
|
||||||
|
test.keycloak-12926-resolving1=only de_AT_variant
|
|
@ -1,2 +1,4 @@
|
||||||
test.keycloak-8818= Hello from theme-resources
|
test.keycloak-8818= Hello from theme-resources
|
||||||
fullName=Full name (Theme-resources)
|
fullName=Full name (Theme-resources)
|
||||||
|
test.keycloak-12926=Test en
|
||||||
|
test.keycloak-12926-resolving3=fallback en
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
test.keycloak-8818= Hello from theme-resources
|
||||||
|
fullName=Full name (Theme-resources)
|
||||||
|
test.keycloak-12926=Test en_US
|
|
@ -0,0 +1,3 @@
|
||||||
|
test.keycloak-8818= Hello from theme-resources
|
||||||
|
fullName=Full name (Theme-resources)
|
||||||
|
test.keycloak-12926=Test en_US_variant
|
|
@ -60,4 +60,39 @@ public class ThemeResourceProviderTest extends AbstractTestRealmKeycloakTest {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See KEYCLOAK-12926
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void getMessagesLocaleResolving() {
|
||||||
|
testingClient.server().run(session -> {
|
||||||
|
try {
|
||||||
|
ThemeProvider extending = session.getProvider(ThemeProvider.class, "extending");
|
||||||
|
Theme theme = extending.getTheme("base", Theme.Type.LOGIN);
|
||||||
|
Assert.assertEquals("Test en_US_variant", theme.getMessages("messages", new Locale("en", "US", "variant")).get("test.keycloak-12926"));
|
||||||
|
Assert.assertEquals("Test en_US", theme.getMessages("messages", new Locale("en", "US")).get("test.keycloak-12926"));
|
||||||
|
Assert.assertEquals("Test en", theme.getMessages("messages", Locale.ENGLISH).get("test.keycloak-12926"));
|
||||||
|
Assert.assertEquals("Test en_US", theme.getMessages("messages", new Locale("en", "US")).get("test.keycloak-12926"));
|
||||||
|
Assert.assertEquals("Test en", theme.getMessages("messages", Locale.ENGLISH).get("test.keycloak-12926"));
|
||||||
|
|
||||||
|
Assert.assertEquals("only de_AT_variant", theme.getMessages("messages", new Locale("de", "AT", "variant")).get("test.keycloak-12926-resolving1"));
|
||||||
|
Assert.assertNull(theme.getMessages("messages", new Locale("de", "AT")).get("test.keycloak-12926-resolving1"));
|
||||||
|
|
||||||
|
Assert.assertEquals("only de_AT", theme.getMessages("messages", new Locale("de", "AT", "variant")).get("test.keycloak-12926-resolving2"));
|
||||||
|
Assert.assertNull(theme.getMessages("messages", new Locale("de")).get("test.keycloak-12926-resolving2"));
|
||||||
|
|
||||||
|
Assert.assertEquals("only de", theme.getMessages("messages", new Locale("de", "AT", "variant")).get("test.keycloak-12926-only_de"));
|
||||||
|
Assert.assertNull(theme.getMessages("messages", Locale.ENGLISH).get("test.keycloak-12926-only_de"));
|
||||||
|
|
||||||
|
Assert.assertEquals("fallback en", theme.getMessages("messages", new Locale("de", "AT", "variant")).get("test.keycloak-12926-resolving3"));
|
||||||
|
Assert.assertEquals("fallback en", theme.getMessages("messages", new Locale("de", "AT")).get("test.keycloak-12926-resolving3"));
|
||||||
|
Assert.assertEquals("fallback en", theme.getMessages("messages", new Locale("de")).get("test.keycloak-12926-resolving3"));
|
||||||
|
Assert.assertNull(theme.getMessages("messages", Locale.ENGLISH).get("fallback en"));
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
Assert.fail(e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue