in src/main/java/org/apache/sling/i18n/impl/JcrResourceBundleProvider.java [669:727]
static Locale toLocale(String localeString) {
if (localeString == null || localeString.length() == 0) {
return Locale.getDefault();
}
// support BCP 47 compliant strings as well (using a different separator "-" instead of "_")
localeString = localeString.replaceAll("-", "_");
// check language and country
final String[] parts = localeString.split("_");
if (parts.length == 0) {
return Locale.getDefault();
}
// at least language is available
String lang = parts[0];
boolean isValidLanguageCode = false;
String[] langs = Locale.getISOLanguages();
for (int i = 0; i < langs.length; i++) {
if (langs[i].equalsIgnoreCase(lang)) {
isValidLanguageCode = true;
break;
}
}
if (!isValidLanguageCode) {
lang = Locale.getDefault().getLanguage();
}
// only language
if (parts.length == 1) {
return new Locale(lang);
}
// country is also available
String country = parts[1];
boolean isValidCountryCode = false;
// allow user-assigned codes (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#User-assigned_code_elements)
if (USER_ASSIGNED_COUNTRY_CODES_PATTERN.matcher(country.toLowerCase()).matches()) {
isValidCountryCode = true;
} else {
String[] countries = Locale.getISOCountries();
for (int i = 0; i < countries.length; i++) {
if (countries[i].equalsIgnoreCase(country)) {
isValidCountryCode = true; // signal ok
break;
}
}
}
if (!isValidCountryCode) {
country = Locale.getDefault().getCountry();
}
// language and country
if (parts.length == 2) {
return new Locale(lang, country);
}
// language, country and variant
return new Locale(lang, country, parts[2]);
}