Czy istnieje zgrabny sposób na pobranie instancji Locale z jej „nazwy programowej” zwróconej przez toString()
metodę Locale ? Oczywistym i brzydkim rozwiązaniem byłoby przeanalizowanie ciągu znaków, a następnie skonstruowanie nowej instancji Locale zgodnie z tym, ale może jest na to lepszy sposób / gotowe rozwiązanie?
Potrzeba jest taka, że chcę przechowywać pewne ustawienia regionalne w bazie danych SQL, w tym same ustawienia regionalne, ale byłoby brzydko umieszczać tam zserializowane obiekty Locale. Wolałbym raczej przechowywać ich reprezentacje String, które wydają się być dość szczegółowe w szczegółach.
Metoda zwracająca locale z stringa istnieje w bibliotece commons-lang:
LocaleUtils.toLocale(localeAsString)
źródło
-
między częściami lokalnymi, masz do czynienia ze znacznikiem IETF BCP 47, jeśli używasz Java 7, możesz użyćLocale.forLanguageTag
Od wersji Java 7 istnieje metoda fabryczna
Locale.forLanguageTag
i metoda instancjiLocale.toLanguageTag
wykorzystująca znaczniki języka IETF .źródło
Locale.forLanguageTag
działa z łańcuchami ustawień regionalnych IETF (tj.en-US
) I nie działa z ciągami ustawień regionalnych ISO (tj.en_US
)Java zapewnia wiele rzeczy przy prawidłowej implementacji, dzięki czemu można uniknąć wielu złożoności. Zwraca ms_MY .
Apache Commons musi
LocaleUtils
pomóc przeanalizować reprezentację ciągu. To zwróci en_USMożesz także użyć konstruktorów ustawień regionalnych.
Sprawdź to LocaleUtils i to Locale, aby poznać więcej metod.
źródło
Opcja 1 :
Opcja 2 :
Pamiętaj, że opcja 1 to „podkreślenie” między językiem a krajem, a opcja 2 to „myślnik”.
źródło
Ta odpowiedź może być trochę spóźniona, ale okazuje się, że analiza ciągu nie jest tak brzydka, jak zakładał OP. Wydało mi się to dość proste i zwięzłe:
Przetestowałem to (na Javie 7) ze wszystkimi przykładami podanymi w dokumentacji Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java ”i„ th_TH_TH_ # u-nu-thai ”.
WAŻNA AKTUALIZACJA : Nie jest to zalecane do użytku w Javie 7+ zgodnie z dokumentacją :
Zamiast tego użyj Locale.forLanguageTag i Locale.toLanguageTag lub, jeśli musisz, Locale.Builder.
źródło
Locale.forLanguageTag
stosuje się tylko do języka znaczników kodowanych, jak wskazano w IETF BCP 47, z łącznikiem (-
), nie podkreślenia (_
), jak w zwrocieLocale
„stoString
metodyLocale
s nie powinny być przechowywane w ichtoString
formie, ale wtoLanguageTag
formie, którą można zamienić z powrotem naLocale
łatwiejszą i dokładniejszą.Jeśli korzystasz z Spring Framework w swoim projekcie, możesz również użyć:
Dokumentacja :
źródło
Locale#toString()
- idealnie! :)Stare pytanie z wieloma odpowiedziami, ale oto więcej rozwiązań:
źródło
Wydaje się, że nie ma na to statycznej
valueOf
metody, co jest nieco zaskakujące.Jednym raczej brzydkim, ale prostym sposobem byłoby powtórzenie
Locale.getAvailableLocales()
i porównanie ichtoString
wartości z wartością.Niezbyt ładne, ale nie jest wymagane analizowanie ciągu. Możesz wstępnie wypełnić
Map
ciągi znaków na lokalizacje i wyszukać łańcuch bazy danych w tej mapie.źródło
Locale
instancje reprezentują tylko niewielki podzbiór prawidłowych ustawień regionalnych. To wcale nie jest kompletne.Możesz tego użyć na Androidzie. U mnie działa dobrze.
źródło
Cóż, chciałbym przechowywać zamiast konkatenacji ciąg
Locale.getISO3Language()
,getISO3Country()
i getVariant () jako klucz, który pozwoliłby mnie do ostatniego wywołaniaLocale(String language, String country, String variant)
konstruktora.w rzeczywistości poleganie na displayLanguage implikuje użycie języka locale do jego wyświetlenia, co czyni go zależnym od locale, w przeciwieństwie do kodu języka ISO.
Na przykład klucz en locale mógłby być przechowywany jako
i tak dalej ...
źródło
Ponieważ właśnie to zaimplementowałem:
W
Groovy
/Grails
to byłoby:źródło