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.

10voto

Duda Punkte 1653

Für Android 7.0 Nougat (und niedriger) folgen Sie diesem Artikel:

Programmatisch die Sprache in Android ändern

Alte Antwort
Dazu gehört auch RTL/LTR-Unterstützung:

public static void changeLocale(Context context, Locale locale) {
    Configuration conf = context.getResources().getConfiguration();
    conf.locale = locale;
    Locale.setDefault(locale);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       conf.setLayoutDirection(conf.locale);
    }

    context.getResources().updateConfiguration(conf, context.getResources().getDisplayMetrics());
}

9voto

Brijesh Masrani Punkte 1429

Wenn Sie schreiben

android:configChanges="locale"

In jeder Aktivität (in der Manifestdatei), dann müssen Sie es nicht jedes Mal neu eingeben Activity .

8voto

Sie können den Benutzer auffordern, die Sprache im ersten Bildschirm auszuwählen und sie in SharedPreferences

SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("lang", "si");
editor.apply();

recreate();

Dann können Sie es in jedem Activity in Ihrer Anwendung. Hier habe ich die Sprachen Englisch und Singhalesisch eingestellt.

@Override
protected void attachBaseContext(Context base) {
    SharedPreferences prefs = base.getSharedPreferences("uinfo", MODE_PRIVATE);
    String restoredText = prefs.getString("lang", "No name defined");

    if (restoredText.equals("si")){
        super.attachBaseContext(LocaleHelper.localeUpdateResources(base, "si"));
    }else{
        super.attachBaseContext(LocaleHelper.localeUpdateResources(base, "en"));
    }
}

Und das ist Ihr localUpdateResources Methode. Legen Sie es in LocalHelper Klasse

public class LocaleHelper {
    public static Context localeUpdateResources(Context context, String languageCode) {

        Context newContext = context;

        Locale locale = new Locale(languageCode);
        Locale.setDefault(locale);

        Resources resources = context.getResources();
        Configuration config = new Configuration(resources.getConfiguration());

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {

            config.setLocale(locale);
            newContext = context.createConfigurationContext(config);

        } else {

            config.locale = locale;
            resources.updateConfiguration(config, resources.getDisplayMetrics());
        }

        return newContext;

    }
}

8voto

Rockney Punkte 9700

Ich hatte das gleiche Problem. Auf GitHub fand ich die Android-LocalizationActivity-Bibliothek .

Diese Bibliothek macht es sehr einfach, die Sprache Ihrer Anwendung zur Laufzeit zu ändern, wie Sie im folgenden Codebeispiel sehen können. Ein Beispielprojekt mit dem unten stehenden Beispielcode und weiteren Informationen finden Sie auf der Github-Seite.

Die LocalizationActivity erweitert die AppCompatActivity, so dass Sie sie auch verwenden können, wenn Sie Fragmente verwenden.

public class MainActivity extends LocalizationActivity implements View.OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_simple);

        findViewById(R.id.btn_th).setOnClickListener(this);
        findViewById(R.id.btn_en).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn_en) {
            setLanguage("en");
        } else if (id == R.id.btn_th) {
            setLanguage("th");
        }
    }
}

8voto

S Haque Punkte 6248

Resources.updateConfiguration() wurde Abgelehnt und ich habe das Problem gelöst ohne Erstellung beliebiger benutzerdefinierter ContextWrapper .

Zuerst habe ich eine Erweiterungsfunktion erstellt

fun Context.setAppLocale(language: String): Context {
    val locale = Locale(language)
    Locale.setDefault(locale)
    val config = resources.configuration
    config.setLocale(locale)
    config.setLayoutDirection(locale)
    return createConfigurationContext(config)
}

Dann wird in der Aktivität attachBaseContext Methode, wobei der Kontext einfach durch den neuen Kontext ersetzt wird.

override fun attachBaseContext(newBase: Context) {
  super.attachBaseContext(ContextWrapper(newBase.setAppLocale("bn")))
}

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