Index: src/test/org/apache/commons/lang/LocaleUtilsTest.java =================================================================== --- src/test/org/apache/commons/lang/LocaleUtilsTest.java (revision 517357) +++ src/test/org/apache/commons/lang/LocaleUtilsTest.java (working copy) @@ -498,4 +498,11 @@ } catch (UnsupportedOperationException ex) {} } + /** + * Tests #LANG-328 - only language+variant + */ + public void testLang328() { + assertValidToLocale("fr__POSIX", "fr", "", "POSIX"); + } + } Index: src/java/org/apache/commons/lang/LocaleUtils.java =================================================================== --- src/java/org/apache/commons/lang/LocaleUtils.java (revision 517357) +++ src/java/org/apache/commons/lang/LocaleUtils.java (working copy) @@ -111,6 +111,9 @@ throw new IllegalArgumentException("Invalid locale format: " + str); } char ch3 = str.charAt(3); + if (ch3 == '_') { + return new Locale(str.substring(0, 2), "", str.substring(4)); + } char ch4 = str.charAt(4); if (ch3 < 'A' || ch3 > 'Z' || ch4 < 'A' || ch4 > 'Z') { throw new IllegalArgumentException("Invalid locale format: " + str);