2012-10-16 30 views
69

Desidero che la mia app supporti tre lingue spagnolo, portoghese & inglese. E dare l'opzione per selezionare la lingua in app.Io ho fattoCome cambiare la lingua dell'app quando l'utente seleziona la lingua?

1) 3 cartelle disegnabili disegnabili, drawable-pt, disegnabile.

2) Valori di cartella valori 3-es, valori-pt, valori.Change String.xml valori in base alle lingue.

Ho imageView per selezionare la lingua. Quando si fa clic sul menu aperto che comprende l'opzione inglese, spagnolo, portoghese.

ho impostato Locale all'interno app sul selezione delle opzioni da questo codice

public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.en: 
      Locale locale = new Locale("en"); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
      Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show(); 
      break; 

     case R.id.pt: 
      Locale locale2 = new Locale("pt"); 
      Locale.setDefault(locale2); 
      Configuration config2 = new Configuration(); 
      config2.locale = locale2; 
      getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics()); 

      Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show(); 
      break; 

     case R.id.es: 
      Locale locale3 = new Locale("es"); 
      Locale.setDefault(locale3); 
      Configuration config3 = new Configuration(); 
      config3.locale = locale3; 
      getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics()); 

      Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show(); 
      break; 


    } 
     return super.onOptionsItemSelected(item); 
} 

ho dichiarare Manifest- Android: configChanges = "Locale"

Funziona, ma hanno qualche problema.

Problema: -

1) Quando la lingua selezionata, schermo che consiste immagine di selezione della lingua non cambia, ma altre schermate sono cambiamenti.

2) Dopo la modifica dell'orientazione, l'applicazione ripristina la lingua in base alle impostazioni locali del telefono.

+0

Per il secondo problema prova ad aggiungere: 'Android: configChanges = "Locale"' per la vostra attività all'interno del AndroidManifest.xml –

+0

ho già aggiungere in ogni activitiy nel mio manifesto. – mukesh

+0

È possibile utilizzare la seguente libreria, che fornisce l'elenco delle lingue, la preferenza per la schermata delle impostazioni e sostituisce la lingua nella propria applicazione: https://github.com/delight-im/Android-Lingue – caw

risposta

127

estratto è tutto per la pagina web: http://android.programmerguru.com/android-localization-at-runtime/

E 'semplice cambiare la lingua della vostra applicazione su di utente seleziona dalla lista delle lingue. Avere un metodo come di seguito che accetta le impostazioni locali come String (come 'en' per l'inglese, 'ciao' per hindi), configurare le impostazioni locali per la propria app e aggiornare la propria attività corrente per riflettere la modifica della lingua. Le impostazioni locali applicate non verranno modificate finché non le cambierai di nuovo manualmente.

public void setLocale(String lang) { 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    Intent refresh = new Intent(this, AndroidLocalize.class); 
    startActivity(refresh); 
    finish(); 
} 

Assicurati importati seguenti pacchetti:

import java.util.Locale; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.util.DisplayMetrics; 

aggiungono a manifestare all'attività Android: configChanges = "locale | orientamento"

+2

Sì, certo. Posso fornire l'estratto della pagina web. Dove devo fornire per favore fammi sapere. Grazie. – Udhay

+2

+1 per fornire un estratto. –

+0

Come ulteriore informazione per te, il mio AVD è diventato un errore. Così ho cancellato 'Intent refresh = new Intent (questo, AndroidLocalize.class); startActivity (refresh); 'e lo ha inserito nel metodo' onSharedPreferenceChange'. Semplicemente, l'ho messo fuori dalla sottoclasse 'setLocale (String lang)'. E ha funzionato ora. –

5

Si dovrebbe rimuovere android:configChanges="locale" da manifeste, e causerà l'attività per ricaricare o sostituire il metodo onConfigurationChanged:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
super.onConfigurationChanged(newConfig); 
    // your code here, you can use newConfig.locale if you need to check the language 
    // or just re-set all the labels to desired string resource 
} 
1

Buone soluzioni spiegate abbastanza bene qui. Ma ecco un altro.

Creare la propria classe CustomContextWrapper estendendo ContextWrapper e utilizzarla per modificare le impostazioni internazionali per l'applicazione completa. Here is a GIST con l'uso.

E quindi chiamare lo CustomContextWrapper con identificativo locale salvato ad es. 'hi' per lingua hindi nel metodo ciclo di vita dell'attività attachBaseContext. Utilizzo qui:

@Override 
protected void attachBaseContext(Context newBase) { 
//fetch from shared preference also save to the same when applying. default here is en = English 
    String language = MyPreferenceUtil.getInstance().getString("saved_locale", "en"); 
    super.attachBaseContext(SnapContextWrapper.wrap(newBase, language)); 
} 
1

Il codice di esempio di Udhay funziona bene.Tranne la questione di Sofiane Hassaini e Chirag Solank, per il rientro non funziona. Provo a chiamare il codice di Udhay senza riavviare l'attività in onCreate(), prima di super.onCreate (savedInstanceState) ;. Allora va bene! Solo un piccolo problema, le stringhe di menu non sono ancora state modificate nel locale impostato.

public void setLocale(String lang) { //call this in onCreate() 
    Locale myLocale = new Locale(lang); 
    Resources res = getResources(); 
    DisplayMetrics dm = res.getDisplayMetrics(); 
    Configuration conf = res.getConfiguration(); 
    conf.locale = myLocale; 
    res.updateConfiguration(conf, dm); 
    //Intent refresh = new Intent(this, AndroidLocalize.class); 
    //startActivity(refresh); 
    //finish(); 
} 
Problemi correlati