In projects, we often need to parse strings into Locales, but there is no easy-to-use class.
Java itself provides 3 constructors, but in actual use, you need to parse them yourself, which is relatively cumbersome.
Locale(langugae)
locale(language,country)
Locale(String language, String country, String variant)
Apache has LocaleUtils.toLocale(String language) but it does not support the last two characters being lowercase. For example: zh_CN supports it, but zh_cn does not.
Referring to other methods, I wrote the following class and took notes. I hope it will be helpful to people who solve similar problems.
Copy the code code as follows:
import java.util.Locale;
public class LocaleUtil
{
private final static Locale DEFAULT_LOCALE = Locale.ENGLISH;
public final static String IETF_SEPARATOR = "-";
public final static String SEPARATOR = "_";
public final static String EMPTY_STRING = "";
public static Locale toLocale( String language )
{
if( !StringUtil.isNullOrEmpty( language ) )
{
return langToLocale( language, SEPARATOR );
}
return DEFAULT_LOCALE;
}
public static Locale langToLocale( String lang , String separator )
{
if( StringUtil.isNullOrEmpty( lang ) )
{
return DEFAULT_LOCALE;
}
String language = EMPTY_STRING;
String country = EMPTY_STRING;
String variant = EMPTY_STRING;
int i1 = lang.indexOf(separator);
if ( i1 < 0 )
{
language = lang;
} else
{
language = lang.substring(0, i1);
++i1;
int i2 = lang.indexOf( separator, i1);
if (i2 < 0)
{
country = lang.substring(i1);
} else
{
country = lang.substring(i1, i2);
variant = lang.substring(i2+1);
}
}
if(language.length() == 2)
{
language = language.toLowerCase();
}else
{
language = EMPTY_STRING;
}
if(country.length() == 2)
{
country = country.toUpperCase();
}else
{
country = EMPTY_STRING;
}
if( (variant.length() > 0) &&
((language.length() == 2) ||(country.length() == 2)) )
{
variant = variant.toUpperCase();
}else
{
variant = EMPTY_STRING;
}
return new Locale(language, country, variant );
}
}
Notice:
Copy the code code as follows:
public class StringUtil
{
public static boolean isNullOrEmpty(String target) {
return target == null || "".equals(target);
}
}