¿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.forLanguageTag
Desde Java 7, existe un método de fábrica
Locale.forLanguageTag
y un método de instancia queLocale.toLanguageTag
utiliza etiquetas de lenguaje IETF .fuente
Locale.forLanguageTag
funciona 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
LocaleUtils
que 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.forLanguageTag
aplica 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
'toString
Locale
los mensajes de correo electrónico no deben almacenarse en sutoString
forma, sino en sutoLanguageTag
forma, que es convertible de nuevo a una formaLocale
má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
valueOf
método estático para esto, lo cual es un poco sorprendente.Una forma bastante fea, pero simple, sería iterar
Locale.getAvailableLocales()
, comparando sustoString
valores con el tuyo.No es muy agradable, pero no se requiere análisis de cadenas. Puede rellenar previamente una
Map
de las cadenas a las configuraciones regionales y buscar la cadena de su base de datos en ese mapa.fuente
Locale
instancias 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
/Grails
sería:fuente