Ich möchte die aktuelle Sprache anzeigen, die die Benutzeroberfläche des Geräts verwendet. Welchen Code würde ich verwenden?
Ich möchte dies als NSString
vollständig ausgeschriebenes Format. (Nicht @ "en_US")
BEARBEITEN: Für diejenigen, die vorbeifahren, gibt es hier eine Menge nützlicher Kommentare, da sich die Antwort mit neuen iOS-Versionen weiterentwickelt hat.
ios
objective-c
cocoa-touch
nslocale
Moshe
quelle
quelle
NSLocale
. Siehe meine Antwort.[NSLocale preferredLanguages]
. Früher wurde es durch einen Unterstrich getrennt (z. B.en_US
), jetzt wurde es in einen Bindestrich umgewandelt:en-US
NSLocale
hat MethodencomponentsFromLocaleIdentifier:
undlocaleIdentifierFromComponents:
welche sind wahrscheinlich der richtige Weg, um mit dem (möglicherweise veränderbaren) Format umzugehen.Antworten:
Die bereitgestellten Lösungen geben tatsächlich den aktuellen Bereich des Geräts zurück - nicht die aktuell ausgewählte Sprache. Diese sind oft ein und dasselbe. Wenn ich jedoch in Nordamerika bin und meine Sprache auf Japanisch eingestellt habe, ist meine Region weiterhin Englisch (USA). Um die aktuell ausgewählte Sprache abzurufen, haben Sie folgende Möglichkeiten:
Dies gibt einen aus zwei Buchstaben bestehenden Code für die aktuell ausgewählte Sprache zurück. "en" für Englisch, "es" für Spanisch, "de" für Deutsch usw. Weitere Beispiele finden Sie in diesem Wikipedia-Eintrag (insbesondere in der Spalte 639-1):
Liste der ISO 639-1-Codes
Dann müssen Sie nur noch die beiden Buchstabencodes in die Zeichenfolge konvertieren, die Sie anzeigen möchten. Wenn es also "en" ist, zeigen Sie "Englisch" an.
Ich hoffe, dies hilft jemandem, der zwischen Region und aktuell ausgewählter Sprache unterscheiden möchte.
BEARBEITEN
Es lohnt sich, die Header-Informationen aus NSLocale.h zu zitieren:
Leute, die sich für App-Sprache interessieren, werfen einen Blick auf die Antwort von @ mindvision
quelle
NSLocale preferredLanguages
geändert. Wenn Sie zuvor nur "en" erhalten haben, erhalten Sie in iOS 9 "en-US" oder "en-JP" usw. Referenz: happyteamlabs.com/blog/…Die ausgewählte Antwort gibt die aktuelle Gerätesprache zurück, jedoch nicht die tatsächlich in der App verwendete Sprache. Wenn Sie in Ihrer App keine Lokalisierung für die bevorzugte Sprache des Benutzers angeben, wird die erste verfügbare Lokalisierung verwendet, die nach der bevorzugten Reihenfolge des Benutzers sortiert ist.
Um die aktuelle Sprache zu ermitteln, die in Ihren Lokalisierungen ausgewählt wurde, verwenden Sie
Beispiel:
Schnell:
quelle
Lösung für iOS 9:
language = "en-US"
languageDic verfügt über die erforderlichen Komponenten
countryCode = "US"
languageCode = "en"
quelle
Dies wird Ihnen wahrscheinlich geben, was Sie wollen:
Es wird der Name der Sprache in der Sprache selbst angezeigt. Zum Beispiel:
quelle
Die akzeptierten und die anderen Antworten berücksichtigen nicht, dass die bevorzugte Sprache eine andere Sprache als die Gerätesprache sein kann .
Die Gerätesprache ist die Sprache, in der Betriebssystemelemente und Apple Apps dargestellt werden.
Die bevorzugte Sprache ist die Sprache, in der der Benutzer Apps lokalisieren möchte. Apple bietet nur eine begrenzte Anzahl von Übersetzungen an. Wenn die bevorzugte Sprache eine Sprache ist, in die Apple seine Apps übersetzt hat, ist dies auch die Gerätesprache. Allerdings , wenn der Benutzer bevorzugt eine Sprache , für die Apple nicht die Übersetzungen des bieten Gerät und bevorzugten Sprachen nicht übereinstimmen . Die Gerätesprache steht in der Liste der bevorzugten Sprachen nicht an erster Stelle.
Die folgende Funktion durchsucht die Liste der bevorzugten Sprachen und prüft, ob in den Apple-Frameworks eine Übersetzung vorhanden ist. Die erste Sprache, die eine Übersetzung hat, ist die Gerätesprache. Die Funktion gibt ihren Sprachcode zurück.
Dies funktioniert, wenn die Liste der bevorzugten Sprachen lautet:
Die Liste der bevorzugten Sprachen kann in bearbeitet werden : Settings.app -> General -> Language & Region -> Preferred Language Order
Sie können dann den Gerätesprachencode verwenden und ihn in den Sprachnamen übersetzen. In den folgenden Zeilen wird die Gerätesprache in der Gerätesprache gedruckt. Zum Beispiel "Español", wenn das Gerät auf Spanisch eingestellt ist.
quelle
NSBundle(forClass: UIView.self)
versuchen, die spezifischste Sprache für eine bestimmte Ansicht bereitzustellen. Bei dieser Verwendung stieß ich jedoch auf ein Problem, bei dem für die angegebene Klasse keine Sprache zurückgegeben wurde. Ich habe die Initialisierung in geändertNSBundle.mainBundle()
und den erwarteten Sprachcode erhalten.mainBundle()
scheint die von Apple empfohlene zu sein, wie in der Kopfzeile fürNSLocale
,// note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information
.NSBundle.mainBundle()
gibt Ihr App-Bundle zurück, währendNSBundle(forClass: UIView.self)
das System-UIKit-Bundle zurückgegeben wird. Die beschriebene Methode sucht nach Verzeichnissen im Bundle. Ihr App-Bundle enthält nur diejenigen für die Sprachen, in denen Sie lokalisieren möchten. Um die Gerätesprache zu bestimmen, müssen Sie das Systempaket überprüfen.NSLocale.preferredLanguages()
. Ich habe die Antwort aktualisiert, um iOS 9 zu unterstützen .ich benutze das
Speicherverlust ignorieren ..
und Ergebnis ist
quelle
Das Übersetzen von Sprachcodes wie en_US ins Englische (USA) ist eine integrierte Funktion von
NSLocale
undNSLocale
es ist egal, woher Sie die Sprachcodes beziehen . Es gibt also wirklich keinen Grund, Ihre eigene Übersetzung zu implementieren, wie die akzeptierte Antwort nahelegt.Drucke: Englisch, Deutsch, Schwedisch
quelle
Es gibt sogar einen besseren Weg, um die aktuelle Gerätesprache zu erhalten. Versuchen wir es mit dem folgenden Code -
Vorgeschlagen von Abizern auf hier
quelle
Sie können die
displayNameForKey:value:
Methode verwenden vonNSLocale
:Dies wird ausgedruckt:
Wenn Sie dieselbe Gebietsschema-ID für die
initWithLocaleIdentifier:
und auch für diedisplayNameForKey:value:
Methode angeben , erhalten Sie den nativen Namen der Sprache. Ich habe festgestellt, dass, wenn Sie den Ländercode entfernen und nurfr
und verwendenen
, das Land auch im Anzeigenamen weggelassen wird (zumindest unter Mac OS X nicht sicher über iOS).quelle
Schnell
Aktuelle Gerätesprache abrufen
Anwendungssprache erhalten
Hinweis:
Es ruft die Sprache ab, die Sie in CFBundleDevelopmentRegion von info.plist angegeben haben
Wenn CFBundleAllowMixedLocalizations in info.plist wahr ist, wird das erste Element von CFBundleLocalizations in info.plist zurückgegeben
quelle
Ich habe versucht, die richtige Lösung für mich zu finden. Bei Verwendung
Locale.preferredLanguages.first
wurde die bevorzugte Sprache aus Ihren App-Einstellungen zurückgegeben.Wenn Sie die Sprache in den Einstellungen des Benutzergeräts kennenlernen möchten, sollten Sie die folgende Zeichenfolge verwenden:
Swift 3
Informationen zum Auspacken und Verwenden finden Sie in der folgenden Zeile:
quelle
Um die aktuelle Sprache des Benutzergeräts zu erhalten, verwenden Sie den folgenden it-Code, der für mich funktioniert hat.
quelle
iOS13, Swift 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/
Benutzer können die bevorzugte Sprache einer App unabhängig von der Betriebssystemsprache auswählen.
Sie können diese verwenden:
quelle
Für MonoTouch C # verwenden Entwickler:
Hinweis: Ich weiß, dass dies eine iOS-Frage war, aber da ich ein MonoTouch-Entwickler bin, führte mich die Antwort auf dieser Seite in die richtige Richtung und ich dachte, ich würde die Ergebnisse teilen.
quelle
In
Swift
:quelle
Swift 3
quelle
Einfache Swift 3-Funktion:
quelle
Wenn Sie nach einem bevorzugten Sprachcode ("en", "de", "es" ...) und einem lokalisierten bevorzugten Sprachnamen (für das aktuelle Gebietsschema) suchen, finden Sie hier eine einfache Erweiterung in Swift:
}}
quelle
quelle
Wenn Sie hier nur Sprache erhalten möchten, ist meine vorgeschlagene Antwort:
In meinem Fall wollte ich nur die Sprache des Gebietsschemas, nicht die Region des Gebietsschemas.
Ausgabe: Wenn Ihre Ländersprache Japanisch und die Gebietsschemaregion Japan ist, dann:
langplusreg = ja-JP
langonly = ja
quelle
@ Amir Antwort in Swift:
quelle
Offensichtlich stützen sich die Lösungen zum Beispiel auf
funktioniert normalerweise einwandfrei und gibt die aktuelle Gerätesprache zurück.
In einigen Fällen kann dies jedoch irreführend sein:
Wenn die App, in der Sie diesen Wert erhalten möchten, die Sprache bereits geändert hat, z. B. mit dieser Art von Code:
In diesem Fall gibt [NSLocale PreferredLanguages] tatsächlich die bevorzugte (und verwendete) Sprache in dieser bestimmten App zurück, nicht die aktuelle Gerätesprache!
Und ... in diesem Fall besteht die einzige Möglichkeit, die aktuelle Gerätesprache (und nicht die zuvor in der App festgelegte) richtig abzurufen, darin, zunächst den Schlüssel @ "appleLanguages" in NSUserDefaults wie folgt zu löschen:
Dann gibt [NSLocale PreferredLanguages] jetzt den korrekten Wert zurück.
Ich hoffe das hilft.
quelle
Aktualisierte Antwort für Swift 4
quelle
NSLocale.preferredLanguages
sollte die bevorzugten des Benutzers zurückgeben, ohne zu berücksichtigen, was vom Bundle unterstützt wird.Für Swift 3.0 kann der folgende Code verwendet werden, um Ihre Frage zu beantworten:
quelle
In Swift 4.2 und Xcode 10.1
quelle
Laut Apple- Dokumentation
quelle
Zwei-Buchstaben-Format. Apple verwendet den ISO-Standard ISO-3166 .
quelle
Für Swift 3:
NSLocale.preferredLanguages [0] als String
quelle
Wenn Sie ab iOS 9 nur den Sprachcode ohne Ländercode möchten, benötigen Sie diese Art von Hilfsfunktion, da die Sprache den Ländercode enthält.
quelle
SWIFT-4
quelle
NSLocale.preferredLanguages
sollte die bevorzugten des Benutzers zurückgeben, ohne zu berücksichtigen, was vom Bundle unterstützt wird.