2013-03-27 17 views
6

Moja aplikacja jest podawana ciągiem z zewnętrznego procesu, w którym każdy ciąg ma długość 2 lub 5 znaków i reprezentuje numer java.util.Locale. Na przykład:Jak zweryfikować i utworzyć instancję Java Locale z łańcuchów?

en-us

ko

Pierwszym przykładem jest ciąg 5-char gdzie "pl" jest kodem języka ISO i "nas" jest krajem ISO kod. Powinno to odpowiadać locale "en_US". Drugi przykład to tylko ciąg 2-znakowy, gdzie "ko" jest kodem języka ISO i powinien odpowiadać "ko_KR" (koreański) język.

Potrzebuję sposobu na pobranie tych ciągów znaków (odmiany 2 lub 5-znakowej), sprawdzenie poprawności (jako obsługiwanego języka Java Ustawienia regionalne), a następnie utworzenie z nim instancji Locale.

Chciałbym mieć nadzieję, że Locale przyszedł z taką walidację po wyjęciu z pudełka, ale niestety ten kod działa bez wyjątków wyrzucane:

Locale loc = new Locale("waawaaweewah", "greatsuccess"); 

// Prints: "waawaaweewah" 
System.out.println(loc.getDisplayLanguage()); 

Więc pytam, dał mi 2 stanowi, że te STRING zostanie podane do mnie, jak mogę:

  • Testuj ciąg (obie formy) i wyjątek dla ciągów odpowiadających nieistniejących lub nieobsługiwanych Java 6 locale; i
  • Utworzenie nowego locale z ciągu znaków? To pytanie ma zastosowanie do formularza 2-znakowego, w którym mogę mieć tylko "ko" i potrzebuję go mapować do lokalizacji "ko_KR", itp.

Z góry dziękuję!

+0

Co powiesz na "nowe ustawienia regionalne (język)" dla drugiego przypadku i "nowe ustawienia regionalne (język, kraj)" dla pierwszego przypadku, zakładając, że dzielisz dane wejściowe z łącznikiem i traktujesz tokeny 2-znakowe jako język i kraj? – asgs

Odpowiedz

6

Locale.getISOCountries() i Locale.getISOLanguages()

zwróci listę wszystkich krajów i języków kodów 2-literowych zdefiniowane w ISO 3166 i ISO 639 odpowiednio i mogą być wykorzystane do tworzenia Locales.

Możesz użyć tego do sprawdzenia poprawności danych wejściowych.

1

Masz dwie opcje,

  1. korzystać z biblioteki dla tej commons-lang ma klasę LocaleUtils który ma sposobu, który można analizować na String do Locale.
  2. Podczas swojej własnej metody, walidację tutaj nie jest trywialne, jak istnieje wiele różnych zestawów kodów krajów, że ważny dla Locale - patrz punkt wyjścia javadoc

byłoby podzielić String i przełączyć się na szereg elementów:

public static Locale parseLocale(final String locale) { 
    final String[] localeArr = locale.split("_"); 
    switch (localeArr.length) { 
     case 1: 
      return new Locale(localeArr[0]); 
     case 2: 
      return new Locale(localeArr[0], localeArr[1]); 
     case 3: 
      return new Locale(localeArr[0], localeArr[1], localeArr[2]); 
     default: 
      throw new IllegalArgumentException("Invalid locale format;"); 
    } 
} 

Przypuszczalnie trzeba by uzyskać listę wszystkich poprawnych kodów krajów i języków i porównać elementy w String[] do poprawnych wartości przed wywołaniem konstruktora.

Powiązane problemy