2010-09-10 19 views
19

tôi đọc một tập tin trong một ứng dụng mà chỉ định một mã ngôn ngữ:Làm cách nào để xác thực một ngôn ngữ trong java?

public void setResources(String locale) { 

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

} 

mà phải nằm trong định dạng: <ISO 639 language code>_<ISO 3166 region code> ví dụ. en_UK, en_US vv Có thể xác thực rằng chuỗi miền địa phương có hợp lệ trước khi tiếp tục không?

Trả lời

0

Bây giờ tôi chỉ làm:

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

mà hoạt động tốt.

11

Bạn có thể lấy miền địa phương có sẵn như vậy và liệt kê chúng để xem nếu miền địa phương có giá trị

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

này rất inperformant vì số lượng lớn các miền địa phương có sẵn! –

+3

Bạn chỉ cần thực hiện một lần và đặt nó vào một bộ – Rich

+0

Bạn có thể giới thiệu một danh sách được sắp xếp với các ngôn ngữ được sử dụng nhiều nhất, được kiểm tra trước và thêm người dân địa phương mới nếu được xác nhận, điều này sẽ làm giảm kiểm tra của toàn bộ ngôn ngữ có sẵn! – codevour

1

Bạn có thể kiểm tra xem chuỗi được chứa trong các mảng trả về bởi các getISOCountries() hoặc getISOLanguages() phương pháp Locale. Của nó kinda thô nhưng thực sự có thể làm việc. Bạn cũng có thể trích xuất tất cả Locales có sẵn với getAvailableLocales() và tìm kiếm chúng để hiển thị tên.

15

Tôi không biết ULocale, nhưng nếu bạn có ý nghĩa java.util.Locale, mã sau đây có thể làm:

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: thêm xác nhận

+2

Tôi nghĩ ULocale đang đề cập đến [this] (http://icu-project.org/apiref/icu4j/com/ibm/icu/util/ULocale.Type.html). –

+0

Giống như một FYI. Dấu phân cách mặc định theo ISO là "-" thay vì "_". Xem https://stackoverflow.com/questions/4904803/en-us-or-en-us-which-one-should-you-use –

+1

@BernieLenz ngay, nhưng câu hỏi là về gạch dưới –

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 có một phương pháp hữu ích để phân tích và xác nhận chuỗi ngôn ngữ: LocaleUtils.toLocale(String)

Sau đó, bạn chỉ cần kiểm tra xem các biến thể là rỗng:

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

sử dụng org.apache.commons.lang.LocaleUtils.toLocale(localeString).

một lớp lót, ngoài việc bắt được java.lang.IllegalArgumentException.

0

Tôi gặp sự cố này gần đây. Với sự giúp đỡ từ Common-lang tôi đã đưa ra với điều này

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() trả về miền địa phương tất cả có sẵn, nhưng nó lưu trữ các danh sách trong một biến tĩnh, vì vậy nó được lặp chỉ một lần

LocaleUtils .localeLookupList() lấy một miền địa phương và tạo một danh sách với các chi tiết khác nhau.

Mã cơ bản xác thực ngôn ngữ của bạn bằng phiên bản tổng quát hơn cho đến khi tiếng Anh được sử dụng làm dự phòng.

1

Có rất nhiều câu trả lời đã được nhưng đối với một nhanh one-liner:

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

Trong một phương pháp:

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

là câu trả lời cho câu hỏi của bạn.

Ví dụ:

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

Tránh sử dụng getAvailableLocales() nó sẽ đưa bạn trở locale tốn thời gian của nó.

Nếu có thể hãy khám phá thêm tại LocaleUtils classLocale

+1

tôi nghĩ câu trả lời này phù hợp nhất, cảm ơn bạn rất nhiều !!! –

+1

+1 cho điều này đơn giản hơn 5 y.o. aswer ở trên. Cảm ơn bạn rất nhiều. Tôi nghĩ bạn có thể sử dụng điều này bất cứ khi nào bạn thích mà không cần quan tâm về số lượng lớn vòng lặp – poring91

+1

nhưng đó là org.apache.commons, tôi không muốn bao gồm nhiều libs hơn nữa – user3871754

Các vấn đề liên quan