Ist es möglich, die Sprache einer App programmgesteuert zu ändern, während weiterhin Android-Ressourcen verwendet werden?
Wenn nicht, ist es möglich, eine Ressource in einer bestimmten Sprache anzufordern?
Ich möchte den Benutzer die Sprache der App aus der App ändern lassen.
android
localization
resources
hpique
quelle
quelle
Antworten:
Es ist möglich. Sie können das Gebietsschema festlegen. Das würde ich jedoch nicht empfehlen. Wir haben es in einem frühen Stadium versucht, es bekämpft im Grunde das System.
Wir haben die gleichen Anforderungen für die Änderung der Sprache, haben uns jedoch entschlossen, die Tatsache zu berücksichtigen, dass die Benutzeroberfläche mit der Benutzeroberfläche des Telefons identisch sein sollte. Es funktionierte über das Einstellen des Gebietsschemas, war aber zu fehlerhaft. Und Sie müssen es jedes Mal einstellen, wenn Sie eine Aktivität (jede Aktivität) aus meiner Erfahrung eingeben. Hier ist ein Code, wenn Sie diesen noch benötigen (ich empfehle das auch nicht)
Wenn Sie sprachspezifischen Inhalt haben, können Sie diese Basis anhand der Einstellung ändern.
Update am 26. März 2020
quelle
Context.createConfigurationContext()
, mit dem der Standardkontext mit der länderspezifischen Konfiguration umbrochen und dann aufgerufen werden kanngetResources
, ohne dass die Konfiguration für die Ressourcenobjekte selbst aktualisiert werden muss.conf.setLayoutDirection(locale)
, können Sie ersetzenconf.locale = new Locale(...))
mitconf.setLocale(new Locale(...))
. Es wird intern angerufensetLayoutDirection
.Dieser Code funktioniert wirklich:
Geben Sie Ihren Sprachcode in die
languageToLoad
Variable ein:quelle
Resources.updateConfiguration
Methode. Ich habe den Code eingerückt, um ihn klarer zu machen.Ich suchte nach einer Möglichkeit, die Systemsprache programmgesteuert zu ändern. Ich verstehe zwar voll und ganz, dass eine normale Anwendung dies niemals tun sollte und stattdessen auch:
Es bestand die Notwendigkeit, die Sprache des Systems wirklich programmgesteuert zu ändern.
Dies ist eine nicht dokumentierte API und sollte daher nicht für Markt- / Endbenutzeranwendungen verwendet werden!
Wie auch immer, hier ist die Lösung, die ich gefunden habe:
quelle
android.permission.CHANGE_CONFIGURATION
kann das nur von einer App gewährt werden, die mit dem Perform-Schlüssel signiert ist.Wenn Sie die Sprache beibehalten möchten, die in Ihrer gesamten App geändert wurde, müssen Sie zwei Dinge tun.
Erstellen Sie zunächst eine Basisaktivität und erweitern Sie alle Ihre Aktivitäten von dieser:
Beachten Sie, dass ich die neue Sprache in einer sharedPreference speichere.
Zweitens erstellen Sie eine Erweiterung der Anwendung wie folgt:
Beachten Sie, dass getLocale () dasselbe ist wie oben.
Das ist alles! Ich hoffe das kann jemandem helfen.
quelle
Application
ist und wie man es benutzt. mobomo.com/2011/05/how-to-use-application-object-of-androidconfiguration.locate
ist veraltet, setLocale benötigt API 17+ und updateConfiguration ist veraltetNach diesem Artikel . Sie müssen den
LocaleHelper.java
in diesem Artikel genannten Download herunterladen .MyApplication
Klasse, die erweitert wirdApplication
attachBaseContext()
, um die Sprache zu aktualisieren.Registrieren Sie diese Klasse im Manifest.
Erstellen
BaseActivity
und überschreibenonAttach()
, um die Sprache zu aktualisieren. Wird für Android 6+ benötigtMachen Sie alle Aktivitäten in Ihrer App erstreckt sich von
BaseActivity
.quelle
Ich füge nur ein zusätzliches Stück hinzu, das mich auslöste.
Während die anderen Antworten zum Beispiel mit "de" gut funktionieren
Das obige funktioniert nicht mit beispielsweise dem
"fr_BE"
Gebietsschema, sodass dervalues-fr-rBE
Ordner oder ähnliches verwendet wird.Benötigt die folgende geringfügige Änderung, um damit zu arbeiten
"fr_BE"
quelle
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
anstatt eine neueConfiguration
Instanz zu erstellen ? Gibt es einen Vorteil für die Verwendung eines neuen?Ich bin für die deutsche Sprache geändert, damit meine App selbst startet.
Hier ist mein korrekter Code. Jeder möchte das gleiche für mich verwenden .. (Wie man die Sprache in Android programmgesteuert ändert)
Mein Code:
quelle
Ich weiß, dass es spät ist zu antworten, aber ich habe diesen Artikel hier gefunden . Das erklärt den gesamten Prozess sehr gut und bietet Ihnen einen gut strukturierten Code.
Gebietsschema Helferklasse:
Sie müssen attachBaseContext überschreiben und LocaleHelper.onAttach () aufrufen, um die Gebietsschemaeinstellungen in Ihrer Anwendung zu initialisieren.
Alles was Sie tun müssen, ist hinzuzufügen
wo immer Sie das Gebietsschema ändern möchten.
quelle
createConfigurationContext
Erstellen einer Klasse Erweitert
Application
und erstellt eine statische Methode. Dann können Sie diese Methode in allen Aktivitäten vorher aufrufensetContentView()
.Verwendung in Aktivitäten:
quelle
Für Android 7.0 Nougat (und niedriger) folgen Sie diesem Artikel:
Ändern Sie die Sprache programmgesteuert in Android
Alte Antwort
Dies beinhaltet RTL / LTR-Unterstützung:
quelle
Die einzige Lösung, die für mich vollständig funktioniert, ist eine Kombination aus Alex Volovoys Code und einem Neustart der Anwendung:
quelle
activity.recreate()
Ich stand vor dem gleichen Problem. Auf GitHub habe ich die Android-LocalizationActivity-Bibliothek gefunden .
Diese Bibliothek macht es sehr einfach, die Sprache Ihrer App zur Laufzeit zu ändern, wie Sie im folgenden Codebeispiel sehen können. Ein Beispielprojekt mit dem folgenden Beispielcode und weiteren Informationen finden Sie auf der Github-Seite.
Die LocalizationActivity erweitert AppCompatActivity, sodass Sie sie auch verwenden können, wenn Sie Fragmente verwenden.
quelle
Zeit für ein fälliges Update.
Zunächst die veraltete Liste mit der API, in der sie veraltet war:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)Das, was in letzter Zeit nicht richtig beantwortet wurde, ist die Verwendung der neuen Methode .
createConfigurationContext ist die neue Methode für updateConfiguration.
Einige haben es eigenständig wie folgt verwendet:
... aber das geht nicht. Warum? Die Methode gibt einen Kontext zurück, der dann zur Verarbeitung von Strings.xml-Übersetzungen und anderen lokalisierten Ressourcen (Bilder, Layouts usw.) verwendet wird.
Die richtige Verwendung ist wie folgt:
Wenn Sie dies gerade in Ihre IDE kopiert haben, wird möglicherweise eine Warnung angezeigt, dass die API erfordert, dass Sie auf API 17 oder höher abzielen. Dies kann umgangen werden, indem Sie es in eine Methode einfügen und die Anmerkung hinzufügen
@TargetApi(17)
Aber warte. Was ist mit den älteren APIs?
Sie müssen eine andere Methode mit updateConfiguration ohne die TargetApi-Annotation erstellen.
Sie müssen hier keinen Kontext zurückgeben.
Jetzt kann es schwierig sein, diese zu verwalten. In API 17+ benötigen Sie den erstellten Kontext (oder die Ressourcen aus dem erstellten Kontext), um die entsprechenden Ressourcen basierend auf der Lokalisierung zu erhalten. Wie gehst du damit um?
Nun, so mache ich das:
Dieser Code verfügt über eine Methode, die basierend auf welcher API die entsprechende Methode aufruft. Dies ist etwas, was ich mit vielen verschiedenen veralteten Aufrufen gemacht habe (einschließlich Html.fromHtml). Sie haben eine Methode, die die erforderlichen Argumente aufnimmt, die sie dann in eine von zwei (oder drei oder mehr) Methoden aufteilt und das entsprechende Ergebnis basierend auf der API-Ebene zurückgibt. Es ist flexibel, da Sie nicht mehrmals prüfen müssen. Die "Eingabemethode" erledigt dies für Sie. Die Eingabemethode hier ist
setLanguage
BITTE LESEN SIE DIESES, BEVOR SIE ES VERWENDEN
Sie müssen den zurückgegebenen Kontext verwenden, wenn Sie Ressourcen erhalten. Warum? Ich habe hier andere Antworten gesehen, die createConfigurationContext verwenden und den zurückgegebenen Kontext nicht verwenden. Damit es so funktioniert, muss updateConfiguration aufgerufen werden. Welches ist veraltet. Verwenden Sie den von der Methode zurückgegebenen Kontext, um Ressourcen abzurufen.
Anwendungsbeispiel :
Konstruktor oder ähnliches:
Und wo immer Sie Ressourcen erhalten möchten, tun Sie Folgendes:
Die Verwendung eines anderen Kontexts wird dies (theoretisch) aufheben.
AFAIK Sie müssen immer noch einen Aktivitätskontext verwenden, um Dialoge oder Toasts anzuzeigen. Dafür können Sie eine Instanz einer Aktivität verwenden (wenn Sie sich außerhalb befinden).
Verwenden Sie schließlich
recreate()
die Aktivität, um den Inhalt zu aktualisieren. Verknüpfung, um keine Aktualisierungsabsicht erstellen zu müssen.quelle
Wenn du schreibst
In jeder Aktivität (in der Manifestdatei) muss sie dann nicht bei jeder Eingabe festgelegt werden
Activity
.quelle
configChanges
ein Hack verwendet wird, um den Aktivitätsstatus bei Rotationen / etc.Wichtiges Update:
Beachten Sie, dass Sie im SDK> = 21 'Resources.updateConfiguration ()' aufrufen müssen , da sonst die Ressourcen nicht aktualisiert werden.
quelle
Context ctx = createConfigurationContext(args);
und erhalten Ressourcen darausquelle
activity.recreate()
Locale
configuration
sollteactivity
vor dem Einstellen des Inhalts jeweils eingestellt werden -this.setContentView(R.layout.main);
quelle
activity.recreate()
Erstellen Sie zunächst multi string.xml für verschiedene Sprachen. Verwenden Sie dann diesen Codeblock in der
onCreate()
Methode:quelle
Hier ist ein Code, der für mich funktioniert:
Quelle: hier
quelle
Keine der hier aufgeführten Lösungen hat mir geholfen.
Die Sprache hat android> = 7.0 nicht eingeschaltet, wenn AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
Dieses LocaleUtils funktioniert einwandfrei: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
LocaleUtils
Dieser Code wurde zur Anwendung hinzugefügt
Code in Aktivität
quelle
Die Antwort von Alex Volovoy funktioniert nur, wenn sie in der onCreate-Methode der Aktivität enthalten ist.
Die Antwort, die in allen Methoden funktioniert, befindet sich in einem anderen Thread
Ändern Sie die Sprache programmgesteuert in Android
Hier ist die Anpassung des Codes
Hoffe, dass es hilft.
quelle
Beachten Sie, dass diese Lösung
updateConfiguration
mit der Android M- Version in einigen Wochen nicht mehr funktioniert . Die neue Methode hierfür ist jetzt die Verwendung derapplyOverrideConfiguration
Methode aus demContextThemeWrapper
API-DokumentMeine vollständige Lösung finden Sie hier, da ich selbst mit dem Problem konfrontiert war: https://stackoverflow.com/a/31787201/2776572
quelle
Es gibt einige Schritte, die Sie implementieren sollten
Zunächst müssen Sie das Gebietsschema Ihrer Konfiguration ändern
Zweitens, wenn Sie möchten, dass Ihre Änderungen direkt auf das sichtbare Layout angewendet werden, können Sie entweder die Ansichten direkt aktualisieren oder einfach activity.recreate () aufrufen, um die aktuelle Aktivität neu zu starten.
Außerdem müssen Sie Ihre Änderungen beibehalten, da Sie nach dem Schließen Ihrer Anwendung durch den Benutzer die Sprachänderung verlieren würden.
Eine ausführlichere Lösung habe ich in meinem Blogbeitrag " Sprache programmgesteuert in Android ändern" erklärt
Grundsätzlich rufen Sie einfach LocaleHelper.onCreate () in Ihrer Anwendungsklasse auf. Wenn Sie das Gebietsschema im laufenden Betrieb ändern möchten, können Sie LocaleHelper.setLocale () aufrufen.
quelle
Dies funktioniert, wenn ich die Taste drücke, um die Textsprache meiner Textansicht zu ändern. (Strings.xml im Ordner values-de)
quelle
Fügen Sie die LocaleHelper- Klasse hinzu
In Aktivität oder Fragment
Jetzt SetText für jeden Text
quelle
ähnlich der akzeptierten beantworteten, aber 2017-Version und hinzugefügtem Neustart (ohne Neustart rendert die nächste Aktivität manchmal immer noch Englisch):
quelle
activity.recreate()
3) Der zurückgegebene Kontext muss meiner Meinung nach verwendet werden, um die RessourcenZuerst erstellen Sie Verzeichnisnamenwerte - "Sprachname" wie Hindi, als "hi" zu schreiben und denselben String-Dateinamen in dieses Verzeichnis zu kopieren und den Wert zu ändern. Ändern Sie den Parameter nicht, nachdem Sie den folgenden Code in Ihrer Aktion wie Schaltfläche usw. festgelegt haben.
quelle
conf.locale
ist veraltetquelle
Im Beispiel stellen wir die englische Sprache ein:
Bitte denken Sie daran, dass dies nur funktioniert, wenn die Sprache auch im Gerätesystem gefunden wird, nicht nur in der Anwendung
quelle
Für Arabisch / RTL-Unterstützung
quelle