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

u12*_*123 25 java locale

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

public void setResources(String locale) {

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

}
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*ter 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加验证

  • 尝试isValid并且它失败了使用Locale.forLanguageTag("abc")创建的语言环境 (3认同)
  • 我认为ULocale指的是[this](http://icu-project.org/apiref/icu4j/com/ibm/icu/util/ULocale.Type.html). (2认同)
  • @BernieLenz对,但问题是关于下划线 (2认同)

Vde*_*deX 16

isAvailableLocale(Locale locale) 
Run Code Online (Sandbox Code Playgroud)

回答你的问题.

例:

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

避免使用getAvailableLocales()它将返回155 locales它耗时.

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

  • 但它是org.apache.commons,我不想包含更多的libs (4认同)

loc*_*cka 14

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

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

  • 您只需要执行一次并将其放入一组中 (4认同)

小智 8

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

单行,除了捕捉java.lang.IllegalArgumentException.


Aar*_*lla 5

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

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

Validate.isTrue( StringUtils.isBlank( locale.getVariant() ) );
Run Code Online (Sandbox Code Playgroud)


u12*_*123 0

现在我只是这样做:

ULocale uLocale = new ULocale(locale);
if (uLocale.getCountry() != null && !uLocale.getCountry().isEmpty()) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

效果很好。