Gibt es eine gute Möglichkeit, eine Locale- Instanz aus ihrem von Locale zurückgegebenen "programmatischen Namen" zu ermitteln?toString()
Methode zurückgegeben wird? Eine offensichtliche und hässliche Lösung wäre, den String zu analysieren und dann eine neue Locale-Instanz danach zu erstellen, aber vielleicht gibt es dafür einen besseren Weg / eine bessere Lösung?
Die Notwendigkeit besteht darin, dass ich einige länderspezifische Einstellungen in einer SQL-Datenbank speichern möchte, einschließlich der Gebietsschemas selbst, aber es wäre hässlich, dort serialisierte Gebietsschemaobjekte abzulegen. Ich würde lieber ihre String-Darstellungen speichern, die im Detail völlig angemessen erscheinen.
In der commons-lang-Bibliothek ist eine Methode vorhanden, die das Gebietsschema von der Zeichenfolge zurückgibt:
LocaleUtils.toLocale(localeAsString)
quelle
-
zwischen Gebietsschema-Teilen haben, haben Sie es mit einem IETF BCP 47-Tag zu tun. Wenn Sie Java 7 verwenden, können Sie verwendenLocale.forLanguageTag
Seit Java 7 gibt es eine Factory-Methode
Locale.forLanguageTag
und eine Instanzmethode,Locale.toLanguageTag
die IETF-Sprach-Tags verwenden .quelle
Locale.forLanguageTag
IETF-Gebietsschema-Zeichenfolgen (dhen-US
) funktionieren und nicht mit ISO-Gebietsschema-Zeichenfolgen (dhen_US
) funktionierenJava bietet viele Dinge mit der richtigen Implementierung. Viel Komplexität kann vermieden werden. Dies gibt ms_MY zurück .
Apache Commons muss
LocaleUtils
dabei helfen, eine Zeichenfolgendarstellung zu analysieren. Dies gibt en_US zurückSie können auch Gebietsschemakonstruktoren verwenden.
Bitte überprüfen Sie diese LocaleUtils und dieses Gebietsschema , um weitere Methoden zu erkunden.
quelle
Option 1 :
Option 2 :
Bitte beachten Sie, dass Option 1 zwischen Sprache und Land "unterstreicht" und Option 2 "Bindestrich" ist.
quelle
Diese Antwort mag etwas spät sein, aber es stellt sich heraus, dass das Parsen der Zeichenfolge nicht so hässlich ist, wie das OP angenommen hat. Ich fand es ganz einfach und prägnant:
Ich habe dies (unter Java 7) mit allen Beispielen getestet, die in der Dokumentation zu Locale.toString () angegeben sind: "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_" # Hant-x-java "und" th_TH_TH_ # u-nu-thai ".
WICHTIGES UPDATE : Dies wird laut Dokumentation für die Verwendung in Java 7+ nicht empfohlen :
Verwenden Sie stattdessen Locale.forLanguageTag und Locale.toLanguageTag oder, falls erforderlich, Locale.Builder.
quelle
Locale.forLanguageTag
gilt nur für Sprachtags , wie in IETF BCP 47, mit einem Bindestrich (angegeben codiert-
), nicht ein Unterstrich (_
) , wie in der Rückkehr vonLocale
‚stoString
VerfahrenLocale
s in Zukunft nicht in ihrertoString
Form gespeichert werden sollten , sondern in ihrertoLanguageTag
Form, dieLocale
einfacher und genauer wieder in eine konvertierbar ist .Wenn Sie Spring Framework in Ihrem Projekt verwenden, können Sie auch Folgendes verwenden:
Dokumentation :
quelle
Locale#toString()
- perfekt ist! :)Alte Frage mit vielen Antworten, aber hier sind weitere Lösungen:
quelle
Es scheint keine statische
valueOf
Methode dafür zu geben, was ein bisschen überraschend ist.Ein ziemlich hässlicher, aber einfacher Weg wäre, zu iterieren
Locale.getAvailableLocales()
und ihretoString
Werte mit Ihrem Wert zu vergleichen.Nicht sehr schön, aber kein String-Parsing erforderlich. Sie können eine
Map
Zeichenfolge in Gebietsschemas vorab ausfüllen und Ihre Datenbankzeichenfolge in dieser Zuordnung nachschlagen.quelle
Locale
Instanzen stellen nur eine sehr kleine Teilmenge gültiger Gebietsschemas dar. Es ist keineswegs vollständig.Sie können dies auf Android verwenden. Funktioniert gut für mich.
quelle
Nun, ich würde speichern , anstatt eine Zeichenfolge Verkettung
Locale.getISO3Language()
,getISO3Country()
und getVariant () als Schlüssel, der mich zu letzteren Anruf erlauben würdeLocale(String language, String country, String variant)
Konstruktor.Wenn Sie sich auf displayLanguage verlassen, müssen Sie für die Anzeige die Sprache des Gebietsschemas verwenden, wodurch das Gebietsschema im Gegensatz zum ISO-Sprachcode abhängig wird.
Als Beispiel wäre ein Gebietsschema-Schlüssel als speicherbar
und so weiter ...
quelle
Weil ich es gerade implementiert habe:
In
Groovy
/Grails
es wäre:quelle