2010-09-10 16 views
19

He leído un archivo en una aplicación que especifica un código de idioma:¿Cómo validar una configuración regional en Java?

public void setResources(String locale) { 

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

} 

que debe estar en el formato: <ISO 639 language code>_<ISO 3166 region code> por ejemplo. en_UK, en_US, etc. ¿Es posible validar que la cadena de configuración regional es válida antes de continuar?

Respuesta

0

Ahora acabo de hacer:

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

cuales funciona bien.

11

Usted puede obtener los locales disponibles como tal y enumerarlos para ver si la localidad es válida

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

Esto es muy inperformant debido al gran número de lugares disponibles! –

+3

Solo tiene que hacerlo una vez y ponerlo en un conjunto – Rich

+0

Puede introducir una lista ordenada con las configuraciones regionales más usadas, que se verifica primero y agrega nuevas locales si se confirma, ¡esto debería reducir las comprobaciones de todas las configuraciones regionales disponibles! – codevour

1

Usted puede comprobar si la cadena está contenida en las matrices devueltas por los getISOCountries() o getISOLanguages() métodos de Locale. Es un poco crudo, pero en realidad puede funcionar. También puede extraer todos los Locales disponibles con getAvailableLocales() y buscarlos para ver los nombres.

15

No sé ULocale, pero si usted quiere decir java.util.Locale, el código siguiente puede hacer:

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: validación añadido

+2

Creo que ULocale se refiere a [esto] (http://icu-project.org/apiref/icu4j/com/ibm/icu/util/ULocale.Type.html). –

+0

Solo como un FYI. El delimitador predeterminado de ISO es "-" en lugar de "_". Consulte https://stackoverflow.com/questions/4904803/en-us-or-en-us- which-one-should-you-use –

+1

@BernieLenz correcto, pero la pregunta era sobre subrayado –

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

}

5

commons lang tiene un método de utilidad para analizar y validar las cadenas de entorno local: LocaleUtils.toLocale(String)

Después de eso, sólo hay que comprobar si la variante es vacío:

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

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

one-liner, excepto la captura java.lang.IllegalArgumentException.

0

Tuve este problema recientemente. Con la ayuda de Common-lang me ocurrió con esta

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() devuelve todos los lugares disponibles, pero se almacena la lista en una variable estática, por lo que se repite una sola vez

LocaleUtils .localeLookupList() toma una configuración regional y crea una lista con diferentes granularidades.

El código básicamente valida su configuración regional utilizando una versión más general hasta que se use inglés como alternativa.

1

Hay un montón de respuestas ya, pero para una rápida one-liner:

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

En un método:

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

es la respuesta a su pregunta.

Ejemplo:

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

Evitar el uso de getAvailableLocales() se le volverá Locales Su tiempo.

Si es posible explorar más en LocaleUtils class y Locale

+1

Creo que esta respuesta se ajusta mejor, muchas gracias !!! –

+1

+1 para este es más simple que eso 5 y.o. aswer arriba. Muchas gracias. Creo que puedes usar esto siempre que lo desees sin preocuparte por la gran cantidad del ciclo – poring91

+1

, pero es org.apache.commons, no quiero incluir más libs – user3871754

Cuestiones relacionadas