2012-10-16 24 views
69

Chcę, aby moja aplikacja obsługiwała trzy języki hiszpański, portugalski & Angielski. I daj opcję wyboru języka w aplikacji. ZrobiłemJak zmienić język aplikacji, gdy użytkownik wybierze język?

1) 3 wyciągalne foldery do rysowania, drawable-pt, ciągnione.

2) 3 wartości wartości folderów -s, values-pt, values. Zmień wartości String.xml według języków.

mam ImageView wybrać language.When kliknij Otwórz menu opcji, które składa się angielski, hiszpański, portugalski to.

ustawić Locale wewnątrz aplikacji na wybór opcji przez ten kod

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); 
} 

mam zadeklarować w Manifest- android: configChanges = "locale"

pracować, ale mają jakiś problem.

Problem: -

1) Gdy wybrany język, ekran, który składa się obraz wyboru języka nie zmieni, ale inne ekrany są zmiany.

2) Po zmianie orientacji aplikacja przywraca język zgodnie z ustawieniami regionalnymi telefonu.

+0

na 2. problemu spróbuj dodać: 'android: configChanges =„Locale”' dla swojej działalności wewnątrz AndroidManifest.xml –

+0

już dodać w każdym activitiy w moim manifestu. – mukesh

+0

Możesz użyć następującej biblioteki, która zapewnia listę języków, preferencje dla ekranu ustawień i zastępuje język w aplikacji: https://github.com/delight-im/Android-Languages ​​ – caw

Odpowiedz

127

Za wyciąg na stronie: http://android.programmerguru.com/android-localization-at-runtime/

To proste, aby zmienić język aplikacji po użytkownik wybierze go z listy języków. Użyj poniższej metody, która akceptuje ustawienia narodowe jako ciąg (np. "En" dla języka angielskiego, "cześć" dla hindi), skonfiguruj ustawienia regionalne dla swojej aplikacji i odśwież bieżącą aktywność, aby odzwierciedlić zmianę języka. Zastosowane locale nie zostaną zmienione, dopóki nie zmienisz go ręcznie.

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(); 
} 

Upewnij się, że importowane następujące pakiety:

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; 

dodać manifest do działalności android: configChanges = "Locale | orientacji"

+2

Tak, oczywiście. Mogę podać fragment strony internetowej. Gdzie muszę podać, proszę dać mi znać. Dzięki. – Udhay

+2

+1 za przesłanie fragmentu. –

+0

Jako dodatkowa informacja dla ciebie, mój AVD stał się błędem. Więc usunąłem "Intent refresh = new Intent (this, AndroidLocalize.class); startActivity (odśwież); 'i umieścił go w metodzie' onSharedPreferenceChange'. Po prostu umieściłem go z podklasy 'setLocale (String lang)'. I teraz zadziałało. –

5

należy albo usunąć android:configChanges="locale" z manifestu, który spowoduje przeładowanie działania lub zastąpienie metody 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

Dobre rozwiązania wyjaśniono tu całkiem dobrze. Ale tu jest jeszcze jeden.

Utwórz własną klasę CustomContextWrapper rozszerzającą ContextWrapper i użyj jej do zmiany ustawień regionalnych dla kompletnej aplikacji. Here is a GIST z użytkowania.

Następnie wywołaj CustomContextWrapper z zapisanym identyfikatorem ustawień regionalnych. 'hi' dla języka hindi w metodzie cyklu życia aktywności attachBaseContext. Użycie tutaj:

@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

Kod przykładowy Udhaya działa dobrze.Oprócz pytania Sofiane Hassaini i Chirag SolankI, dla ponownego wejścia nie działa. Próbuję wywołać kod Udhaya bez restartowania działania w onCreate(), przed super.onCreate (savedInstanceState) ;. To jest OK! Tylko niewielki problem, ciągi menu wciąż nie zostały zmienione na ustawione Ustawienia regionalne.

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(); 
} 
Powiązane problemy