如何在java中validation语言环境?

我在应用程序中读取了一个指定语言代码的文件:

public void setResources(String locale) { // validate locale // ULocale lo = new ULocale(locale); // System.out.println(lo.getDisplayCountry()); } 

必须采用以下格式: _例如。 en_UK,en_US等。是否可以在继续之前validation语言环境字符串是否有效?

我不知道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; } } 

编辑:添加validation

您可以像这样获取可用的语言环境并枚举它们以查看语言环境是否有效

 boolean isValidLocale(String value) { Locale[] locales = Locale.getAvailableLocales(); for (Locale locale : locales) { if (value.equals(locale.toString())) { return true; } } return false; } 
 isAvailableLocale(Locale locale) 

回答你的问题。

例:

 String key= "ms-MY"; Locale locale = new Locale.Builder().setLanguageTag(key).build(); if (LocaleUtils.isAvailableLocale(locale)) { System.out.println("Locale present"); } 

避免使用getAvailableLocales()它会返回155个区域设置它很耗时。

如果可能,请在LocaleUtils类和Locale中了解更多信息

使用org.apache.commons.lang.LocaleUtils.toLocale(localeString)

一线,除了捕获java.lang.IllegalArgumentException

commons lang有一个实用程序方法来解析和validation语言环境字符串: LocaleUtils.toLocale(String)

之后,您只需检查变量是否为空:

 Validate.isTrue( StringUtils.isBlank( locale.getVariant() ) ); 

您可以检查字符串是否包含在由LocalegetISOCountries()getISOLanguages()方法返回的数组中。 它有点粗糙,但实际上可以工作。 您还可以使用getAvailableLocales()提取所有可用的Locales ,并在其中搜索显示名称。

 @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RUNTIME) @Constraint(validatedBy = ValidLocaleValidator.class) @Documented public @interface ValidLocale { String message() default "{constraints.validlocale}"; Class[] groups() default {}; Class[] payload() default {}; } public class ValidLocaleValidator implements ConstraintValidator { private Set validLocales = new HashSet(); @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()); } } 

}

已经有很多答案,但快速one-liner

 Arrays.asList(Locale.getAvailableLocales()).contains(Locale.US) 

在一个方法中:

 boolean isLocaleAvailable(Locale locale) { return Arrays.asList(Locale.getAvailableLocales()).contains(locale); } 

现在我这样做:

 ULocale uLocale = new ULocale(locale); if (uLocale.getCountry() != null && !uLocale.getCountry().isEmpty()) { ... } 

哪个工作正常。

我最近遇到了这个问题。 在Common-lang的帮助下,我提出了这个问题

  public static Locale getValidLocale(final Locale locale) { Set locales = LocaleUtils.availableLocaleSet(); List givenLocales = LocaleUtils.localeLookupList(locale, Locale.ENGLISH); for (Locale loc : givenLocales) { if (locales.contains(loc)) { return loc; } } return Locale.ENGLISH; } 

LocaleUtils.availableLocaleSet()返回所有可用的语言环境,但它将列表存储在静态变量中,因此它只迭代一次

LocaleUtils.localeLookupList()采用区域设置并创建具有不同粒度的列表。

代码基本上使用更通用的版本validation您的语言环境,直到将英语用作后备。