Ver mensagens sem resposta | Ver tópicos ativos Hoje é 21 Nov 2017, 09:10



Responder Tópico  [ 4 Mensagens ] 
 Alterar Idioma 
Autor Mensagem
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2688
Localização: Rio de Janeiro
Mensagem Alterar Idioma
Pra alterar o idioma da aplicação usamos o updateConfiguration da classe Resources. Os textos devem estar em seus strings.xml com a pasta values corretamente nomeada. Aqui eu usarei quatro idiomas como exemplo e salvarei seu valor num SharedPreferences.

res/values-pt/strings.xml - Português


<?xml version="1.0" encoding="utf-8"?>
<resources>
   
    <string name="app_name">ChangeLanguagetTest - Português</string>
    <string name="change_language">Alterar Idioma</string>
   
    <string name="portuguese">Português</string>
    <string name="italian">Italiano</string>
    <string name="english">Inglês</string>
    <string name="spanish">Espanhol</string>
   
</resources>
 


res/values-it/strings.xml - Italiano


<?xml version="1.0" encoding="utf-8"?>
<resources>
   
    <string name="app_name">ChangeLanguagetTest - Italiano</string>
    <string name="change_language">Cambia Lingua</string>
   
    <string name="portuguese">Portoghese</string>
    <string name="italian">Italiano</string>
    <string name="english">Inglese</string>
    <string name="spanish">Spagnolo</string>
   
</resources>
 


res/values-es/strings.xml - Espanhol


<?xml version="1.0" encoding="utf-8"?>
<resources>
   
    <string name="app_name">ChangeLanguagetTest - Espanhol</string>
    <string name="change_language">Cambiar Idioma</string>
   
    <string name="portuguese">Portugués</string>
    <string name="italian">Italiano</string>
    <string name="english">Inglés</string>
    <string name="spanish">Español</string>
   
</resources>
 


res/values-en/strings.xml - Inglês


<?xml version="1.0" encoding="utf-8"?>
<resources>
   
    <string name="app_name">ChangeLanguagetTest - Inglês</string>
    <string name="change_language">Change Language</string>
   
    <string name="portuguese">Portuguese</string>
    <string name="italian">Italian</string>
    <string name="english">English</string>
    <string name="spanish">Spanish</string>
   
</resources>
 


Como são idiomas específicos, não há necesidade de haver um res/values/strings.xml normal, o idioma padrão será definido na activity principal. Esses serão os dois layouts usados:

home_activity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

   
    <Button
        android:id="@+id/change_language"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/change_language">

    </Button>
   
    <TextView
        android:id="@+id/current_language"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </TextView>
   
</LinearLayout>
 


language_activity

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

   
    <Button
        android:id="@+id/choosePortuguese"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/portuguese">

    </Button>
   
    <Button
        android:id="@+id/chooseItalian"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/italian">

    </Button>
   
    <Button
        android:id="@+id/chooseEnglish"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/english">

    </Button>
   
    <Button
        android:id="@+id/chooseSpanish"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/spanish">

    </Button>
   
</LinearLayout>
 


A activity principal:

HomeActivity

package br.lanzieri.changelanguage;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import java.util.Locale;

/**
 * @author Jefferson Lanzieri
 *
 */

public class HomeActivity extends Activity implements OnClickListener {
   
    private SharedPreferences sp;
    public static String name = "ChangeLanguagePreferencesTest";
   
    private int request = 123;
    public static int result = 456;

    private Button button;
    private TextView textview;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity);
       
        sp = getSharedPreferences(name, Context.MODE_PRIVATE);
       
        if (!sp.getBoolean("hasDefaultLanguage", false)) {
            Editor editor = sp.edit();
           
            editor.putBoolean("hasDefaultLanguage", true);
            editor.putString("language", "pt");
           
            editor.commit();
            saveLanguage("pt");
        }
       
        textview = (TextView) findViewById(R.id.current_language);
        textview.setText("Idioma atual: " + sp.getString("language", ""));
       
        button = (Button) findViewById(R.id.change_language);
        button.setOnClickListener(this);
    }
   
    @Override
    public void onClick(View view) {
        Intent i = new Intent(this, LanguageActivity.class);
        startActivityForResult(i, request);
    }
   
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == request && resultCode == result) {
            String language = sp.getString("language", "");
           
            saveLanguage(language);
           
            button.setText(getResources().getString(R.string.change_language));
            textview.setText("Idioma atual: " + language);
        }
    }
   
    private void saveLanguage(String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
       
        Configuration con = new Configuration();
        con.locale = locale;
       
        getResources().updateConfiguration(con, null);
    }
   
}
 


Nessa HomeActivity, pra saber se é a primeira execução dela eu verifico se ainda não existe um idioma padrão definido e coloco o português. Chamo a LanguageActivity com startActivityForResult e uso o saveLanguage no onActivityResult pra alterar o idioma salvo no SharedPreferences.
No saveLanguage o segundo argumento do updateConfiguration é um DisplayMetrics. Como não precisei dele foi passado o valor null.

LanguageActivity

package br.lanzieri.changelanguage;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 * @author Jefferson Lanzieri
 *
 */

public class LanguageActivity extends Activity implements OnClickListener {
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.language_activity);
       
        Button portuguese = (Button) findViewById(R.id.choosePortuguese);
        Button italian = (Button) findViewById(R.id.chooseItalian);
       
        Button english = (Button) findViewById(R.id.chooseEnglish);
        Button spanish = (Button) findViewById(R.id.chooseSpanish);
       
        portuguese.setOnClickListener(this);
        italian.setOnClickListener(this);
       
        english.setOnClickListener(this);
        spanish.setOnClickListener(this);
    }
   
    @Override
    public void onClick(View view) {
        String language = "pt";
       
        switch (view.getId()) {
            case R.id.chooseItalian : language = "it";
                break;
            case R.id.chooseEnglish : language = "en";
                break;
            case R.id.chooseSpanish : language = "es";
                break;
        }
       
        SharedPreferences sp = getSharedPreferences(HomeActivity.name, Context.MODE_PRIVATE);
        Editor editor = sp.edit();
       
        editor.putString("language", language);
        editor.commit();
       
        setResult(HomeActivity.result);
        finish();
    }
   
}
 


Aqui foi bem simples, apenas verifiquei o id do botão pressionado no switch pra definir o texto da variável language, salvei no SharedPreferences, chamei o setResult e fechei a activity.
Usei o SharedPreferences pra guardar o idioma apenas como modo de exemplo caso fosse preciso usar esse valor em alguma outra parte da aplicação, do jeito atual não há real necessidade. Eu poderia ter colocado esse valor numa Intent lá na LanguageActivity e pegar no onActivityResult da HomeActivity.


    // LanguageActivity
    setResult(HomeActivity.result, new Intent().putExtra("language", language));
   
    // HomeActivity
    String language = data.getStringExtra("language");
 


Outra coisa que verifiquei foi que o nome do aplicativo no AndroidManifest sempre pega o idioma do dispositivo, então precisamos usar o setTitle na activity onde quisermos que ele seja alterado.


    setTitle(getResources().getString(R.string.app_name));
 


Se não houver o res/values/strings.xml padrão, vai ficar algo parecido com @21309668578 no lugar onde for usado um texto do strings.xml, como os botões. O título das activities ficarão com o seu pacote e nome, como br.lanzieri.changelanguage.HomeActivity.

Referências:

http://www.oracle.com/technetwork/java/ ... 34809.html
http://developer.android.com/training/b ... uages.html

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


25 Jun 2015, 13:57
Perfil WWW
What is Android?
What is Android?

Data de registro: 19 Jan 2016, 10:34
Mensagens: 2
Mensagem Re: Alterar Idioma
Excelente artigo! Parabéns!

Fiz a implementação em meu aplicativo, no entanto, tenho uma dúvida.

Ao fechar o aplicativo por completo (não com botão voltar, mas sim fechar) e abrir novamente... o idioma não é o que gravei por último.

Como resolvo isso? Ou fiz algo errado?

Abraços e obrigado


19 Jan 2016, 14:47
Perfil
Google employee
Google employee

Data de registro: 01 Jul 2013, 13:45
Mensagens: 2688
Localização: Rio de Janeiro
Mensagem Re: Alterar Idioma
Olá Luis,
Estou sem acesso ao projeto por enquanto, quando puder eu compilo pra ver se acontece o mesmo comigo.
Mas só pra saber, isso ocorre em qualquer activity do teu projeto?

_________________
Quando seu problema for resolvido, clique na opção Editar no lado superior direito da sua primeira mensagem e coloque [Resolvido] no título.
Se resolveu o problema sozinh@, não esqueça de postar a solução, ela ajuda usuários em buscas no fórum.
Use os marcadores java e xml quando for postar.

Aprenda Java com esta apostila.


19 Jan 2016, 22:16
Perfil WWW
What is Android?
What is Android?

Data de registro: 19 Jan 2016, 10:34
Mensagens: 2
Mensagem Re: Alterar Idioma
Bom dia amigo,

Eu tive que incluir o código da Activity Home em todas as minhas outras.

Você usa gmail ? Eu posso te enviar o print das minhas activity apenas para você conhecer o projeto.


Eu peguei um aplicativo antigo meu, bem antigo, e comecei a atualizar. Incluir o admob, e agora inclui o mult-language graças a seu artigo. No entanto, falta resolver apenas essa questão de persisti após fechado completamente.

Posso te mandar o apk para ver .

Obrigado!

Att,
Luis Andrade
luisfelipeandrade arroba gmail ponto com


20 Jan 2016, 13:40
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 4 Mensagens ] 

Quem está online

Usuários vendo este fórum: Abraao, Adeja, ademir.carvalhojr, Alessandro Tavares, alexandrepom, alsimoes, amos, andepunk, andreluiz, Avelino Mateus Neto, Bass, betofigu, Bitetti, BloggerCaOS, BornSlip, bruno.abd, Bruto_JPO, burujo, caciara, cavenaghi, ciro, claudioalfonso, Cleiton, compto, DaDih*, danielbfranco, darllan.marinho, Darth Vader, debal, Deiapinh, diogeneskelsen, edlinux, epsilva, erissi, fabielp, fabric01, felipedsilva, fernando neves, fmakula, fracon, Francisco_Geraldo, free_w3000, furlanrapha, Gabriel Teófilo, geeks, Google Desktop, Gui Pereira, guto.pro, HAMSES, henrikesilva1, hopper.frf, ICCrawler - ICjobs, ice, inesfg, ismaels, j-menezes, jacquesbica, jairo, JAndroid, jefficojava, jlucasps, Joessi2007, JuniorE, jzaires, kpinheiro, leo, lhdiassilva, lkunta, lucastgomes, luizcarlosvb, m4v0, MarceloLuz, MARCIOHG, marcos_trb, marcosrogel, Marlosm, marlovich, martins, mauriciobreide, mikasjau, mravel, msmdark, mvoto, neiesc, neosun, Nidio Dolfini, nullPointer, Obi-Wan Kenobi, oliverlessa, osternack, paulabr, paulo.weber, peixe, pererinha, pfsmorigo, phfmendes, phsantos, pjorge, Rafael, rafael.winter, rananfu, raulcca, renegheller, rerp7, rfrafael, ricardo, ricardo_listadelphi, rixargolo, rlecheta, rogeriopgomes, Rogério, Roney dos Santos, Samuka, sephct, sergio, Shaman286, sidnei.gs, SidneiCP, Tangerina, tassiovirginio, Thelemita, ton.soares, vieira, wil, zeantonio, zorba e 1 visitante


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi