Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中验证区域设置?_Java_Locale - Fatal编程技术网

如何在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");
 }