diff --git a/src/main/java/org/codehaus/plexus/i18n/DefaultI18N.java b/src/main/java/org/codehaus/plexus/i18n/DefaultI18N.java index e71c306..8efd065 100644 --- a/src/main/java/org/codehaus/plexus/i18n/DefaultI18N.java +++ b/src/main/java/org/codehaus/plexus/i18n/DefaultI18N.java @@ -298,7 +298,10 @@ private synchronized ResourceBundle cacheBundle(String bundleName, Locale locale if (rb == null) { bundlesByLocale = (bundlesByLocale == null ? new HashMap<>(3) : new HashMap<>(bundlesByLocale)); try { - rb = ResourceBundle.getBundle(bundleName, locale); + rb = ResourceBundle.getBundle( + bundleName, + locale, + ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT)); } catch (MissingResourceException e) { rb = findBundleByLocale(bundleName, locale, bundlesByLocale); if (rb == null) { @@ -371,7 +374,10 @@ private ResourceBundle findBundleByLocale( */ private ResourceBundle getBundleIgnoreException(String bundleName, Locale locale) { try { - return ResourceBundle.getBundle(bundleName, locale); + return ResourceBundle.getBundle( + bundleName, + locale, + ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT)); } catch (MissingResourceException ignored) { return null; } diff --git a/src/test/java/org/codehaus/plexus/i18n/DefaultI18NTest.java b/src/test/java/org/codehaus/plexus/i18n/DefaultI18NTest.java index bb1b06c..2e748e0 100644 --- a/src/test/java/org/codehaus/plexus/i18n/DefaultI18NTest.java +++ b/src/test/java/org/codehaus/plexus/i18n/DefaultI18NTest.java @@ -110,7 +110,7 @@ public void testLocalization() { Locale.setDefault(Locale.FRENCH); try { String s7 = i18n.getString("org.codehaus.plexus.i18n.i18n", Locale.ENGLISH, "key1"); - assertEquals("[fr] value1", s7, "Not picking up new default locale: fr"); + assertEquals("[] value1", s7, "Should not fall back to default locale, use root bundle instead"); String s8 = i18n.getString("org.codehaus.plexus.i18n.i18n", Locale.ITALIAN, "key1"); assertEquals("[it] value1", s8, "Unable to retrieve localized properties for locale: it"); @@ -141,4 +141,25 @@ public void testLocalizedMessagesWithNonStandardLocale() { String s0 = i18n.getString("name", new Locale("xx")); assertEquals("plexus", s0); } + + @Test + public void testNoFallbackToDefaultLocale() { + // Save the current default locale + Locale oldDefault = Locale.getDefault(); + + try { + // Set default locale to German + Locale.setDefault(Locale.GERMAN); + + // Request a locale that doesn't have a bundle (Hebrew - Israel) + // Expected: should get the root bundle with "[] value1" + // Bug: currently gets the German bundle with "[de] value1" + String result = i18n.getString("org.codehaus.plexus.i18n.i18n", new Locale("iw", "IL"), "key1"); + + assertEquals("[] value1", result, "Should get root bundle, not default locale bundle"); + } finally { + // Restore the original default locale + Locale.setDefault(oldDefault); + } + } } diff --git a/src/test/resources/org/codehaus/plexus/i18n/i18n_de.properties b/src/test/resources/org/codehaus/plexus/i18n/i18n_de.properties new file mode 100644 index 0000000..141fcbb --- /dev/null +++ b/src/test/resources/org/codehaus/plexus/i18n/i18n_de.properties @@ -0,0 +1,4 @@ +key1 = [de] value1 +thanks.message = Danke {0}! +thanks.message1 = Danke {0} {1}! +thanks.message2 = Danke {0} {1}!