如何在java中验证语言环境?

时间:2010-09-10 12:53:53

标签: java locale

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

public void setResources(String locale) {

    // validate locale
    // ULocale lo = new ULocale(locale);
    // System.out.println(lo.getDisplayCountry());

}

必须采用以下格式:<ISO 639 language code>_<ISO 3166 region code>,例如。 en_UK,en_US等。是否可以在继续之前验证语言环境字符串是否有效?

10 个答案:

答案 0 :(得分:20)

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

编辑:添加验证

答案 1 :(得分:15)

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 classLocale

了解详情

答案 2 :(得分:14)

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

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

答案 3 :(得分:7)

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

除了捕捉java.lang.IllegalArgumentException之外,

单行。

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:2)

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

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

在方法中:

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

@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());
        }
    }    

}

答案 8 :(得分:0)

现在我这样做:

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

工作正常。

答案 9 :(得分:0)

我最近遇到了这个问题。在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;

}

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

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

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