Как проверить локаль в Java? - PullRequest
       8

Как проверить локаль в Java?

25 голосов
/ 10 сентября 2010

Я прочитал файл в приложении, в котором указан код языка:

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 ]

20 голосов
/ 10 сентября 2010

Я не знаю 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;
  }
}

РЕДАКТИРОВАТЬ: добавлена ​​проверка

16 голосов
/ 08 июля 2015
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 locales. Это отнимает много времени.

Если возможно, узнайте больше в LocaleUtils class и Locale

14 голосов
/ 10 сентября 2010

Вы можете получить доступные локали, например, так и перечислить их, чтобы увидеть, действительна ли локаль

boolean isValidLocale(String value) {
  Locale[] locales = Locale.getAvailableLocales();
  for (Locale locale : locales) {
    if (value.equals(locale.toString())) {
      return true;
    }
  }
  return false;
}
7 голосов
/ 04 декабря 2012

использовать org.apache.commons.lang.LocaleUtils.toLocale(localeString).

однострочник, кроме ловли java.lang.IllegalArgumentException.

5 голосов
/ 09 августа 2012

commons lang имеет служебный метод для анализа и проверки строк локали: LocaleUtils.toLocale (String)

После этого вам просто нужно проверить, является ливариант пуст:

Validate.isTrue( StringUtils.isBlank( locale.getVariant() ) );
2 голосов
/ 20 декабря 2014

Ответов уже много, но для быстрого one-liner:

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

В методе:

boolean isLocaleAvailable(Locale locale) {
   return Arrays.asList(Locale.getAvailableLocales()).contains(locale);
}
2 голосов
/ 10 сентября 2010

Вы можете проверить, содержится ли строка в массивах, возвращенных методами getISOCountries() или getISOLanguages() из Locale.Это довольно грубо, но на самом деле может работать.Вы также можете извлечь все доступные Locales с помощью getAvailableLocales() и найти их по отображаемым именам.

1 голос
/ 13 сентября 2011
@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());
        }
    }    

}

0 голосов
/ 20 сентября 2013

У меня недавно была эта проблема.С помощью 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 () принимает языковой стандарт и создает список с различными гранулярностями.

Код в основном проверяет вашу локаль, используя более общую версию, пока английский не будет использован как запасной вариант.

0 голосов
/ 10 сентября 2010

Теперь я просто делаю:

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

, который отлично работает.

...