Existe-t-il un moyen efficace d'obtenir une instance de Locale à partir de son "nom programmatique" tel que renvoyé par la toString()
méthode de Locale ? Une solution évidente et laide serait d'analyser la chaîne, puis de construire une nouvelle instance de Locale en fonction de cela, mais peut-être y a-t-il un meilleur moyen / solution prête pour cela?
Le besoin est que je veuille stocker certains paramètres spécifiques aux paramètres régionaux dans une base de données SQL, y compris les paramètres régionaux eux-mêmes, mais il serait moche d'y mettre des objets régionaux sérialisés. Je préférerais stocker leurs représentations String, qui semblent assez détaillées dans le détail.
La méthode qui renvoie les paramètres régionaux à partir de la chaîne existe dans la bibliothèque commons-lang:
LocaleUtils.toLocale(localeAsString)
la source
-
entre les parties locales, vous avez affaire à une balise IETF BCP 47, si vous utilisez Java 7, vous pouvez l'utiliserLocale.forLanguageTag
Depuis Java 7, il existe une méthode d'usine
Locale.forLanguageTag
et une méthode d'instanceLocale.toLanguageTag
utilisant des balises de langage IETF .la source
Locale.forLanguageTag
fonctionne les chaînes locales IETF (ieen-US
) et ne fonctionne pas avec les chaînes locales ISO (ieen_US
)Java fournit beaucoup de choses avec une implémentation appropriée, beaucoup de complexité peut être évitée. Cela renvoie ms_MY .
Apache Commons doit
LocaleUtils
aider à analyser une représentation sous forme de chaîne. Cela renverra en_USVous pouvez également utiliser des constructeurs de paramètres régionaux.
Veuillez vérifier ce LocaleUtils et ce Locale pour explorer plus de méthodes.
la source
Option 1 :
Option 2 :
Veuillez noter que l' option 1 est un «trait de soulignement» entre la langue et le pays, et l' option 2 est un «tiret».
la source
Cette réponse est peut-être un peu tardive, mais il s'avère que l'analyse de la chaîne n'est pas aussi moche que l'OP l'a supposé. Je l'ai trouvé assez simple et concis:
J'ai testé ceci (sur Java 7) avec tous les exemples donnés dans la documentation Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java "et" th_TH_TH_ # u-nu-thai ".
MISE À JOUR IMPORTANTE : Ceci n'est pas recommandé pour une utilisation dans Java 7+ selon la documentation :
Utilisez plutôt Locale.forLanguageTag et Locale.toLanguageTag, ou si vous devez le faire, Locale.Builder.
la source
Locale.forLanguageTag
s'applique uniquement aux balises de langue encodées comme indiqué dans le BCP 47 de l'IETF, avec un tiret (-
), pas un trait de soulignement (_
) comme dans le retour deLocale
latoString
méthode deLocale
s ne devraient pas être stockés sous leurtoString
forme, mais sous leurtoLanguageTag
forme, qui est convertible en une formeLocale
plus facile et plus précise.Si vous utilisez Spring Framework dans votre projet, vous pouvez également utiliser:
Documentation :
la source
Locale#toString()
- parfait! :)Ancienne question avec beaucoup de réponses, mais voici d'autres solutions:
la source
Il ne semble pas y avoir de
valueOf
méthode statique pour cela, ce qui est un peu surprenant.Une manière plutôt moche, mais simple, serait de répéter
Locale.getAvailableLocales()
, de comparer leurstoString
valeurs avec votre valeur.Pas très agréable, mais aucune analyse de chaîne n'est requise. Vous pouvez pré-remplir une
Map
des chaînes de paramètres régionaux et rechercher votre chaîne de base de données dans cette carte.la source
Locale
instances prédéfinies ne représentent qu'un très petit sous-ensemble de paramètres régionaux valides. Ce n'est en aucun cas complet.Vous pouvez l'utiliser sur Android. Fonctionne bien pour moi.
la source
Eh bien, je stockerais à la place une concaténation de chaînes de
Locale.getISO3Language()
,getISO3Country()
et getVariant () comme clé, ce qui me permettrait d'appeler plus tard leLocale(String language, String country, String variant)
constructeur.en effet, s'appuyer sur displayLanguage implique d'utiliser le langage de la locale pour l'afficher, ce qui la rend dépendante de la locale, contrairement au code de langue iso.
À titre d'exemple, la clé de locale serait stockable comme
etc ...
la source
Parce que je viens de l'implémenter:
Dans
Groovy
/Grails
ce serait:la source