如何在java中验证区域设置?
我在指定语言代码的应用程序中读取文件:如何在java中验证区域设置?,java,locale,Java,Locale,我在指定语言代码的应用程序中读取文件: public void setResources(String locale) { // validate locale // ULocale lo = new ULocale(locale); // System.out.println(lo.getDisplayCountry()); } 必须采用以下格式:例如en_UK、en_US等。是否可以在继续之前验证区域设置字符串是否有效?您可以像这样获取可用的区域设置并枚举它们,
public void setResources(String locale) {
// validate locale
// ULocale lo = new ULocale(locale);
// System.out.println(lo.getDisplayCountry());
}
必须采用以下格式:
例如en_UK、en_US等。是否可以在继续之前验证区域设置字符串是否有效?您可以像这样获取可用的区域设置并枚举它们,以查看区域设置是否有效
boolean isValidLocale(String value) {
Locale[] locales = Locale.getAvailableLocales();
for (Locale locale : locales) {
if (value.equals(locale.toString())) {
return true;
}
}
return false;
}
您可以检查字符串是否包含在
getISOCountries()
或getISOLanguages()
语言环境方法返回的数组中。这有点粗糙,但实际上可能有效。
您还可以使用getAvailableLocales()
提取所有可用的Locale
,并搜索它们的显示名称。我不知道ULocale,但如果您的意思是java.util.Locale
,则以下代码可以:
public void setResources(String locale) {
// validate locale
Locale lo = parseLocale(locale);
if (isValid(lo)) {
System.out.println(lo.getDisplayCountry());
} else {
System.out.println("invalid: " + locale);
}
}
private Locale parseLocale(String locale) {
String[] parts = locale.split("_");
switch (parts.length) {
case 3: return new Locale(parts[0], parts[1], parts[2]);
case 2: return new Locale(parts[0], parts[1]);
case 1: return new Locale(parts[0]);
default: throw new IllegalArgumentException("Invalid locale: " + locale);
}
}
private boolean isValid(Locale locale) {
try {
return locale.getISO3Language() != null && locale.getISO3Country() != null;
} catch (MissingResourceException e) {
return false;
}
}
编辑:添加了验证现在我只需执行以下操作:
ULocale uLocale = new ULocale(locale);
if (uLocale.getCountry() != null && !uLocale.getCountry().isEmpty()) {
...
}
工作正常。@Target({ElementType.FIELD,ElementType.METHOD})
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RUNTIME)
@Constraint(validatedBy = ValidLocaleValidator.class)
@Documented
public @interface ValidLocale {
String message() default "{constraints.validlocale}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class ValidLocaleValidator implements ConstraintValidator<ValidLocale, String> {
private Set<String> validLocales = new HashSet<String>();
@Override
public void initialize(ValidLocale constraintAnnotation) {
Locale []locales = Locale.getAvailableLocales();
for (java.util.Locale l : locales) {
validLocales.add(l.toString());
}
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return validLocales.contains(value);
}
}
public class ValidLocaleTest {
public static class MyBeanWithLocale {
public static final String MSG = "not a locale";
private String l;
public MyBeanWithLocale(String l) {
this.l = l;
}
@ValidLocale(message=MSG)
public String getL() {
return l;
}
public void setL(String l) {
this.l = l;;
}
}
@Test
public void testLocale() {
//success
MyBeanWithLocale b1 = new MyBeanWithLocale("fr_FR");
Jsr303.validate(b1); //equivalent to Validation.buildDefaultValidatorFactory().getValidator().validate
//failure
try {
MyBeanWithLocale b2 = new MyBeanWithLocale("FRANCE");
Jsr303.validate(b2);//equivalent to Validation.buildDefaultValidatorFactory().getValidator().validate
Assert.fail();
} catch (Exception e) {
Assert.assertEquals("[" + MyBeanWithLocale.MSG + "]", e.getCause().getMessage());
}
}
@保留(运行时)
@约束(validatedBy=ValidLocaleValidator.class)
@记录
public@interface ValidLocale{
字符串消息()默认值“{constraints.validlocale}”;
类[]组()默认值{};
类具有用于分析和验证区域设置字符串的实用方法:
之后,您只需检查变量是否为空:
Validate.isTrue( StringUtils.isBlank( locale.getVariant() ) );
使用org.apache.commons.lang.LocaleUtils.toLocale(localeString)
除了捕获java.lang.IllegalArgumentException
之外,还有一行代码最近遇到了这个问题。在Common lang的帮助下,我想出了这个问题
public static Locale getValidLocale(final Locale locale) {
Set<Locale> locales = LocaleUtils.availableLocaleSet();
List<Locale> givenLocales = LocaleUtils.localeLookupList(locale, Locale.ENGLISH);
for (Locale loc : givenLocales) {
if (locales.contains(loc)) {
return loc;
}
}
return Locale.ENGLISH;
}
公共静态语言环境getValidLocale(最终语言环境){
Set locales=LocaleUtils.availableLocaleSet();
List givenLocales=LocaleUtils.localeLookupList(locale,locale.ENGLISH);
对于(区域设置位置:givenLocales){
if(locales.contains(loc)){
返回loc;
}
}
返回Locale.ENGLISH;
}
availableLocaleSet()返回所有可用的区域设置,但它将列表存储在一个静态变量中,因此只迭代一次
LocaleUtils.localeLookupList()接受区域设置并创建具有不同粒度的列表
代码基本上使用更通用的版本验证您的区域设置,直到英语被用作备用语言。已经有很多答案,但对于快速的一行程序来说
:
Arrays.asList(Locale.getAvailableLocales()).contains(Locale.US)
在一种方法中:
boolean isLocaleAvailable(Locale locale) {
return Arrays.asList(Locale.getAvailableLocales()).contains(locale);
}
这是您问题的答案。
示例:
String key= "ms-MY";
Locale locale = new Locale.Builder().setLanguageTag(key).build();
if (LocaleUtils.isAvailableLocale(locale))
{
System.out.println("Locale present");
}
避免使用getavailablecales()
它将返回您所需时间的155地区
如果可能的话,请在和中探索更多内容,这是非常不好的,因为有大量可用的区域设置!您只需要做一次,并将其放入一个集合中。您可以引入一个使用最多的区域设置的排序列表,首先检查该列表,并在确认后添加新的区域设置,这将减少对整个可用区域设置的检查s!+1.如果资源是实际应用程序本身的一部分(并且没有从外部源或接口集成到系统中),我会将上面的代码片段集成到一个排序单元测试中,该测试使用Locale.getAvailableCales()中的列表检查所有资源文件名
。如果混合语言环境中的语言在所选国家/地区不常见,例如“en_-RU”,该语言环境是有效的,但在可用语言环境列表中找不到。我认为ULocale指的是。仅供参考。ISO默认分隔符是“-”而不是“\u0”。请参阅@BernieLenz right,但问题是关于下划线的isValid,对于使用locale.forLanguageTag(“abc”)创建的区域设置,它将失败+1因为这个比上面的5 y.o.aswer更简单。非常感谢。我想你可以随时使用它,而不用担心大量的循环。但是它是org.apache.commons,我不想包含更多的库。如果你的项目中已经包含了org.apache.commons,这是最好的答案。而且这应该是可以接受的回答请注意,LocaleUtils.isAvailableLocale()的实现只是在缓存的区域设置列表中进行迭代。由于缓存,性能稍好一些,但它并没有避免线性时间搜索(也称为@poring91提到的大量循环)。
String key= "ms-MY";
Locale locale = new Locale.Builder().setLanguageTag(key).build();
if (LocaleUtils.isAvailableLocale(locale))
{
System.out.println("Locale present");
}