Подтвердить что ты не робот

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

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

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 и т.д. Можно ли подтвердить, что строка локали действительна до продолжения?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

EDIT: добавлена ​​проверка

Ответ 3

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

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

Ответ 4

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 class и Locale

Ответ 5

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

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

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

Ответ 6

используйте org.apache.commons.lang.LocaleUtils.toLocale(localeString).

однострочный, кроме улавливания java.lang.IllegalArgumentException.

Ответ 7

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

Ответ 8

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

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

В методе:

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

Ответ 9

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

}

Ответ 10

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

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