Aktuelle Gerätesprache in iOS abrufen?

430

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 NSStringvollstä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.

Moshe
quelle
1
Dies ist eingebaut NSLocale. Siehe meine Antwort.
Erik B
15
iOS9-Kommentar: Achten Sie darauf, dass Apple aus irgendeinem seltsamen Grund das von zurückgegebene Format geändert hat [NSLocale preferredLanguages]. Früher wurde es durch einen Unterstrich getrennt (z. B. en_US), jetzt wurde es in einen Bindestrich umgewandelt:en-US
ishahak
7
Weitere Informationen zu iOS9: Das Abrufen von [NSLocale PreferredLanguages] auf einem iOS 8.4-Simulator im Vergleich zum 9.0-Simulator weist ebenfalls Diskrepanzen auf. Auf iOS 8.4 ist es "en" und iOS 9.0 ist es "en-US"
Kris Subramanian
Dieser Kommentar hat mir sehr geholfen! Wir hatten ein einfaches Problem und fragten uns, was ungefähr 1 Stunde lang schief gelaufen war, bis ich Ihren Kommentar sah.
Thandasoru
3
NSLocalehat Methoden componentsFromLocaleIdentifier:und localeIdentifierFromComponents:welche sind wahrscheinlich der richtige Weg, um mit dem (möglicherweise veränderbaren) Format umzugehen.
Benjohn

Antworten:

807

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:

NSString * language = [[NSLocale preferredLanguages] firstObject];

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:

+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // 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

Leute, die sich für App-Sprache interessieren, werfen einen Blick auf die Antwort von @ mindvision

Dubron
quelle
2
Genau das, wonach ich gesucht habe. Ich hatte das gleiche Problem, bei dem die Region nicht mit der Sprache identisch ist.
Jasarien
12
schlechte antwort: gibt zh-hans für chinesisch zurück, was nicht der iso code ist.
Cyrilchampier
2
Die ersten beiden Zeichen geben das Land an, das Zeug nach dem Bindestrich gibt die Region an, der Rest dient nur dazu, es weiter einzugrenzen (z. B. lokale Dialekte). zh ist als ISO-Code für Chinesisch aufgeführt. Für diejenigen, die nach einer bestimmten Sprache suchen, wie ich es war, versuchen Sie die IANA-Registrierung
Xono
3
zh-Hans ist die einzige Ausnahme oder gibt es andere Sprachcodes, die von der Norm ISO 639-1 abweichen?
MPaulo
57
Warnung: In iOS 9 wurde der Rückgabewert desNSLocale preferredLanguagesgeändert. Wenn Sie zuvor nur "en" erhalten haben, erhalten Sie in iOS 9 "en-US" oder "en-JP" usw. Referenz: happyteamlabs.com/blog/…
Dj S
281

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

[[NSBundle mainBundle] preferredLocalizations];

Beispiel:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

Schnell:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
Mindvision
quelle
Ausgezeichnet, das hat mich auch interessiert. Getestet und es funktioniert richtig!
Smileyborg
5
perfekt! Dadurch kann ich lokalisierte Remote-Ressourcenpfade nur mit den von meiner App unterstützten Sprachen in der gewünschten Reihenfolge erstellen.
Yevhen Dubinin
Was ist, wenn wir danach den gesamten Sprachnamen erhalten möchten?
Shabarinath Pabba
Wenn Sie den gesamten Sprachnamen aus der bevorzugten Lokalisierung abrufen möchten, können Sie [[NSLocale alloc] initWithLocaleIdentifier: language] (von oben) verwenden. Dann haben Sie das Gebietsschema und können displayNameForKey aufrufen.
Vanessa Forney
87

Lösung für iOS 9:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic verfügt über die erforderlichen Komponenten

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode = "US"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode = "en"

amir
quelle
5
kCFLocaleLanguageCodeKey ist eine definierte Konstante, die Sie verwenden können, anstatt eine eigene Zeichenfolge zu erstellen .
SNyamathi
1
NSLocaleLanguageCode = @ "kCFLocaleCountryCodeKey"
Krähe
Verwenden Sie NSLocaleCountryCode und NSLocaleLanguageCode für @ "kCFLocaleCountryCodeKey", @ "kCFLocaleLanguageCodeKey", jeweils
Crow
65

Dies wird Ihnen wahrscheinlich geben, was Sie wollen:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

Es wird der Name der Sprache in der Sprache selbst angezeigt. Zum Beispiel:

Français (France)
English (United States)
Philippe Leybaert
quelle
31
falsche Antwort: Dies gibt das Gebietsschema zurück, nicht die Sprache, die unterschiedlich sein kann ...
Cyrilchampier
4
Dies ist definitiv falsch. Wenn Sie beispielsweise die Sprache in den Telefoneinstellungen auf Englisch und das Format Region einstellen, um beispielsweise Deutsch oder Deutschland zu verwenden, gibt das obige Beispiel "Deutsch" zurück. Die Telefonsprache ist weiterhin auf Englisch eingestellt.
jake_hetfield
2
Das ist überhaupt nicht falsch. Das Gebietsschema enthält sowohl Sprach- als auch Regionsinformationen. In @ jake_hetfields Beispiel würde es also nicht "Deutsch" zurückgeben, sondern "Englisch (Deutschland)". Dies sollte in Kombination mit der Antwort von dreamlab die richtige Antwort sein.
SeanR
36

WarnungDie 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.

func deviceLanguage() -> String? {
    let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
    let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")

    let preferredLanguages: [String] = NSLocale.preferredLanguages()

    for language: String in preferredLanguages {
        let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)

        guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
            continue
        }

        // ex: es_MX.lproj, zh_CN.lproj
        if let countryCode: String = languageComponents[NSLocaleCountryCode] {
            if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
                // returns language and country code because it appears that the actual language is coded within the country code aswell
                // for example: zh_CN probably mandarin, zh_HK probably cantonese
                return language
            }
        }

        // ex: English.lproj, German.lproj
        if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
            if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
                return languageCode
            }
        }

        // ex: pt.lproj, hu.lproj
        if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
            return languageCode
        }
    }

    return nil
}

Dies funktioniert, wenn die Liste der bevorzugten Sprachen lautet:

  1. Afrikaans (iOS wird nicht in Afrikaans übersetzt)
  2. Spanisch (Gerätesprache)

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.

if let deviceLanguageCode: String = deviceLanguage() {
    let printOutputLanguageCode: String = deviceLanguageCode
    let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)

    if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
        // keep in mind that for some localizations this will print a language and a country
        // see deviceLanguage() implementation above
        print(deviceLanguageName)
    }
} 
Dreamlab
quelle
Ich verstehe, dass Sie durch Initialisieren Ihrer Bundle-Instanz mit 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ändert NSBundle.mainBundle()und den erwarteten Sprachcode erhalten.
Palmi
Erläuterung: Die Initialisierung des Bundles mit mainBundle()scheint die von Apple empfohlene zu sein, wie in der Kopfzeile für NSLocale, // 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.
Palmi
@Pouria NSBundle.mainBundle()gibt Ihr App-Bundle zurück, während NSBundle(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.
Dreamlab
1
@Pouria Das Problem könnte sein, dass iOS 9 die Rückgabewerte von geändert hat NSLocale.preferredLanguages(). Ich habe die Antwort aktualisiert, um iOS 9 zu unterstützen .
Dreamlab
@dreamlab Leider liefert dieser Ansatz falsch positive Ergebnisse, wenn Sie Komponenten von Drittanbietern wie Pods mit Lokalisierungen einbeziehen, die Sie in den Projekteinstellungen nicht unterstützen.
Kokoko
12

ich benutze das

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
    NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

Speicherverlust ignorieren ..

und Ergebnis ist

2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español
Enzoyang
quelle
Nur aus Neugier, wo ist das Speicherleck hier?
Kann Poyrazoğlu
Leck - [[[NSLocale alloc] initWithLocaleIdentifier: lan].
Pavel
1
Nur für Nicht-ARC-Projekte.
Josh Hinman
12

Das Übersetzen von Sprachcodes wie en_US ins Englische (USA) ist eine integrierte Funktion von NSLocaleund NSLocalees ist egal, woher Sie die Sprachcodes beziehen . Es gibt also wirklich keinen Grund, Ihre eigene Übersetzung zu implementieren, wie die akzeptierte Antwort nahelegt.

// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);

Drucke: Englisch, Deutsch, Schwedisch

Erik B.
quelle
1
Eigentlich sollten Sie [NSLocale autoupdatingCurrentLocale] verwenden, um Ihre Gebietsschemainstanz zu initialisieren. Auf diese Weise werden die Sprachnamen in der Muttersprache des Benutzers angezeigt. Zum Beispiel wird aus Schwedisch Svenska.
Maciej Swic
8

Es gibt sogar einen besseren Weg, um die aktuelle Gerätesprache zu erhalten. Versuchen wir es mit dem folgenden Code -

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

Vorgeschlagen von Abizern auf hier

Praveenkumar
quelle
7

Sie können die displayNameForKey:value:Methode verwenden von NSLocale:

// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];

// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);

Dies wird ausgedruckt:

français (France)
anglais tats-Unis)

Wenn Sie dieselbe Gebietsschema-ID für die initWithLocaleIdentifier:und auch für die displayNameForKey:value:Methode angeben , erhalten Sie den nativen Namen der Sprache. Ich habe festgestellt, dass, wenn Sie den Ländercode entfernen und nur frund verwenden en, das Land auch im Anzeigenamen weggelassen wird (zumindest unter Mac OS X nicht sicher über iOS).

Dreamlax
quelle
6

Schnell

Aktuelle Gerätesprache abrufen

NSLocale.preferredLanguages()[0] as String

Anwendungssprache erhalten

NSBundle.mainBundle().preferredLocalizations[0] as NSString

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

Durai Amuthan.H
quelle
6

Ich habe versucht, die richtige Lösung für mich zu finden. Bei Verwendung Locale.preferredLanguages.firstwurde 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

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

Informationen zum Auspacken und Verwenden finden Sie in der folgenden Zeile:

if let currentDeviceLanguage = Locale.current.languageCode {
    print("currentLanguage", currentDeviceLanguage)

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}
Roman Romanenko
quelle
Sie müssen nicht auspacken, wenn Sie diese Bundle.main.preferredLocalizations [0] als String verwenden
μολὼν.λαβέ
5

Um die aktuelle Sprache des Benutzergeräts zu erhalten, verwenden Sie den folgenden it-Code, der für mich funktioniert hat.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
Shailendra
quelle
4

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:

    // Returns a list of the user's preferred languages.
    // Maybe more than (or none of) your app supports!
    Locale.preferredLanguages

    // a subset of this bundle's localizations, re-ordered into the preferred order
    // for this process's current execution environment; the main bundle's preferred localizations
    // indicate the language (of text) the user is most likely seeing in the UI
    Bundle.main.preferredLocalizations



    // The current running app language
    Bundle.main.preferredLocalizations.first

    // list of language names this bundle appears to be localized to
    Bundle.main.localizations
norbDEV
quelle
3

Für MonoTouch C # verwenden Entwickler:

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

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.

Chuck Savage
quelle
Ich verwende derzeit NSLocale.PreferredLanguages ​​und erhalte ein leeres Array. Ich nehme an, Sie haben in der Dokumentation gelesen, dass sie möglicherweise nie leer ist, aber ich kann sie nirgendwo sehen?
JFoulkes
Nein, ehrlich gesagt war das nur eine eigene Annahme.
Chuck Savage
@LarryF Sehen Sie sich dieses Video an: jonas.follesoe.no/2011/07/22/cross-platform-mobile-ndc-2011 Es ist sehr informativ, wie Sie Ihre Code- / Multi-Plattform-Apps strukturieren.
Chuck Savage
3

In Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
Lee
quelle
3

Swift 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
Tarik
quelle
Willkommen bei Stack Overflow! Während dieser Code die Frage beantworten kann, ist es besser, eine Beschreibung dessen beizufügen, was das Problem war und wie Ihr Code das gegebene Problem angehen wird. Für die Zukunft hier einige Informationen, wie Sie eine großartige Antwort auf Stack Overflow knacken können .
Dirtydanee
3

Einfache Swift 3-Funktion:

  @discardableResult
  func getLanguageISO() -> String {
    let locale = Locale.current
    guard let languageCode = locale.languageCode,
          let regionCode = locale.regionCode else {
        return "de_DE"
    }
    return languageCode + "_" + regionCode
  }
Sasha Prokhorenko
quelle
3

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:

extension Locale {
static var preferredLanguageIdentifier: String {
    let id = Locale.preferredLanguages.first!
    let comps = Locale.components(fromIdentifier: id)
    return comps.values.first!
}

static var preferredLanguageLocalizedString: String {
    let id = Locale.preferredLanguages.first!
    return Locale.current.localizedString(forLanguageCode: id)!
}

}}

Jovan Stankovic
quelle
2
-(NSString *)returnPreferredLanguage { //as written text

NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;

}
Johnny Rockex
quelle
2

Wenn Sie hier nur Sprache erhalten möchten, ist meine vorgeschlagene Antwort:

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] 
objectAtIndex:0];

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

Danboz
quelle
1

@ Amir Antwort in Swift:

// Get language prefered by user
    let langageRegion = NSLocale.preferredLanguages().first!
    let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
    let language = languageDic[NSLocaleLanguageCode]
CedricSoubrie
quelle
1

Offensichtlich stützen sich die Lösungen zum Beispiel auf

[[NSLocale preferredLanguages] objectAtIndex:0]

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:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults] 
    setObject:[NSArray arrayWithObjects:lg, nil]  
    forKey:@"AppleLanguages"]

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:

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

Dann gibt [NSLocale PreferredLanguages] jetzt den korrekten Wert zurück.

Ich hoffe das hilft.

Chrysotribax
quelle
1

Aktualisierte Antwort für Swift 4

let language = Bundle.main.preferredLocalizations.first
Md. Ibrahim Hassan
quelle
Beachten Sie, dass dadurch die aggregierte Liste der verfügbaren (vom Bundle, dh von Ihnen, unterstützten) und bevorzugten (vom Benutzer) Lokalisierungen abgerufen wird . NSLocale.preferredLanguagessollte die bevorzugten des Benutzers zurückgeben, ohne zu berücksichtigen, was vom Bundle unterstützt wird.
Jonny
1

Für Swift 3.0 kann der folgende Code verwendet werden, um Ihre Frage zu beantworten:

 let language = Bundle.main.preferredLocalizations.first! as NSString
Apurv Soni
quelle
1

In Swift 4.2 und Xcode 10.1

let language = NSLocale.preferredLanguages[0]
print(language)//en
iOS
quelle
0

Laut Apple- Dokumentation

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
Max Tymchii
quelle
0

Zwei-Buchstaben-Format. Apple verwendet den ISO-Standard ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
Jakub Truhlář
quelle
0

Für Swift 3:

NSLocale.preferredLanguages ​​[0] als String

Bill Chan
quelle
0

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.

// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
    static dispatch_once_t onceToken;
    static NSString* lang;
    dispatch_once(&onceToken, ^
    {
        lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
        NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
        NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
        if (match.range.location != NSNotFound)
        {
            lang = [lang substringToIndex:match.range.length];
        }
    });
    return lang;
}
jjxtra
quelle
0

SWIFT-4

 // To get device default selected language. It will print like short name of zone. For english, en or spain, es.



let language = Bundle.main.preferredLocalizations.first! as NSString
    print("device language",language)
anshul-systematix
quelle
Beachten Sie, dass dadurch die aggregierte Liste der verfügbaren (vom Bundle, dh von Ihnen, unterstützten) und bevorzugten (vom Benutzer) Lokalisierungen abgerufen wird . NSLocale.preferredLanguagessollte die bevorzugten des Benutzers zurückgeben, ohne zu berücksichtigen, was vom Bundle unterstützt wird.
Jonny