Auf dem iPhone wird NSLocalizedString
die Zeichenfolge in der Sprache des iPhone zurückgegeben. Ist es möglich, NSLocalizedString
die Verwendung einer bestimmten Sprache zu erzwingen , damit die App in einer anderen Sprache als das Gerät angezeigt wird?
263
Antworten:
NSLocalizedString()
(und Varianten davon) greifen Sie auf den Schlüssel "AppleLanguages"NSUserDefaults
zu, um die Einstellungen des Benutzers für bevorzugte Sprachen zu bestimmen. Dies gibt eine Reihe von Sprachcodes zurück, wobei der erste vom Benutzer für sein Telefon festgelegt wird und die nachfolgenden als Fallbacks verwendet werden, wenn eine Ressource nicht in der bevorzugten Sprache verfügbar ist. (Auf dem Desktop kann der Benutzer mehrere Sprachen mit einer benutzerdefinierten Reihenfolge in den Systemeinstellungen angeben.)Sie können die globale Einstellung für Ihre eigene Anwendung überschreiben, wenn Sie möchten, indem Sie die Methode setObject: forKey: verwenden, um Ihre eigene Sprachliste festzulegen. Dies hat Vorrang vor dem global festgelegten Wert und wird an jeden Code in Ihrer Anwendung zurückgegeben, der die Lokalisierung durchführt. Der Code dafür würde ungefähr so aussehen:
Dies würde Deutsch zur bevorzugten Sprache für Ihre Bewerbung machen, mit Englisch und Französisch als Fallbacks. Sie sollten dies irgendwann früh beim Start Ihrer Anwendung aufrufen. Weitere Informationen zu Sprach- / Gebietsschemaeinstellungen finden Sie hier: Themen der Internationalisierungsprogrammierung: Abrufen der aktuellen Sprache und des Gebietsschemas
quelle
Ich hatte kürzlich das gleiche Problem und wollte nicht meinen gesamten NSLocalizedString starten und patchen noch die App zum Neustart zwingen, damit die neue Sprache funktioniert. Ich wollte, dass alles so funktioniert, wie es ist.
Meine Lösung bestand darin, die Klasse des Hauptpakets dynamisch zu ändern und das entsprechende Paket dort zu laden:
Header-Datei
Implementierung
Wenn Ihre App gestartet wird und bevor Sie Ihren ersten Controller laden, rufen Sie einfach an:
Wenn Ihr Benutzer seine bevorzugte Sprache in Ihrem Einstellungsbildschirm ändert, rufen Sie ihn einfach erneut auf:
Um auf die Systemstandards zurückzusetzen, übergeben Sie einfach nil:
Genießen...
Für diejenigen, die eine Swift-Version benötigen:
quelle
Normalerweise mache ich das so, aber Sie MÜSSEN alle Lokalisierungsdateien in Ihrem Projekt haben.
quelle
Nicht unter iOS 9 verwenden. Dies gibt null für alle durchlaufenden Zeichenfolgen zurück.
Ich habe eine andere Lösung gefunden, mit der Sie die Sprachzeichenfolgen aktualisieren können, ohne die App neu zu starten und mit Genzeichenfolgen kompatibel:
Fügen Sie dieses Makro in die Datei Prefix.pch ein:
und wo immer Sie eine lokalisierte Zeichenfolge benötigen:
So stellen Sie die Sprache ein:
Funktioniert auch mit aufeinanderfolgenden Sprachsprüngen wie:
quelle
Wie bereits erwähnt, machen Sie einfach:
Um jedoch zu vermeiden, dass die App neu gestartet werden muss, setzen Sie die Zeile
main.m
kurz vorUIApplicationMain
(...) in die Hauptmethode von .quelle
NSAutoreleasePool * pool ..
mag für Nicht-Anfänger offensichtlich klingen, aber Sie sollten diese Zeile einfügen, nachdem oder einige automatisch freigegebene Objekte auslaufen.[[NSBundle mainBundle] URLForResource:withExtension:]
vorher anrufen .Der Trick, eine bestimmte Sprache zu verwenden, indem Sie sie aus der App auswählen, besteht darin, die
NSLocalizedString
Verwendung eines bestimmten Bundles abhängig von der ausgewählten Sprache zu erzwingen.Hier ist der Beitrag, den ich für diese Lernlokalisierung in iOS-Apps geschrieben habe
und hier ist der Code einer Beispiel-App- Vorlokalisierung in iOS-Apps
quelle
Was halten Sie von dieser Lösung für Swift 3?
Einfache Verwendung:
quelle
Wie Brian Webster erwähnt, muss die Sprache "irgendwann zu Beginn des Starts Ihrer Anwendung" eingestellt werden. Ich dachte
applicationDidFinishLaunching:
an dieAppDelegate
sollte ein geeigneter Ort dafür sein, da ich dort alle anderen Initialisierungen mache.Aber wie William Denniss erwähnt, scheint dies erst nach dem Neustart der App Auswirkungen zu haben , was irgendwie nutzlos ist.
Es scheint gut zu funktionieren, wenn ich den Code in die Hauptfunktion setze:
Ich würde mich über Kommentare dazu freuen.
quelle
[[NSUserDefaults standardUserDefaults] synchronize];
nach einem AnrufsetObject:forKey:
Mir gefällt die Methode von Mauro Delrio am besten. Ich habe auch Folgendes in meine Project_Prefix.pch eingefügt
Wenn Sie also jemals die Standardmethode (die NSLocalizedString verwendet) verwenden möchten, können Sie in allen Dateien eine schnelle Syntaxersetzung vornehmen.
quelle
NSLocalizedString()
liest den Wert für den SchlüsselAppleLanguages
aus den Standardbenutzerstandards ([NSUserDefaults standardUserDefaults]
). Mit diesem Wert wird zur Laufzeit eine geeignete Lokalisierung unter allen vorhandenen Lokalisierungen ausgewählt. Wenn Apple beim Start der App das Standardwörterbuch für Benutzer erstellt, sucht es in den Systemeinstellungen nach dem Schlüssel für die bevorzugte Sprache und kopiert den Wert von dort. Dies erklärt beispielsweise auch, warum das Ändern der Spracheinstellungen in OS X keine Auswirkungen auf die Ausführung von Apps hat, sondern nur auf Apps, die danach gestartet werden. Nach dem Kopieren wird der Wert nicht aktualisiert, nur weil sich die Einstellungen ändern. Aus diesem Grund startet iOS alle Apps neu, wenn Sie die Sprache ändern.Allerdings werden alle Werte des Wörterbuchs Benutzereinstellungen können durch Befehlszeilenargumente werden überschrieben. Siehe
NSUserDefaults
Dokumentation zumNSArgumentDomain
. Dies schließt sogar die Werte ein, die aus der App-Einstellungsdatei (.plist) geladen werden. Dies ist sehr gut zu wissen, wenn Sie einen Wert nur einmal zum Testen ändern möchten .Wenn Sie also die Sprache nur zum Testen ändern möchten, möchten Sie Ihren Code wahrscheinlich nicht ändern (wenn Sie vergessen, diesen Code später zu entfernen ...), sondern Xcode anweisen, Ihre App mit Befehlszeilenparametern zu starten ( zB spanische Lokalisierung verwenden):
Sie müssen Ihren Code überhaupt nicht berühren. Erstellen Sie einfach verschiedene Schemata für verschiedene Sprachen und Sie können die App schnell einmal in einer Sprache und einmal in einer anderen Sprache starten, indem Sie einfach das Schema wechseln.
quelle
Options
wie dies bei neueren Xcode-Versionen von Apple der Fall ist auch.Ich habe eine Lösung gefunden, mit der Sie sie verwenden können
NSLocalizedString
. Ich erstelle eineNSBundle
AnrufkategorieNSBundle+RunTimeLanguage
. Die Schnittstelle ist so.Die Implementierung ist so.
Fügen Sie dann einfach den Import
NSBundle+RunTimeLanguage.h
in die verwendeten Dateien hinzuNSLocalizedString
.Wie Sie sehen können, speichere ich meinen languageCode in einer Eigenschaft von
AppDelegate
. Dies kann überall gespeichert werden, wo Sie möchten.Das einzige, was ich daran nicht mag, ist eine Warnung, die
NSLocalizedString
Marco neu definiert hat. Vielleicht könnte mir jemand helfen, diesen Teil zu reparieren.quelle
#undef NSLocalizedString
kurz vor hinzu#define
, um die Warnung zu deaktivierenSchnelle Version:
quelle
In einer Nussschale :
Lokalisieren Sie Ihre Anwendung
Als erstes müssen Sie Ihre App in mindestens zwei Sprachen lokalisieren (in diesem Beispiel Englisch und Französisch).
NSLocalizedString überschreiben
Verwenden Sie in Ihrem Code anstelle der
NSLocalizedString(key, comment)
Verwendung ein Makro,MYLocalizedString(key, comment)
das wie folgt definiert ist:#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];
Dieser
MYLocalizationSystem
Singleton wird:Benutzersprache einstellen
Wenn der Benutzer die Anwendungssprache auf Französisch geändert hat, rufen Sie an
[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];
In diesem Beispiel hat diese Methode das lokalisierte Bundle auf fr.lproj gesetzt
Lokalisierte Zeichenfolge zurückgeben
Sobald Sie das lokalisierte Bundle festgelegt haben, können Sie mit dieser Methode die richtige lokalisierte Zeichenfolge von ihm erhalten:
Hoffe das wird dir helfen.
Weitere Details finden Sie in diesem Artikel von NSWinery.io
quelle
Swift 3-Erweiterungen:
Verwendungszweck:
quelle
In der zu definierenden Datei .pch :
quelle
Vielleicht sollten Sie dies ergänzen (in der .pch-Datei nach #import):
quelle
Swift 3-Lösung:
Gab einige Beispiele für Sprachcodes, die verwendet werden können. Hoffe das hilft
quelle
Sie können ein Unterpaket mit den lokalisierten Zeichenfolgen erstellen, mit denen Sie dies tun möchten, und diese dann
NSLocalizedStringFromTableInBundle()
zum Laden verwenden. (Ich gehe davon aus, dass dies ein Inhalt ist, der von der normalen UI-Lokalisierung, die Sie möglicherweise in der App ausführen, getrennt ist.)quelle
Für meinen Fall habe ich zwei lokalisierte Dateien, ja und en
und ich möchte es zu en zwingen, wenn die bevorzugte Sprache im System weder en noch ja ist
Ich werde die Datei main.m bearbeiten
Ich werde prüfen, ob die erste bevorzugte Sprache en oder ja ist. Wenn nicht, werde ich die zweite bevorzugte Sprache in en ändern.
quelle
Sie können so etwas tun:
quelle
Basierend auf der Antwort von Tudorizer , die Sprache zu ändern, ohne die Anwendung zu verlassen oder neu zu starten .
Verwenden Sie anstelle eines Makros eine Klasse für den Zugriff auf die bevorzugte Sprache, um zu überprüfen, ob ein bestimmter Sprachcode vorhanden ist.
Im Folgenden finden Sie eine Klasse, mit der Sie das aktuelle Sprachpaket erhalten, das für iOS 9 funktioniert:
Verwenden Sie die obige Klasse, um auf eine Zeichenfolgendatei / image / video / etc zu verweisen:
Ändern Sie die Sprache inline wie unten oder aktualisieren Sie die Methode "changeCurrentLanguage" in der obigen Klasse, um einen Zeichenfolgenparameter zu verwenden, der auf die neue Sprache verweist.
quelle
In Swift 4 habe ich es gelöst, ohne neu starten oder Bibliotheken verwenden zu müssen.
Nachdem ich viele Optionen ausprobiert hatte, fand ich diese Funktion, bei der Sie die zu übersetzende Zeichenfolge stringToLocalize (von Localizable.String, die Zeichenfolgendatei) und die Sprache, in die Sie sie übersetzen möchten, sowie den zurückgegebenen Wert übergeben der String, den Sie in der Strings-Datei haben:
Unter Berücksichtigung dieser Funktion habe ich diese Funktion in einer Swift-Datei erstellt:
So greifen Sie von der gesamten App und in jeder Zeichenfolge der übrigen ViewController zu, anstatt Folgendes zu setzen:
Ich habe es durch ersetzt
Ich weiß nicht, ob es der beste Weg ist, aber ich fand es sehr einfach und es funktioniert für mich, ich hoffe es hilft dir!
quelle
Diese Funktion versucht, eine lokalisierte Zeichenfolge für die aktuelle Sprache abzurufen. Wenn sie nicht gefunden wird, wird sie in englischer Sprache abgerufen.
quelle
Ich wollte Unterstützung für eine Sprache hinzufügen, die von iOS nicht offiziell unterstützt wird (nicht im Abschnitt Sprache unter Systemeinstellungen aufgeführt). Indem ich dem Internationalization Tutorial von Apple und einigen Hinweisen von Brian Webster und geon gefolgt bin, habe ich mir diesen Code ausgedacht (in main.m):
Dies funktioniert sowohl für Storyboard- als auch für NSLocalizedString-Code. Der Code geht davon aus, dass der Benutzer die Möglichkeit hat, die Sprache in der App später manuell zu ändern.
Vergessen Sie natürlich nicht, die richtigen Storyboard-Übersetzungen und Localizable.strings-Übersetzungen hinzuzufügen (siehe dazu den Link zur Apple-Seite oben).
quelle
Hier ist eine anständige Lösung für dieses Problem, und es ist kein Neustart der Anwendung erforderlich.
https://github.com/cmaftuleac/BundleLocalization
Diese Implementierung funktioniert durch Optimieren in NSBundle. Die Idee ist, dass Sie die Methode localizedStringForKey für die Instanz des NSBundle-Objekts überschreiben und diese Methode dann für ein anderes Bundle mit einer anderen Sprache aufrufen. Einfach und elegant, voll kompatibel mit allen Arten von Ressourcen.
quelle
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
Was auch immer Sie alle tun, der beste Weg ist, den Kurznamen für die angegebene Sprache zu verwenden, dh: fr, en, nl, de, it usw., und diesen einem globalen Wert zuzuweisen.
Erstellen Sie eine Auswahlansicht, die wie ein Dropdown-Menü angezeigt wird (Kombination einer Schaltfläche, auf deren Klicken eine Auswahlansicht von unten mit einer Liste von Sprachen angezeigt wird), und wählen Sie die gewünschte Sprache aus. Lassen Sie den Kurznamen intern speichern. Erstellen Sie eine .h + .m-Datei mit dem Namen LocalisedString.
Stellen Sie den globalen Wert von short_name so ein, dass er dem erhaltenen Wert in LocalisedString.m entspricht. Wenn die gewünschte Sprache ausgewählt ist, weisen Sie NSBundlePath zu, um Projektunterverzeichnisse für die benötigte Sprache zu erstellen. für zB nl.proj, en.proj.
Wenn der jeweilige Projektordner ausgewählt ist, rufen Sie die lokalisierte Zeichenfolge für die jeweilige Sprache auf und ändern Sie die Sprache dynamisch.
Keine Regeln gebrochen.
quelle
Für Swift können Sie die
main.swift
Datei überschreiben und dort die UserDefaults-Zeichenfolge festlegen, bevor die App ausgeführt wird. Auf diese Weise müssen Sie die App nicht neu starten, um den gewünschten Effekt zu erzielen.zusammen mit dem Entfernen von
@UIApplicationMain
in IhrerAppDelegate.swift
Datei gepaart .quelle