¿Existe una forma ordenada de obtener una instancia de Locale a partir de su "nombre programático" como lo devuelve el toString()método de Locale ? Una solución obvia y fea sería analizar la Cadena y luego construir una nueva instancia de Locale de acuerdo con eso, pero ¿tal vez haya una mejor manera / solución lista para eso?
La necesidad es que quiero almacenar algunas configuraciones específicas de la configuración regional en una base de datos SQL, incluidas las configuraciones regionales, pero sería feo colocar allí objetos de configuración regional serializados. Preferiría almacenar sus representaciones de cadenas, que parecen ser bastante adecuadas en detalle.

El método que devuelve la configuración regional de la cadena existe en la biblioteca commons-lang:
LocaleUtils.toLocale(localeAsString)fuente
-entre las partes de la configuración regional que está tratando con una etiqueta de IETF BCP 47, si está utilizando Java 7 se pueden utilizarLocale.forLanguageTagDesde Java 7, existe un método de fábrica
Locale.forLanguageTagy un método de instancia queLocale.toLanguageTagutiliza etiquetas de lenguaje IETF .fuente
Locale.forLanguageTagfunciona con cadenas de configuración regional IETF (es deciren-US) y no funciona con cadenas de configuración regional ISO (es deciren_US)Java proporciona muchas cosas con una implementación adecuada y se puede evitar mucha complejidad. Esto devuelve ms_MY .
Apache Commons tiene
LocaleUtilsque ayudar a analizar una representación de cadena. Esto devolverá en_USTambién puede utilizar constructores de configuración regional.
Consulte este LocaleUtils y este Locale para explorar más métodos.
fuente
Opción 1 :
Opcion 2 :
Tenga en cuenta que la opción 1 es "guión bajo" entre el idioma y el país, y la opción 2 es "guión".
fuente
Esta respuesta puede llegar un poco tarde, pero resulta que analizar la cadena no es tan feo como suponía el OP. Lo encontré bastante simple y conciso:
Probé esto (en Java 7) con todos los ejemplos dados en la documentación de Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java "y" th_TH_TH_ # u-nu-thai ".
ACTUALIZACIÓN IMPORTANTE : No se recomienda su uso en Java 7+ de acuerdo con la documentación :
En su lugar, use Locale.forLanguageTag y Locale.toLanguageTag, o si debe hacerlo, Locale.Builder.
fuente
Locale.forLanguageTagaplica solo para las etiquetas de idioma codificadas como se indica en el BCP 47 de IETF, con un guión (-), no un guión bajo (_) como en el método de retorno deLocale'toStringLocalelos mensajes de correo electrónico no deben almacenarse en sutoStringforma, sino en sutoLanguageTagforma, que es convertible de nuevo a una formaLocalemás fácil y precisa.Si está usando Spring Framework en su proyecto, también puede usar:
Documentación :
fuente
Locale#toString(): ¡perfecto! :)Antigua pregunta con muchas respuestas, pero aquí hay más soluciones:
fuente
No parece haber un
valueOfmétodo estático para esto, lo cual es un poco sorprendente.Una forma bastante fea, pero simple, sería iterar
Locale.getAvailableLocales(), comparando sustoStringvalores con el tuyo.No es muy agradable, pero no se requiere análisis de cadenas. Puede rellenar previamente una
Mapde las cadenas a las configuraciones regionales y buscar la cadena de su base de datos en ese mapa.fuente
Localeinstancias predefinidas representan solo un subconjunto muy pequeño de configuraciones regionales válidas. De ninguna manera está completo.Puedes usar esto en Android. Funciona bien para mi.
fuente
Bueno, almacenaría en su lugar una concatenación de cadenas de
Locale.getISO3Language(),getISO3Country()y getVariant () como clave, lo que me permitiría llamar alLocale(String language, String country, String variant)constructor.de hecho, confiar en displayLanguage implica usar el idioma de la configuración regional para mostrarlo, lo que lo hace dependiente de la configuración regional, al contrario del código de idioma iso.
Como ejemplo, la clave en locale sería almacenable como
y así ...
fuente
Porque lo acabo de implementar:
En
Groovy/Grailssería:fuente