Есть ли удобный способ получить экземпляр Locale из его «программного имени», возвращенного методом Locale toString()
? Очевидным и уродливым решением было бы проанализировать String и затем построить новый экземпляр Locale в соответствии с этим, но, может быть, для этого есть лучший способ / готовое решение?
Я хочу сохранить в базе данных SQL некоторые специфические для локали настройки, включая сами локали, но было бы некрасиво помещать туда сериализованные объекты локали. Я бы предпочел сохранить их строковые представления, которые кажутся достаточно подробными.
Метод, который возвращает язык из строки, существует в библиотеке commons-lang:
LocaleUtils.toLocale(localeAsString)
источник
-
между частями локали, вы имеете дело с тегом IETF BCP 47, если вы используете Java 7, вы можете использоватьLocale.forLanguageTag
Начиная с Java 7, существует фабричный метод
Locale.forLanguageTag
и метод экземпляра,Locale.toLanguageTag
использующие языковые теги IETF .источник
Locale.forLanguageTag
работает со строками языкового стандарта IETF (т.е.en-US
) и не работает со строками языкового стандарта ISO (напримерen_US
)Java предоставляет множество вещей, при правильной реализации можно избежать многих сложностей. Это возвращает ms_MY .
Apache Commons должен
LocaleUtils
помочь разобрать строковое представление. Это вернет en_USВы также можете использовать конструкторы локали.
Пожалуйста, проверьте эти LocaleUtils и этот Locale, чтобы изучить другие методы.
источник
Опция 1 :
Вариант 2:
Обратите внимание, что в Варианте 1 между языком и страной используется «подчеркивание», а в Варианте 2 - «тире».
источник
Этот ответ может быть немного запоздалым, но оказывается, что анализ строки не так уродлив, как предполагал OP. Мне это показалось довольно простым и лаконичным:
Я тестировал это (на Java 7) со всеми примерами, приведенными в документации Locale.toString (): «en», «de_DE», «_GB», «en_US_WIN», «de__POSIX», «zh_CN_ # Hans», «zh_TW_» # Hant-x-java "и" th_TH_TH_ # u-nu-thai ".
ВАЖНОЕ ОБНОВЛЕНИЕ : не рекомендуется использовать в Java 7+ согласно документации :
Вместо этого используйте Locale.forLanguageTag и Locale.toLanguageTag или, если необходимо, Locale.Builder.
источник
Locale.forLanguageTag
применяется только для языковых тегов, закодированных, как указано в BCP 47 IETF, с дефисом (-
), а не подчеркиванием (_
), как в return ofLocale
'stoString
methodLocale
s следует хранить не в ихtoString
форме, а в ихtoLanguageTag
форме, которая может быть преобразована обратно вLocale
более легкую и точную.Если вы используете Spring framework в своем проекте, вы также можете использовать:
Документация :
источник
Locale#toString()
- идеально! :)Старый вопрос с множеством ответов, но вот и другие решения:
источник
Кажется, что для этого не существует статического
valueOf
метода, что немного удивительно.Один довольно уродливый, но простой способ - это перебрать
Locale.getAvailableLocales()
, сравнивая ихtoString
значения с вашим значением.Не очень хорошо, но синтаксический анализ строк не требуется. Вы можете предварительно заполнить
Map
строку из строк в локали и найти строку своей базы данных на этой карте.источник
Locale
экземпляры представляют только очень небольшое подмножество допустимых локалей. Это ни в коем случае не полное.Вы можете использовать это на Android. У меня отлично работает.
источник
Ну, я бы хранить вместо строковой конкатенации
Locale.getISO3Language()
,getISO3Country()
и getVariant () в качестве ключа, который позволил бы мне последним вызовуLocale(String language, String country, String variant)
конструктора.действительно, использование displayLanguage подразумевает использование языка локали для его отображения, что делает его зависимым от локали, в отличие от кода языка ISO.
Например, ключ локали можно сохранить как
и так далее ...
источник
Потому что я только что его реализовал:
В
Groovy
/Grails
это будет:источник