É possível alterar o idioma de um aplicativo de forma programática enquanto ainda usa os recursos do Android?
Caso contrário, é possível solicitar um recurso em um idioma específico?
Gostaria de permitir que o usuário altere o idioma do aplicativo.
android
localization
resources
hpique
fonte
fonte
Respostas:
É possível. Você pode definir o código do idioma. No entanto, eu não recomendaria isso. Nós tentamos isso nos estágios iniciais, basicamente combatendo o sistema.
Temos o mesmo requisito para alterar o idioma, mas decidimos concluir que a interface do usuário deve ser a mesma do telefone. Ele estava funcionando através da configuração da localidade, mas era muito complicado. E você deve defini-lo toda vez que inserir atividade (cada atividade) da minha experiência. aqui está um código se você ainda precisar disso (novamente, eu não recomendo isso)
Se você tiver um conteúdo específico do idioma - poderá alterar essa base na configuração.
atualização em 26 de março de 2020
fonte
Context.createConfigurationContext()
, que pode ser usado para agrupar o contexto padrão com a configuração específica do código do idioma e, em seguida, chamargetResources
isso sem a necessidade de atualizar a configuração nos próprios objetos de recursos.conf.setLayoutDirection(locale)
, você pode substituirconf.locale = new Locale(...))
porconf.setLocale(new Locale(...))
. Ele ligará internamentesetLayoutDirection
.Este código realmente funciona:
Digite seu código de idioma na
languageToLoad
variável:fonte
Resources.updateConfiguration
método. Recuei o código para torná-lo mais claro.Eu estava procurando uma maneira de alterar a linguagem do sistema programaticamente. Embora eu compreenda perfeitamente que um aplicativo normal nunca deve fazer isso e, em vez disso:
havia uma necessidade de realmente alterar o idioma do sistema programaticamente.
Esta é uma API não documentada e, portanto, não deve ser usada para aplicativos de mercado / usuário final!
Enfim, aqui está a solução que eu encontrei:
fonte
android.permission.CHANGE_CONFIGURATION
só pode ser concedido pelo aplicativo assinado com a tecla Perform.Se você deseja manter o idioma alterado em todo o seu aplicativo, precisa fazer duas coisas.
Primeiro, crie uma Atividade base e faça com que todas as suas atividades se estendam a partir disso:
Observe que eu salvo o novo idioma em uma sharedPreference.
Segundo, crie uma extensão de Aplicativo como esta:
Observe que getLocale () é o mesmo que acima.
Isso é tudo! Espero que isso possa ajudar alguém.
fonte
Application
é e como usar. mobomo.com/2011/05/how-to-use-application-object-of-androidconfiguration.locate
está obsoleto, setLocale requer API 17+ e updateConfiguration está obsoleto.De acordo com este artigo . Você precisará fazer o download
LocaleHelper.java
mencionado nesse artigo.MyApplication
classe que se estendeApplication
attachBaseContext()
para atualizar o idioma.Registre esta classe no manifesto.
Crie
BaseActivity
e substituaonAttach()
para atualizar o idioma. Necessário para Android 6+Faça com que todas as atividades em seu aplicativo se estendam
BaseActivity
.fonte
Apenas adicionando uma peça extra que me tropeçou.
Enquanto as outras respostas funcionam bem com "de", por exemplo
O exemplo acima não funcionará, por exemplo, com o
"fr_BE"
código do idioma, para que ele use avalues-fr-rBE
pasta ou similar.Precisa da seguinte pequena alteração para trabalhar com
"fr_BE"
fonte
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
vez de criar uma novaConfiguration
instância? Existe algum benefício em usar um novo?Eu mudei para o idioma alemão, pois meu aplicativo é iniciado.
Aqui está o meu código correto. Alguém quer usar esse mesmo para mim .. (Como mudar o idioma no android programaticamente)
meu código:
fonte
Eu sei que é tarde para responder, mas eu encontrei este artigo aqui . O que explica muito bem todo o processo e fornece um código bem estruturado.
Classe auxiliar de localidade:
Você precisa substituir o attachBaseContext e chamar LocaleHelper.onAttach () para inicializar as configurações de localidade no seu aplicativo.
Tudo o que você precisa fazer é adicionar
onde quer que você queira alterar a localidade.
fonte
createConfigurationContext
, que foi útilCriar uma classe Estende
Application
e cria um método estático. Em seguida, você pode chamar esse método em todas as atividades anterioressetContentView()
.Uso em atividades:
fonte
Para o Android 7.0 Nougat (e inferior), siga este artigo:
Alterar idioma programaticamente no Android
Resposta antiga
Isso inclui suporte a RTL / LTR:
fonte
A única solução que funciona totalmente para mim é uma combinação do código de Alex Volovoy com o mecanismo de reinicialização do aplicativo:
fonte
activity.recreate()
Eu estava enfrentando o mesmo problema. No GitHub, encontrei a biblioteca Android-LocalizationActivity .
Essa biblioteca facilita muito a alteração do idioma do seu aplicativo em tempo de execução, como você pode ver no exemplo de código abaixo. Um projeto de exemplo, incluindo o código de exemplo abaixo e mais informações, pode ser encontrado na página do github.
O LocalizationActivity estende o AppCompatActivity, para que você também possa usá-lo quando estiver usando fragmentos.
fonte
Hora de uma atualização devida.
Primeiro, a lista preterida com a API na qual foi preterida:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)A coisa que nenhuma pergunta respondida recentemente acertou é o uso do novo método .
createConfigurationContext é o novo método para updateConfiguration.
Alguns o usaram autônomo assim:
... mas isso não funciona. Por quê? O método retorna um contexto, que é usado para manipular traduções Strings.xml e outros recursos localizados (imagens, layouts, qualquer que seja).
O uso adequado é assim:
Se você acabou de copiar e colar isso no seu IDE, poderá receber um aviso de que a API exige que você direcione a API 17 ou superior. Isso pode ser contornado, colocando-o em um método e adicionando a anotação
@TargetApi(17)
Mas espere. E as APIs mais antigas?
Você precisa criar outro método usando updateConfiguration sem a anotação TargetApi.
Você não precisa retornar um contexto aqui.
Agora, gerenciar isso pode ser difícil. Na API 17+, você precisa do contexto criado (ou dos recursos do contexto criado) para obter os recursos apropriados com base na localização. Como você lida com isso?
Bem, é assim que eu faço:
Esse código funciona com um método que faz chamadas para o método apropriado com base em qual API. Isso é algo que fiz com muitas chamadas obsoletas diferentes (incluindo Html.fromHtml). Você tem um método que aceita os argumentos necessários, que o divide em um dos dois (ou três ou mais) métodos e retorna o resultado apropriado com base no nível da API. É flexível, pois você não precisa verificar várias vezes, o método "entry" faz isso por você. O método de entrada aqui é
setLanguage
LEIA ISTO ANTES DE USAR
Você precisa usar o contexto retornado ao obter recursos. Por quê? Vi outras respostas aqui que usam createConfigurationContext e não usam o contexto que ele retorna. Para que funcione dessa maneira, é necessário chamar updateConfiguration. Qual foi preterido. Use o contexto retornado pelo método para obter recursos.
Exemplo de uso :
Construtor ou em algum lugar semelhante:
E então, onde você quiser obter os recursos que você faz:
Usar qualquer outro contexto (em teoria) irá quebrar isso.
AFAIK, você ainda precisa usar um contexto de atividade para mostrar diálogos ou brindes. para isso, você pode usar uma instância de uma atividade (se estiver fora)
E, finalmente, use
recreate()
a atividade para atualizar o conteúdo. Atalho para não precisar criar uma intenção de atualização.fonte
Se você escrever
Em todas as atividades (no arquivo de manifesto), não é necessário defini-lo toda vez que você entra
Activity
.fonte
configChanges
usado para um hack para preservar o estado da Atividade nas rotações / etc.Atualização Importante:
Observe que, no SDK> = 21, você precisa chamar 'Resources.updateConfiguration ()' , caso contrário, os recursos não serão atualizados.
fonte
Context ctx = createConfigurationContext(args);
e obter recursos de quefonte
activity.recreate()
Locale
configuration
deve ser definido em cada umactivity
antes de definir o conteúdo -this.setContentView(R.layout.main);
fonte
activity.recreate()
Primeiro, crie multi string.xml para diferentes idiomas; então use este bloco de código no
onCreate()
método:fonte
Aqui está um código que funciona para mim:
Fonte: aqui
fonte
Nenhuma das soluções listadas aqui me ajudou.
O idioma não foi ativado no android> = 7.0 se AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
Este LocaleUtils funciona bem: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
LocaleUtils
Adicionado este código ao aplicativo
Código em Atividade
fonte
A resposta de Alex Volovoy só funciona para mim se estiver no método onCreate da atividade.
A resposta que funciona em todos os métodos está em outro segmento
Alterar idioma programaticamente no Android
Aqui está a adaptação do código
Espero que ajude.
fonte
Observe que esta solução usando
updateConfiguration
não funcionará mais com o lançamento do Android M em algumas semanas. A nova maneira de fazer isso agora está usando oapplyOverrideConfiguration
método daContextThemeWrapper
consulte API docVocê pode encontrar minha solução completa aqui desde que eu enfrentei o problema: https://stackoverflow.com/a/31787201/2776572
fonte
Existem algumas etapas que você deve implementar
Primeiro, você precisa alterar o local da sua configuração
Segundo, se você deseja que suas alterações se apliquem diretamente ao layout visível, você pode atualizar as visualizações diretamente ou simplesmente chamar activity.recreate () para reiniciar a atividade atual.
E também é necessário persistir nas alterações, pois após o usuário fechar o aplicativo, você perderia a alteração do idioma.
Expliquei uma solução mais detalhada no meu post no blog Alterar idioma programaticamente no Android
Basicamente, basta chamar LocaleHelper.onCreate () na sua classe de aplicativo e, se você quiser alterar a localidade rapidamente, pode chamar LocaleHelper.setLocale ()
fonte
Isso está funcionando quando pressiono o botão para alterar o idioma do meu TextView. (Strings.xml na pasta values-de)
fonte
Adicionar classe LocaleHelper
Em atividade ou fragmento
Agora SetText em cada texto
fonte
semelhante à versão aceita respondida, mas 2017, e adicionada reinicialização (sem reiniciar, às vezes a próxima atividade ainda renderiza o inglês):
fonte
activity.recreate()
3) o contexto voltou Eu acho que tem que ser usado para obter os recursosPrimeiro você cria valores de nome de diretório - "Nome do idioma" como hindi do que escrever "oi" e a mesma cópia de nome de arquivo de string neste diretório e alterar o valor não altera o parâmetro após definir o código abaixo em sua ação como o botão etc ...
fonte
conf.locale
está obsoletofonte
No exemplo, definimos o idioma inglês:
Lembre-se de que isso funciona apenas se o idioma for encontrado no sistema do dispositivo também, não apenas no aplicativo
fonte
Para suporte árabe / RTL
fonte