diff --git a/driver/api/src/main/java/eu/cloudnetservice/driver/language/PropertiesTranslationProvider.java b/driver/api/src/main/java/eu/cloudnetservice/driver/language/PropertiesTranslationProvider.java index 35a5943172..f5dfbc30cc 100644 --- a/driver/api/src/main/java/eu/cloudnetservice/driver/language/PropertiesTranslationProvider.java +++ b/driver/api/src/main/java/eu/cloudnetservice/driver/language/PropertiesTranslationProvider.java @@ -43,8 +43,8 @@ */ public final class PropertiesTranslationProvider implements TranslationProvider { - // https://regex101.com/r/FaX3tj/1 - private static final Pattern TRANSLATION_ARG_FORMAT_PATTERN = Pattern.compile("\\{(\\d+)\\$.+?\\$}"); + // https://regex101.com/r/Xs7lNp/1 + private static final Pattern TRANSLATION_ARG_FORMAT_PATTERN = Pattern.compile("\\{(\\d+|\\d+,.+?)\\$.+?\\$}"); // a lock that must be held when using a MessageFormat to format a translation // this is due to the fact that MessageFormats are not thread safe, but we don't expect diff --git a/driver/impl/src/test/java/eu/cloudnetservice/driver/impl/language/I18nTest.java b/driver/impl/src/test/java/eu/cloudnetservice/driver/impl/language/I18nTest.java index 65a67bdf9a..7afb8c4715 100644 --- a/driver/impl/src/test/java/eu/cloudnetservice/driver/impl/language/I18nTest.java +++ b/driver/impl/src/test/java/eu/cloudnetservice/driver/impl/language/I18nTest.java @@ -173,4 +173,21 @@ void testTranslationProvidersUnregisterByClassLoader() { Assertions.assertEquals("", i18n.translate("1")); Assertions.assertEquals("", i18n.translate("2")); } + + @Test + void testAdvancedMessageFormatPatternsArePickedUp() { + var properties = new Properties(); + properties.put("1", "Hello {0$name$}, your status is {1, choice, 0#deactivated|1#active$status$}"); + properties.put("2", "{0} {1$name$} {2,number,integer$an int$} {3,choice,0#hello|1#world|2#test$some description$}"); + var provider = PropertiesTranslationProvider.fromProperties(properties); + + var i18n = I18n.i18n(); + i18n.registerProvider(i18n.selectedLanguage(), provider); + + Assertions.assertEquals("Hello Rob, your status is active", i18n.translate("1", "Rob", 1)); + Assertions.assertEquals("Hello Klaro, your status is deactivated", i18n.translate("1", "Klaro", 0)); + + Assertions.assertEquals("World Rob 56,789 test", provider.translate("2", "World", "Rob", 56789, 2)); + Assertions.assertEquals("Hello World 1,234,568 world", provider.translate("2", "Hello", "World", 1234567.89, 1)); + } }