Apakah ada cara yang rapi untuk mendapatkan instance Lokal dari "nama programatik" -nya seperti yang dikembalikan oleh toString()
metode Locale ? Solusi yang jelas dan jelek akan mengurai String dan kemudian membuat instance Lokal baru sesuai dengan itu, tetapi mungkin ada cara / solusi yang lebih baik untuk itu?
Kebutuhannya adalah bahwa saya ingin menyimpan beberapa pengaturan khusus lokal dalam database SQL, termasuk Lokal itu sendiri, tetapi akan jelek untuk meletakkan objek Lokal berseri di sana. Saya lebih suka menyimpan representasi String mereka, yang tampaknya cukup memadai secara detail.
Metode yang mengembalikan lokal dari string ada di perpustakaan commons-lang:
LocaleUtils.toLocale(localeAsString)
sumber
-
antara bagian lokal, Anda berurusan dengan tag IETF BCP 47, jika Anda menggunakan Java 7 Anda dapat menggunakanLocale.forLanguageTag
Sejak Java 7 ada metode pabrik
Locale.forLanguageTag
dan metode contohLocale.toLanguageTag
menggunakan tag bahasa IETF .sumber
Locale.forLanguageTag
bekerja dengan string lokal IETF (yaituen-US
) dan tidak bekerja dengan string lokal ISO (yaituen_US
)Java menyediakan banyak hal dengan implementasi yang tepat sehingga banyak kerumitan dapat dihindari. Ini mengembalikan ms_MY .
Apache Commons harus
LocaleUtils
membantu mengurai representasi string. Ini akan mengembalikan en_USAnda juga dapat menggunakan konstruktor lokal.
Silakan periksa LocaleUtils ini dan Lokal ini untuk menjelajahi lebih banyak metode.
sumber
Pilihan 1 :
Pilihan 2 :
Harap diperhatikan Opsi 1 adalah "garis bawah" antara bahasa dan negara, dan Opsi 2 adalah "tanda hubung".
sumber
Jawaban ini mungkin sedikit terlambat, tapi ternyata mengurai string tidak seburuk yang diasumsikan OP. Saya merasa cukup sederhana dan ringkas:
Saya menguji ini (di Java 7) dengan semua contoh yang diberikan dalam dokumentasi Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java ", dan" th_TH_TH_ # u-nu-thai ".
PEMBARUAN PENTING : Ini tidak disarankan untuk digunakan di Java 7+ menurut dokumentasi :
Gunakan Locale.forLanguageTag dan Locale.toLanguageTag sebagai gantinya, atau jika Anda harus, Locale.Builder.
sumber
Locale.forLanguageTag
hanya berlaku untuk tag bahasa dikodekan seperti yang ditunjukkan dalam IETF BCP 47, dengan tanda hubung (-
), bukan garis bawah (_
) seperti pada kembalinyaLocale
'stoString
metodeLocale
s tidak boleh disimpan dalamtoString
bentuknya, tetapi dalamtoLanguageTag
bentuknya, yang dapat diubah kembali menjadiLocale
lebih mudah dan akurat.Jika Anda menggunakan kerangka Spring dalam proyek Anda, Anda juga dapat menggunakan:
Dokumentasi :
sumber
Locale#toString()
- sempurna! :)Pertanyaan lama dengan banyak jawaban, tetapi berikut lebih banyak solusi:
sumber
Sepertinya tidak ada
valueOf
metode statis untuk ini, yang agak mengejutkan.Salah satu cara yang agak jelek, tetapi sederhana, adalah mengulangi
Locale.getAvailableLocales()
, membandingkantoString
nilai - nilai mereka dengan nilai Anda.Tidak terlalu bagus, tetapi tidak diperlukan penguraian string. Anda bisa mengisi
Map
string ke lokal, dan mencari string database Anda di peta itu.sumber
Locale
mewakili subset lokal yang valid. Itu belum lengkap.Anda dapat menggunakan ini di Android. Bekerja dengan baik untuk saya.
sumber
Nah, saya akan menyimpan sebagai gantinya rangkaian string
Locale.getISO3Language()
,getISO3Country()
dan getVariant () sebagai kunci, yang akan memungkinkan saya untuk memanggilLocale(String language, String country, String variant)
konstruktor.memang, mengandalkan displayLanguage berarti menggunakan bahasa lokal untuk menampilkannya, yang membuatnya bergantung pada lokal, berlawanan dengan kode bahasa iso.
Sebagai contoh, kunci en locale dapat disimpan sebagai
dan seterusnya ...
sumber
Karena saya baru saja menerapkannya:
Dalam
Groovy
/Grails
itu akan menjadi:sumber