Stellen Sie die iOS Sprache ohne Neustart ein

9

Ich bin mir einiger Posts bewusst, die sagen, dass dies nicht gemacht werden sollte oder nicht möglich ist. Ich habe mit ein paar Ideen gebastelt und nun stelle ich diese Frage, weil ich absolut sicher sein will, dass es keine anderen Möglichkeiten gibt.

Option 1:

Die beliebteste Lösung besteht darin, AppleLanguages wie in zu ändern Post. Es macht mir nichts aus, einen Neustart zu verlangen, daher wäre dies eine akzeptable Lösung für mich, außer dass Sie Ihre App nicht programmgesteuert neu starten können (die Methode kann nicht gefunden werden oder wird von Apple abgelehnt). Den Benutzer zu bitten, die Anwendung manuell neu zu starten, wäre nicht ideal.

Option 2:

Die nächste Lösung ist, das passende Paket zu bekommen und eine localizedStringForKey Suche nach jedem UILabel , UIButton , etc. durchzuführen. Das kann ein wenig mühsam sein, ist aber okay für mich, da ich bereits localizationProperties hinzugefügt habe (ähnlich wie dies ) für diese Ansichten, damit ich eine zentralisierte Zeichenfolgendatei haben kann.

AppDelegate.swift:

%Vor%

Lokalisierung.Schalt:

%Vor%

Das Problem mit Option 2 ist, dass damit nur die Sprache für diese Felder festgelegt wird. Die Layout-Richtung bleibt unverändert, und Dateien wie sprachspezifische Layouts werden nicht verwendet.

Durch das Erweitern von UIApplication kann ich eine benutzerdefinierte userInterfaceLayoutDirection angeben, die alle Layouts zwischen LTR und RTL erfolgreich vertauscht.

DemoApplication.swift:

%Vor%

Jetzt, wenn ich AppDelegate.userLanguage einstelle, wird die Anwendung auf den ursprünglichen View-Controller zurückgesetzt, wobei die neue Sprache angezeigt wird und das Layout zwischen LTR und RTL umgedreht wird. Dadurch wird nicht das Problem sprachspezifischer Dateien behoben, und ich habe auch bemerkt, dass Text links oder rechts innerhalb seiner eigenen Grenzen ausgerichtet bleibt.

Da ich den Quellcode für native iOS-Klassen nicht finden kann, kann ich nicht sehen, welche sprachspezifischen Variablen beim Start gesetzt sind, also ging ich davon aus, dass er mit NSBundle.mainBundle verknüpft ist. Ich habe versucht, es mit der Methode swizzling zu überschreiben.

%Vor%

Dies funktioniert jedoch nicht, es scheint, als ob der Standardwert mainBundle noch verwendet wird.

Also meine Frage ist: Wie ist mainBundle einen Wert zugewiesen? Welche anderen sprachspezifischen Variablen werden beim Start festgelegt, z. B. userInterfaceLayoutDirection . Ich nehme an, dass es 2 oder 3 dieser Variablen gibt. Ist es möglich, dass dies funktioniert oder verschwende ich nur meine Zeit?

Danke.

    
Kevin 27.10.2015, 13:18
quelle

0 Antworten

Tags und Links