572 Stimmen

App-Sprache in Android programmatisch ändern

Ist es möglich, die Sprache einer App programmatisch zu ändern und dabei weiterhin Android-Ressourcen zu verwenden?

Wenn nicht, ist es möglich, eine Ressource in einer bestimmten Sprache anzufordern?

Ich möchte, dass der Benutzer die Sprache der App von der App aus ändern kann.

8voto

Misha Punkte 5080

Die einzige Lösung, die bei mir funktioniert, ist eine Kombination aus dem Code von Alex Volovoy und dem Neustartmechanismus der Anwendung:

void restartApplication() {
    Intent i = new Intent(MainTabActivity.context, MagicAppRestart.class);
    i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    MainTabActivity.context.startActivity(i);
}

/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        finish();
    }

    protected void onResume() {
        super.onResume();
        startActivityForResult(new Intent(this, MainTabActivity.class), 0);         
    }
}

7voto

Heitor Paceli Punkte 353

Die Unterstützung von Per-App-Spracheinstellungen wurde gerade hinzugefügt zu API 33 ( Android 13, Tiramisu derzeit auf Developer Preview).

Um das Gebietsschema der App zu ändern, rufen Sie einfach setApplicationLocales von LocaleManager :

// Set app locale to pt-BR (Portuguese, Brazil)
getSystemService(LocaleManager::class.java)
    .applicationLocales = LocaleList(Locale.forLanguageTag("pt-BR"))

Siehe mehr unter https://developer.Android.com/about/versions/13/features/app-languages#api-impl

Ich habe einen Artikel über diese Funktion geschrieben https://proandroiddev.com/exploring-the-new-Android-13-per-app-language-preferences-8d99b971b578

6voto

Ranjithkumar Punkte 14680

Für Arabisch/RTL-Unterstützung

  1. Sie müssen Ihre Spracheinstellungen durch - attachBaseContext() aktualisieren
  2. Für Android Version N und höher müssen Sie createConfigurationContext() & updateConfiguration() verwenden - sonst funktioniert das RTL-Layout nicht richtig

    @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(updateBaseContextLocale(newBase)); }

    public Context updateBaseContextLocale(Context context) {
        String language = SharedPreference.getInstance().getValue(context, "lan");//it return "en", "ar" like this
        if (language == null || language.isEmpty()) {
            //when first time enter into app (get the device language and set it
            language = Locale.getDefault().getLanguage();
            if (language.equals("ar")) {
                SharedPreference.getInstance().save(mContext, "lan", "ar");
            }
        }
        Locale locale = new Locale(language);
        Locale.setDefault(locale);
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            updateResourcesLocale(context, locale);
            return  updateResourcesLocaleLegacy(context, locale);
        }
    
        return updateResourcesLocaleLegacy(context, locale);
    }
    
    @TargetApi(Build.VERSION_CODES.N)
    private Context updateResourcesLocale(Context context, Locale locale) {
        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        return context.createConfigurationContext(configuration);
    }
    
    @SuppressWarnings("deprecation")
    private Context updateResourcesLocaleLegacy(Context context, Locale locale) {
        Resources resources = context.getResources();
        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        resources.updateConfiguration(configuration, resources.getDisplayMetrics());
        return context;
    }

5voto

Locale locale = new Locale("en");
Locale.setDefault(locale);

Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);

Wichtige Aktualisierung:

context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());

Beachten Sie, dass Sie bei SDK >= 21 die Funktion Ressourcen.aktualisierenKonfiguration()'. , sonst werden die Ressourcen nicht aktualisiert.

5voto

Mohsen mokhtari Punkte 2475

Erstellen Sie zunächst mehrere string.xml für verschiedene Sprachen; verwenden Sie dann diesen Codeblock in onCreate() Methode:

super.onCreate(savedInstanceState);
String languageToLoad  = "fr"; // change your language here
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, 
  getBaseContext().getResources().getDisplayMetrics());
this.setContentView(R.layout.main);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X