Frage 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 und Englisch. Und geben Sie Option an, Sprache in App zu wählen. Ich habe gemacht

1) 3 aufklappbare Ordner einziehbar, ausziehbar, ausziehbar.

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

Ich habe imageView, um Sprache auszuwählen. Wenn es Menü öffnet, besteht die Option Englisch, Spanisch, Portugiesisch.

Ich habe Locale in App bei der Auswahl von Optionen mit diesem Code 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 erklärt in Manifest- android: configChanges = "Gebietsschema"

Es funktioniert, aber es hat ein Problem.

Problem:-

1) Wenn die Sprache ausgewählt ist, ändert sich der Bildschirm, der das Bild der Sprachauswahl enthält, nicht, aber andere Bildschirme ändern sich.

2) Nach der Orientierung ändern Sie die Sprache der App entsprechend dem Gebietsschema des Telefons.


75
2017-10-16 05:46


Ursprung


Antworten:


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 unten, die das Gebietsschema als String akzeptiert (wie 'en' für Englisch, 'hi' für hindi), das Gebietsschema für Ihre App konfiguriert und Ihre aktuelle Aktivität aktualisiert, um die Änderung der Sprache zu reflektieren. Das Gebietsschema, das Sie angewendet haben, wird nicht geändert, bis 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); 
    startActivity(refresh); 
    finish();
} 

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; 

Fügen Sie Manifest zur Aktivität hinzu android: configChanges = "Gebietsschema | Ausrichtung"


134
2017-10-18 11:55



Sie sollten entweder entfernen android:configChanges="locale" aus dem Manifest, wodurch die Aktivität neu geladen oder überschrieben wird onConfigurationChanged Methode:

@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
}

5
2017-10-29 21:08



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

Erstelle dein eigenes CustomContextWrapper Klasse erweitert ContextWrapper und verwenden Sie es, um die Ländereinstellung für die vollständige Anwendung zu ändern. Hier ist ein GIST mit der Nutzung.

Und dann ruf die CustomContextWrapper mit gespeicherter Gebietsschema-Kennung, z. 'hi' für die Hindi-Sprache in der Aktivitätslebenszyklusmethode attachBaseContext. Verwendung hier:

@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
2017-09-03 15:01



Udhays Beispielcode funktioniert gut. Außer der Frage von Sofiane Hassaini und Chirag SolankI, für den Wiedereintritt, es funktioniert nicht. Ich versuche, Udhay-Code aufzurufen, ohne die Aktivität in onCreate () vor super.onCreate (savedInstanceState) neu zu starten. Dann ist es OK!   Nur ein kleines Problem, die Menü-Strings immer noch nicht auf das eingestellte Locale 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();
} 

1
2017-09-28 19:58