it-swarm.com.de

Wie ändere ich die Sprache der App, wenn der Benutzer die Sprache auswählt?

Ich möchte, dass meine App drei Sprachen unterstützt: Spanisch, Portugiesisch, Englisch. Und geben Sie die Option zur Auswahl der Sprache in App.Ich habe gemacht

1) 3 Zeichenmappen drawable-es, drawable-pt, drawable.

2) Ordner "3 Werte" values-es, values-pt, values.Change String.xml-Werte nach Sprachen.

Ich habe imageView, um die Sprache auszuwählen. Wenn ich auf das Menü klicke, wird die Option Englisch, Spanisch, Portugiesisch geöffnet.

Ich habe das Gebietsschema in der App bei der Auswahl der Optionen anhand dieses Codes festgelegt

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

Ich habe in Manifest- Android: configChanges = "locale" deklariert

Es funktioniert, aber es gibt ein Problem.

Problem:-

1) Bei Auswahl der Sprache ändert sich der Bildschirm, der aus dem Bild der Sprachauswahl besteht, nicht, andere Bildschirme ändern sich jedoch.

2) Ändern Sie nach der Ausrichtung die App-Wiederherstellungssprache entsprechend der Ländereinstellung des Telefons.

91
mukesh

Es ist ein Auszug für die Webseite: http://Android.programmerguru.com/Android-localization-at-runtime/

Es ist einfach, die Sprache Ihrer App zu ändern, wenn der Benutzer sie aus der Liste der Sprachen auswählt. Verwenden Sie eine Methode wie die folgende, die das Gebietsschema als Zeichenfolge akzeptiert (wie 'en' für Englisch, 'hi' für Hindi), konfigurieren Sie das Gebietsschema für Ihre App und aktualisieren Sie Ihre aktuelle Aktivität, um die Änderung der Sprache widerzuspiegeln. Das Gebietsschema, das Sie angewendet haben, wird erst geändert, wenn Sie es erneut manuell ändern.

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

Stellen Sie sicher, dass Sie folgende Pakete importiert haben:

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; 

in Manifest zur Aktivität hinzufügen Android: configChanges = "locale | orientation"

155
Udhay

Sie sollten entweder Android:configChanges="locale" from manifest, wodurch die Aktivität neu geladen oder die onConfigurationChanged -Methode überschrieben wird:

@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
}
6
Frane Poljak

Gute Lösungen werden hier ziemlich gut erklärt. Aber hier ist noch einer.

Erstellen Sie Ihre eigene Klasse CustomContextWrapper, die ContextWrapper erweitert, und ändern Sie damit die Ländereinstellung für die gesamte Anwendung. Hier ist ein Gist mit der Verwendung.

Rufen Sie dann CustomContextWrapper mit der gespeicherten Gebietsschema-ID auf, z. 'hi' für die Sprache Hindi in der Aktivitätslebenszyklusmethode attachBaseContext. Verwendung hier:

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

der obige Code ist perfekt, aber nur einer fehlt. Meiner hat nicht funktioniert, nur weil die Sprache in der Konfigurationsdatei nicht erwähnt wurde

 defaultConfig {

    resConfigs "en", "hi", "kn"

}

danach liefen alle Sprachen

4
Lokesh Tiwari

Udhays Beispielcode funktioniert gut. Mit Ausnahme der Frage von Sofiane Hassaini und Chirag SolankI für den Wiedereintritt funktioniert es nicht. Ich versuche, Udhays Code aufzurufen, ohne die Aktivität in onCreate () neu zu starten, bevor super.onCreate (savedInstanceState) ;. Dann ist es OK! Nur ein kleines Problem, die Menü-Strings haben sich immer noch nicht auf das eingestellte Gebietsschema geändert.

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

Diejenigen, die das Versionsproblem bekommen, probieren diesen Code aus.

public static void switchLocal(Context context, String lcode, Activity activity) {
        if (lcode.equalsIgnoreCase(""))
            return;
        Resources resources = context.getResources();
        Locale locale = new Locale(lcode);
        Locale.setDefault(locale);
        Android.content.res.Configuration config = new 
        Android.content.res.Configuration();
        config.locale = locale;
        resources.updateConfiguration(config, resources.getDisplayMetrics());
        //restart base activity 
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
2