HINWEIS Wenn Ihre Mindest-API 17+ ist, gehen Sie direkt zum Ende dieser Antwort. Ansonsten lesen Sie weiter ...
HINWEIS Wenn Sie App-Bundles verwenden, müssen Sie sicherstellen, dass Sie entweder die Sprachaufteilung deaktivieren oder die andere Sprache dynamisch installieren. Siehe dazu https://stackoverflow.com/a/51054393 . Wenn Sie dies nicht tun, wird immer der Fallback verwendet.
Wenn Sie verschiedene Res-Ordner für verschiedene Gebietsschemas haben, können Sie Folgendes tun:
Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
String str = resources.getString(id);
Alternativ können Sie Ihre Aktivität einfach mit der von @jyotiprakash angegebenen Methode neu starten.
HINWEIS Wenn Sie den Resources
Konstruktor so aufrufen, ändert sich intern etwas in Android. Sie müssen den Konstruktor mit Ihrem ursprünglichen Gebietsschema aufrufen, um die Dinge wieder so zu erhalten, wie sie waren.
BEARBEITEN Ein etwas anderes (und etwas saubereres) Rezept zum Abrufen von Ressourcen aus einem bestimmten Gebietsschema lautet:
Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale savedLocale = conf.locale;
conf.locale = desiredLocale;
res.updateConfiguration(conf, null);
String str = res.getString(id);
conf.locale = savedLocale;
res.updateConfiguration(conf, null);
Ab API-Stufe 17 sollten Sie conf.setLocale()
anstelle der direkten Einstellung verwenden conf.locale
. Dadurch wird die Layoutrichtung der Konfiguration korrekt aktualisiert, wenn Sie zufällig zwischen Gebietsschemas von rechts nach links und von links nach rechts wechseln. (Layoutrichtung wurde in 17 eingeführt.)
Es macht keinen Sinn, ein neues Configuration
Objekt zu erstellen (wie @Nulano in einem Kommentar vorschlägt), da durch das Aufrufen updateConfiguration
die ursprüngliche Konfiguration geändert wird, die durch das Aufrufen erhalten wurde res.getConfiguration()
.
Ich würde zögern, dies in eine getString(int id, String locale)
Methode zu bündeln , wenn Sie mehrere Zeichenfolgenressourcen für ein Gebietsschema laden möchten . Das Ändern der Gebietsschemas (unter Verwendung eines der beiden Rezepte) erfordert, dass das Framework viel Arbeit leistet, um alle Ressourcen neu zu binden. Es ist viel besser, Gebietsschemas einmal zu aktualisieren, alles abzurufen, was Sie benötigen, und dann das Gebietsschema zurückzusetzen.
EDIT (Danke an @Mygod):
Wenn Ihre Mindest-API-Stufe 17+ ist, gibt es einen viel besseren Ansatz, wie in dieser Antwort in einem anderen Thread gezeigt. Sie können beispielsweise mehrere Resource
Objekte erstellen , eines für jedes Gebietsschema, das Sie benötigen:
@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) {
Configuration conf = context.getResources().getConfiguration();
conf = new Configuration(conf);
conf.setLocale(desiredLocale);
Context localizedContext = context.createConfigurationContext(conf);
return localizedContext.getResources();
}
Rufen Sie dann einfach die gewünschten Ressourcen aus dem lokalisierten Resource
Objekt ab, das von dieser Methode zurückgegeben wird. Sie müssen nichts zurücksetzen, sobald Sie die Ressourcen abgerufen haben.