Meu aplicativo suporta 3 (em breve 4) idiomas. Como vários códigos de idioma são bastante semelhantes, eu gostaria de dar ao usuário a opção de alterar o código de idioma no meu aplicativo, por exemplo, uma pessoa italiana pode preferir o espanhol ao inglês.
Existe uma maneira de o usuário selecionar entre os códigos de idioma disponíveis para o aplicativo e alterar o código de idioma usado? Não vejo problema em definir o código de idioma para cada Atividade, pois é uma tarefa simples executar em uma classe base.
android
locale
user-defined
Roland
fonte
fonte
Respostas:
Para as pessoas que ainda procuram essa resposta, como
configuration.locale
foi preterido na API 24, agora você pode usar:Leve em consideração que o minSkdVersion para esse método é a API 17.
Código de exemplo completo:
Não esqueça que, se você alterar o código do idioma com uma Atividade em execução, será necessário reiniciá-lo para que as alterações tenham efeito.
Edição 11 de maio de 2018
A partir da publicação de @ CookieMonster, você pode ter problemas para manter a alteração de localidade nas versões superiores da API. Nesse caso, adicione o seguinte código à sua Atividade Base para atualizar o código de idioma do contexto em cada criação de Atividade:
Se você usar isso, não se esqueça de salvar o idioma em SharedPreferences quando definir o código do idioma com
setLocate(locale)
EDITAR 7 DE ABRIL DE 2020
Você pode estar com problemas no Android 6 e 7, e isso ocorre devido a um problema nas bibliotecas do Androidx durante o manuseio do modo noturno. Para isso, você também precisará substituir
applyOverrideConfiguration
sua atividade base e atualizar o código de idioma da configuração, caso seja criado um novo código de idioma novo.Código de amostra:
fonte
androidx.appcompat:appcompat:
a versão de1.0.2
que1.1.0
não trabalha em android 7, mas que trabalha em andróide 9.1.1.0
androidxappcompat:1.1.0
pode ser corrigido comappcompat:1.2.0-alpha02
e códigoSet<Locale> set = new LinkedHashSet<>(); // bring the target locale to the front of the list set.add(locale); LocaleList all = LocaleList.getDefault(); for (int i = 0; i < all.size(); i++) { // append other locales supported by the user set.add(all.get(i)); } Locale[] locales = set.toArray(new Locale[0]); configuration.setLocales(new LocaleList(locales));
dentro@TargetApi(Build.VERSION_CODES.N) updateResourcesLocale()
Espero que esta ajuda (em onResume):
fonte
Ocorreu um problema ao definir o código de idioma de forma programática com dispositivos com o Android OS N e superior . Para mim, a solução foi escrever este código na minha atividade base:
(se você não tiver uma atividade básica, faça essas alterações em todas as suas atividades)
note que aqui não basta chamar
você também precisa obter o contexto que esse método retorna e, em seguida, definir esse contexto no
attachBaseContext
método.fonte
updateBaseContextLocale
método emonCreate
sua atividade principal / base.Como nenhuma resposta está completa para a maneira atual de resolver esse problema, tento dar instruções para uma solução completa. Comente se algo está faltando ou se pode ser melhorado.
Informação geral
Primeiro, existem algumas bibliotecas que desejam resolver o problema, mas todas parecem desatualizadas ou faltam alguns recursos:
Além disso, acho que escrever uma biblioteca pode não ser uma maneira boa / fácil de resolver esse problema, porque não há muito o que fazer, e o que precisa ser feito é mudar o código existente do que usar algo completamente dissociado. Portanto, eu compus as seguintes instruções que devem estar completas.
Minha solução é baseada principalmente em https://github.com/gunhansancar/ChangeLanguageExample (como já vinculado pelo localhost ). É o melhor código que encontrei para orientar. Algumas observações:
updateViews()
em cada Atividade para atualizar manualmente todas as seqüências de caracteres após alterar a localidade (usando o habitualgetString(id)
), o que não é necessário na abordagem mostrada abaixoMudei um pouco, dissociando a parte que persiste no código do idioma escolhido (como se pode fazer isso separadamente, conforme sugerido abaixo).
Solução
A solução consiste nas duas etapas a seguir:
Etapa 1: alterar a localidade
Use a classe
LocaleHelper
, com base no LocaleHelper de gunhansancar :ListPreference
em umPreferenceFragment
com os idiomas disponíveis (deve ser mantido quando os idiomas forem adicionados posteriormente)Crie
SettingsFragment
como o seguinte:Crie um recurso
locales.xml
listando todos os códigos de idioma com traduções disponíveis da seguinte maneira ( lista de códigos de código de idioma ):No seu,
PreferenceScreen
você pode usar a seção a seguir para permitir que o usuário selecione os idiomas disponíveis:que usa as seguintes seqüências de caracteres de
strings.xml
:Etapa 2: faça com que o aplicativo use a localidade personalizada
Agora configure cada atividade para usar o conjunto de localizações personalizadas. A maneira mais fácil de fazer isso é ter uma classe base comum para todas as atividades com o seguinte código (onde o código importante está
attachBaseContext(Context base)
eonResume()
):O que faz é
attachBaseContext(Context base)
para usar o código de idioma persistido anteriormente comLocaleHelper
Notas sobre esta solução
A recriação de uma atividade não atualiza o título da ActionBar (como já observado aqui: https://github.com/gunhansancar/ChangeLanguageExample/issues/1 ).
setTitle(R.string.mytitle)
noonCreate()
método de cada atividade.Ele permite que o usuário escolha o local padrão do sistema, bem como o local padrão do aplicativo (que pode ser nomeado, neste caso, "inglês").
fr-rCA
Até o momento, apenas códigos de idioma, nenhuma região (país) e códigos de variantes (como ) são suportados. Para oferecer suporte a especificações completas de código de idioma, pode ser usado um analisador semelhante ao da biblioteca de idiomas do Android (que suporta região, mas nenhum código de variante).fonte
attachBaseContext(Context base)
eonResume()
para uma classe separada) pode fazer o truque. Então, tudo o que você precisa fazer é declarar um objeto em cada classe base de atividades e delegar essas duas chamadas.Basta usar esse método auxiliar para forçar a localidade específica.
UDPATE 22 DE AGOSTO DE 2017. Melhor usar essa abordagem .
fonte
Adicione uma classe auxiliar com o seguinte método:
E chame-o em sua atividade de inicialização, como
MainActivity.java
:fonte
simples e fácil
onde "en" é o código do idioma e "US" é o código do país.
fonte
conf.locale=locale;
foi descontinuado e também éupdateConfiguration
.Válido para API16 a API28 Basta colocar este método em algum lugar:
Insira este código em todas as suas atividades usando:
ou chame localeUpdateResources em fragmentos, adaptadores etc. onde você precisar do novo contexto.
Créditos: Yaroslav Berezanskyi
fonte
Existe uma maneira super simples.
em Substituição BaseActivity, Activity ou Fragment attachBaseContext
extensão
fonte
Eu encontrei o
androidx.appcompat:appcompat:1.1.0
bug também pode ser corrigido simplesmente chamandogetResources()
emapplyOverrideConfiguration()
fonte
fonte
Para quem tentou de tudo, mas não está funcionando . Verifique se, se você definir
darkmode
comAppCompatDelegate.setDefaultNightMode
e o sistema não estiver escuro,Configuration.setLocale
não funcionará acima do Andorid 7.0 .Adicione este código em todas as suas atividades para resolver esse problema:
fonte
Coloque este código em sua atividade
fonte