default()é uma aposta bastante segura, mas não a utilize para processamento (como dizem os documentos).
A - C
@ A - C usá-lo para processamento?
CQM
Sim, veja o que dizem os documentos : alguns códigos de idioma usarão ',' como ponto decimal e '.' para agrupamento de dígitos. então coisas como parseInt () podem falhar. Observe que eles ainda recomendam o uso default(), mas não para coisas que podem quebrar o código.
A - C
Respostas:
487
O padrão Localeé construído estaticamente em tempo de execução para o processo do aplicativo a partir das configurações de propriedade do sistema, portanto, ele representará o Localeselecionado nesse dispositivo quando o aplicativo foi iniciado . Normalmente, isso é bom, mas significa que, se o usuário alterar suas Localeconfigurações após a execução do processo do aplicativo, o valor de getDefaultLocale()provavelmente não será atualizado imediatamente.
Se você precisar interceptar eventos como esse por algum motivo em seu aplicativo, tente obter o Localedisponível no Configurationobjeto de recurso , por exemplo
Locale current = getResources().getConfiguration().locale;
Você pode achar que esse valor é atualizado mais rapidamente após uma alteração nas configurações, se necessário para o seu aplicativo.
Alguém verificou se o código de idioma padrão não é alterado no aplicativo quando você o altera no sistema? Eu acho que é uma daquelas "alterações de configuração" que fazem atividades destruído e recriado
Michał K
11
Eu testei, produzindo os dois enquanto continuava alterando a localidade; O resultado é que a saída é a mesma. Portanto, Locale.getDefault () pode ser usado com segurança, pois é atualizado imediatamente. Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
Alessio
58
Isso foi preterido na classe Configuração, consulte os documentos mais recentes para este conselho:locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
MrBigglesworth
7
por que eles simplesmente não adicionam um método getFirstLocale () para evitar esse estranho getLocales (). get (0)?
user3290180
1
E se você deseja oferecer suporte a versões mais antigas e mais recentes da API?
Ivan
179
Atualização do Android N (Api nível 24) (sem avisos):
Existe algo na biblioteca de suporte para evitar o if-else?
Federico Ponzi
8
@TargetApi (Build.VERSION_CODES.N) não é necessário em seu código se você incluir o caso e fallback código
Patrick Favre
@FedericoPonzi no ResourceCompat parece não ter um método para localidade a partir de 25.0.1
Patrick Favre
2
Isso pode não funcionar se o usuário tiver vários idiomas instalados. Você deve usar, LocaleList.getDefault().get(0);pois isso retornará as localidades classificadas pelo idioma preferido.
Encaracolado
21
@FedericoPonzi @ for3st Encontrei isso em ConfigurationCompat, comoConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
yuval
63
Se você estiver usando a Biblioteca de Suporte do Android, poderá usar ConfigurationCompato método do @ Makalele para se livrar dos avisos de descontinuação:
Locale current =ConfigurationCompat.getLocales(getResources().getConfiguration()).get(0);
ou em Kotlin:
val currentLocale =ConfigurationCompat.getLocales(resources.configuration)[0]
esta resposta está errada, obtém um código de idioma padrão, mas se o usuário o alterou em tempo real, ele mostra errado. A próxima resposta está correta
user170317
concordou, resposta errada. No meu caso, estava procurando uma maneira de não precisar usar getResources (), o que significa que preciso de um contexto. Meu problema era uma classe auxiliar que não tinha um contexto, mas acho que vou ter que passar adiante. Se você tiver um aplicativo que permita que as pessoas alterem sua localidade e que tenham as sequências de visualizações, os formatos de número, etc. você precisa usar a resposta de Devunwired
1mike12
Trabalhe para mim. Se eu definir um ponto de interrupção Locale.setDefault(), ele começa é chamado quando eu mudar o idioma do dispositivo, pelo menos, de volta ao Android 5.0 (que é tão longe como eu testei)
cambunctious
6
Todas as respostas acima - não funcionam. Então eu vou colocar aqui uma função que funciona no android 4 e 9
Uma das poucas respostas que retorna a direção de idioma preferida do usuário no nível do dispositivo. Você também pode usar LocaleListCompat.getDefault()se usar o AndroidX.
default()
é uma aposta bastante segura, mas não a utilize para processamento (como dizem os documentos).default()
, mas não para coisas que podem quebrar o código.Respostas:
O padrão
Locale
é construído estaticamente em tempo de execução para o processo do aplicativo a partir das configurações de propriedade do sistema, portanto, ele representará oLocale
selecionado nesse dispositivo quando o aplicativo foi iniciado . Normalmente, isso é bom, mas significa que, se o usuário alterar suasLocale
configurações após a execução do processo do aplicativo, o valor degetDefaultLocale()
provavelmente não será atualizado imediatamente.Se você precisar interceptar eventos como esse por algum motivo em seu aplicativo, tente obter o
Locale
disponível noConfiguration
objeto de recurso , por exemploVocê pode achar que esse valor é atualizado mais rapidamente após uma alteração nas configurações, se necessário para o seu aplicativo.
fonte
Log.d("localeChange", "Default locale lang: " + Locale.getDefault().getLanguage()); Log.d("localeChange", "Config locale lang: " + getResources().getConfiguration().locale.getLanguage());
locale This field was deprecated in API level 24. Do not set or read this directly. Use getLocales() and setLocales(LocaleList). If only the primary locale is needed, getLocales().get(0) is now the preferred accessor.
Atualização do Android N (Api nível 24) (sem avisos):
fonte
LocaleList.getDefault().get(0);
pois isso retornará as localidades classificadas pelo idioma preferido.ConfigurationCompat
, comoConfigurationCompat.getLocales(getResources().getConfiguration()).get(0)
Se você estiver usando a Biblioteca de Suporte do Android, poderá usar
ConfigurationCompat
o método do @ Makalele para se livrar dos avisos de descontinuação:ou em Kotlin:
fonte
ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration()).get(0);
Da
getDefault
documentação:Também a partir dos
Locale
documentos:Parece que você deveria usá-lo.
fonte
Locale.setDefault()
, ele começa é chamado quando eu mudar o idioma do dispositivo, pelo menos, de volta ao Android 5.0 (que é tão longe como eu testei)Todas as respostas acima - não funcionam. Então eu vou colocar aqui uma função que funciona no android 4 e 9
fonte
LocaleListCompat.getDefault()
se usar o AndroidX.Eu usei isso:
fonte
De acordo com a documentação oficial , o ConfigurationCompat foi descontinuado nas bibliotecas de suporte
Você pode considerar usar
LocaleListCompat.getDefault()[0].toLanguageTag()
A posição 0 será o local preferido do usuárioPara obter a localidade padrão na posição 0, seria
LocaleListCompat.getAdjustedDefault()
fonte