diff --git a/org.hl7.fhir.utilities/pom.xml b/org.hl7.fhir.utilities/pom.xml
index d7ad5b9ec..f66076b91 100644
--- a/org.hl7.fhir.utilities/pom.xml
+++ b/org.hl7.fhir.utilities/pom.xml
@@ -80,6 +80,12 @@
true
+
+ com.ibm.icu
+ icu4j
+ 72.1
+
+
org.junit.jupiter
diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/I18nBaseTest.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/I18nBaseTest.java
index 989b6cd5a..ceea6d3cc 100644
--- a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/I18nBaseTest.java
+++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/I18nBaseTest.java
@@ -1,5 +1,6 @@
package org.hl7.fhir.utilities.i18n;
+import com.ibm.icu.text.PluralRules;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@@ -12,6 +13,11 @@ import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
import java.util.*;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
class I18nBaseTest {
public static final String BAD_STRING_ARG = "THIS_DOES_NOT_EXIST";
@@ -40,6 +46,38 @@ class I18nBaseTest {
Assertions.assertEquals(form.format(testArgs), result);
}
+ @Test
+ @DisplayName("Test pluralization works without initializing Locale.")
+ void testFormatMessagePluralWithoutInitLocale() {
+ I18nTestClass testClass = new I18nTestClass();
+
+ //Answer value must be of the type {1}
+ String resultOne = testClass.formatMessagePL(1, I18nConstants.QUESTIONNAIRE_QR_ITEM_WRONGTYPE_PLURAL);
+ assertThat(resultOne, containsString("be of the type"));
+
+ //Answer value must be one of the {0} types {1}
+ String resultMany = testClass.formatMessagePL(3, I18nConstants.QUESTIONNAIRE_QR_ITEM_WRONGTYPE_PLURAL);
+ assertThat(resultMany, containsString("one of the 3 types "));
+
+ }
+
+ @Test
+ @DisplayName("Test pluralization works without initializing Locale.")
+ void testFormatMessagePluralWithInitLocale() {
+ I18nTestClass testClass = new I18nTestClass();
+ //ResourceBundle loadedBundle = ResourceBundle.getBundle("Messages", Locale.GERMAN);
+
+ testClass.setLocale(Locale.GERMAN);
+ //Answer value muss einer der Typen {1} sein
+ String resultOne = testClass.formatMessagePL(1, I18nConstants.QUESTIONNAIRE_QR_ITEM_WRONGTYPE_PLURAL);
+ assertThat(resultOne, containsString("Answer value muss einer der Typen {1} sein"));
+
+ //?
+ String resultMany = testClass.formatMessagePL(3, I18nConstants.QUESTIONNAIRE_QR_ITEM_WRONGTYPE_PLURAL);
+ assertThat(resultMany, containsString("one of the 3 types "));
+
+ }
+
@Test
@DisplayName("Assert no string modification is done when no match is found.")
void testFormatMessageForNonExistentMessage() {
@@ -68,7 +106,7 @@ class I18nBaseTest {
String line;
while ((line = reader.readLine()) != null) {
// System.out.println("Searching for umlauts -> " + line);
- Assertions.assertFalse(stringContainsItemFromList(line, UMLAUTS));
+ assertFalse(stringContainsItemFromList(line, UMLAUTS));
}
} catch (IOException e) {
e.printStackTrace();
@@ -80,4 +118,20 @@ class I18nBaseTest {
public static boolean stringContainsItemFromList(String inputStr, String[] items) {
return Arrays.stream(items).anyMatch(inputStr::contains);
}
+
+ @Test
+ void pluralKeysCompleteAndValid() {
+ ResourceBundle loadedBundle = ResourceBundle.getBundle("Messages", Locale.GERMAN);
+ PluralRules pluralRules = PluralRules.forLocale(Locale.GERMANY);
+ for (String key : loadedBundle.keySet()) {
+ String[] keyComponent = key.split("_");
+
+ assertFalse(keyComponent[keyComponent.length - 1].equalsIgnoreCase("PLURAL"), "Invalid use of PLURAL keyword for key: " + key);
+ if (keyComponent.length > 2
+ && keyComponent[keyComponent.length - 2].equalsIgnoreCase("PLURAL")) {
+ assertTrue(pluralRules.getKeywords().contains(keyComponent[keyComponent.length - 1]));
+ }
+ }
+ }
+
}
\ No newline at end of file
diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/ICU4JTests.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/ICU4JTests.java
new file mode 100644
index 000000000..86e63815f
--- /dev/null
+++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/i18n/ICU4JTests.java
@@ -0,0 +1,52 @@
+package org.hl7.fhir.utilities.i18n;
+
+import com.ibm.icu.text.PluralRules;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ICU4JTests {
+
+ static final String[] EN_KEYWORDS = {
+ PluralRules.KEYWORD_ONE,
+ PluralRules.KEYWORD_OTHER
+ };
+
+ @Test
+ void getEnLocalePlurals() {
+ final Set keywords = getPluralKeywords(Locale.ENGLISH);
+ assertEquals(keywords, new HashSet(Arrays.asList(EN_KEYWORDS)));
+ }
+
+ static final String[] DE_KEYWORDS = {
+ PluralRules.KEYWORD_ONE,
+ PluralRules.KEYWORD_OTHER
+ };
+
+ @Test
+ void getDeLocalePlurals() {
+ final Set keywords = getPluralKeywords(Locale.GERMAN);
+ assertEquals(keywords, new HashSet(Arrays.asList(DE_KEYWORDS)));
+ }
+
+ static final String[] NL_KEYWORDS = {
+ PluralRules.KEYWORD_ONE,
+ PluralRules.KEYWORD_OTHER
+ };
+
+ @Test
+ void getNlLocalePlurals() {
+ final Set keywords = getPluralKeywords(Locale.forLanguageTag("nl"));
+ assertEquals(keywords, new HashSet(Arrays.asList(NL_KEYWORDS)));
+ }
+
+ private static Set getPluralKeywords(Locale locale) {
+ final PluralRules pluralRules = PluralRules.forLocale(locale);
+ return pluralRules.getKeywords();
+ }
+}