Existe uma maneira simples de obter uma instância do Locale a partir de seu "nome programático" conforme retornado pelo toString()
método do Locale ? Uma solução óbvia e feia seria analisar a String e, em seguida, construir uma nova instância Locale de acordo com isso, mas talvez haja uma maneira / solução pronta melhor para isso?
A necessidade é que eu queira armazenar algumas configurações específicas do local em um banco de dados SQL, incluindo os próprios locais, mas seria feio colocar objetos Locale serializados lá. Prefiro armazenar suas representações de String, que parecem ser bastante adequadas em detalhes.
Método que retorna a localidade da string existente na biblioteca commons-lang:
LocaleUtils.toLocale(localeAsString)
fonte
-
entre as partes do local, você está lidando com uma tag IETF BCP 47, se estiver usando Java 7, você pode usarLocale.forLanguageTag
Desde o Java 7, há o método de fábrica
Locale.forLanguageTag
e o método de instânciaLocale.toLanguageTag
usando tags de linguagem IETF .fonte
Locale.forLanguageTag
funciona com strings de localidade IETF (isto éen-US
) e não funciona com strings de localidade ISO (isto éen_US
)Java fornece muitas coisas com implementação adequada, muita complexidade pode ser evitada. Isso retorna ms_MY .
O Apache Commons tem
LocaleUtils
que ajudar a analisar uma representação de string. Isso retornará en_USVocê também pode usar construtores de localidade.
Verifique este LocaleUtils e este Locale para explorar mais métodos.
fonte
Opção 1 :
Opção 2 :
Observe que a Opção 1 é "sublinhado" entre o idioma e o país, e a Opção 2 é "traço".
fonte
Esta resposta pode demorar um pouco, mas descobri que analisar a string não é tão feio quanto o OP presumiu. Achei muito simples e conciso:
Eu testei isso (no Java 7) com todos os exemplos fornecidos na documentação Locale.toString (): "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "zh_CN_ # Hans", "zh_TW_ # Hant-x-java "e" th_TH_TH_ # u-nu-thai ".
ATUALIZAÇÃO IMPORTANTE : Não é recomendado para uso em Java 7+ de acordo com a documentação :
Use Locale.forLanguageTag e Locale.toLanguageTag em vez disso ou, se necessário, Locale.Builder.
fonte
Locale.forLanguageTag
aplica-se somente para tags de linguagem codificados como indicado no BCP do IETF 47, com um hífen (-
), não um sublinhado (_
) como no retorno deLocale
'stoString
métodoLocale
s não deveriam ser armazenados em suatoString
forma, mas em suatoLanguageTag
forma, que pode ser convertida de volta para uma formaLocale
mais fácil e precisa.Se você estiver usando o framework Spring em seu projeto, também pode usar:
Documentação :
fonte
Locale#toString()
- perfeito! :)Pergunta antiga com muitas respostas, mas aqui estão mais soluções:
fonte
Não parece haver um
valueOf
método estático para isso, o que é um pouco surpreendente.Uma maneira bastante feia, mas simples, seria repetir
Locale.getAvailableLocales()
, comparando seustoString
valores com o seu valor.Não é muito bom, mas nenhuma análise de string necessária. Você pode preencher previamente um
Map
Strings to Locales e procurar a string do banco de dados nesse mapa.fonte
Locale
instâncias predefinidas representam um subconjunto muito pequeno de apenas localidades válidas. Não está de forma alguma completo.Você pode usar isso no Android. Funciona bem para mim.
fonte
Bem, eu armazenaria em vez disso uma concatenação de string de
Locale.getISO3Language()
,getISO3Country()
e getVariant () como chave, o que me permitiria chamar oLocale(String language, String country, String variant)
construtor posteriormente .na verdade, confiar em displayLanguage implica em usar o idioma do locale para exibi-lo, o que o torna dependente do local, ao contrário do código de idioma iso.
Por exemplo, uma chave local seria armazenável como
e assim por diante ...
fonte
Porque acabei de implementá-lo:
Em
Groovy
/Grails
seria:fonte