it-swarm.com.de

Abrufen der aktuellen Gerätesprache in iOS?

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 in vollständig ausgeschriebenem Format. (Nicht @ "de_DE")

BEARBEITEN: Für diejenigen, die mit dem Auto unterwegs sind, gibt es hier eine Menge nützlicher Kommentare, da sich die Antwort mit den neuen iOS-Versionen weiterentwickelt hat.

416
Moshe

Die bereitgestellten Lösungen geben tatsächlich die aktuelle Region des Geräts zurück - nicht die aktuell ausgewählte Sprache. Diese sind oft ein und dasselbe. Wenn ich jedoch in Nordamerika bin und Japanisch als Sprache festgelegt 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 Zwei-Buchstaben-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 ist es einfach, die beiden Buchstabencodes in die Zeichenfolge zu konvertieren, die Sie anzeigen möchten. Wenn es sich also um "en" handelt, wird "Englisch" angezeigt.

Ich hoffe, dies hilft jemandem, der zwischen der Region und der aktuell ausgewählten Sprache unterscheiden möchte.

[~ # ~] edit [~ # ~]

Es lohnt sich, die Header-Informationen von 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 die App-Sprache interessieren, werfen einen Blick auf @ mindvisions Antwort

789
Dubron

Die ausgewählte Antwort gibt die aktuelle Gerätesprache zurück, jedoch nicht die tatsächliche Sprache, die in der App verwendet wird. 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.

Verwenden Sie, um die aktuell in Ihren Lokalisierungen ausgewählte Sprache zu ermitteln

[[NSBundle mainBundle] preferredLocalizations];

Beispiel:

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

Schnell:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
274
mindvision

Lösung für iOS 9:

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic wird die benötigten Komponenten haben

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

countryCode = "US"

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

languageCode = "en"

84
amir

Dies wird Ihnen wahrscheinlich das 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)
64

warning Die akzeptierten und die anderen Antworten berücksichtigen nicht, dass bevorzugte Sprache kann eine andere Sprache als die Gerätesprache sein.

Die Gerätesprache ist die Sprache, in der Betriebssystemelemente und Apple Apps dargestellt werden.

bevorzugte Sprache ist die Sprache, in der Apps vom Benutzer lokalisiert werden sollen. Apple bietet nur eine begrenzte Anzahl von Übersetzungen an. Wenn die bevorzugte Sprache eine Sprache ist, in die Apple ihre Apps übersetzt hat, ist dies auch die Gerätesprache. Allerdings Wenn der Benutzer eine Sprache bevorzugt, für die Apple keine Übersetzungen bereitstellt, stimmt Gerät und bevorzugte Sprachen stimmen nicht überein. Die Gerätesprache steht in der Liste der bevorzugten Sprachen nicht an erster Stelle.

Die folgende Funktion durchsucht die Liste der bevorzugten Sprachen und überprü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 wie folgt lautet:

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

Die Liste der bevorzugten Sprachen kann bearbeitet in sein: Settings.app -> General -> Language & Region -> Preferred Language Order


Sie können dann den Geräte-Sprachcode verwenden und 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)
    }
} 
35
dreamlab

Das Übersetzen von Sprachcodes wie en_US in Englisch (USA) ist eine integrierte Funktion von NSLocale und NSLocale ist Ihnen egal Holen Sie sich die Sprachcodes von. Es gibt also wirklich keinen Grund, eine 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

12
Erik B

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
12
enzoyang

Es gibt sogar eine bessere Möglichkeit, die aktuelle Gerätesprache abzurufen. Versuchen wir es mit folgendem Code:

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

Vorgeschlagen von Abizern am hier

8
Praveenkumar

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

// 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 ausdrucken:

français (France)
anglais (États-Unis)

Wenn Sie für die Methode initWithLocaleIdentifier: Und auch für die Methode displayNameForKey:value: Denselben Gebietsschemabezeichner angeben, wird der native Name der Sprache angegeben. Ich habe festgestellt, dass, wenn Sie den Ländercode entfernen und nur fr und en verwenden, das Land auch aus dem Anzeigenamen entfernt wird (zumindest unter Mac OS X, nicht sicher) iOS).

7
dreamlax

Ich habe versucht, die richtige Lösung für mich zu finden. Bei Verwendung von Locale.preferredLanguages.first Wurde die bevorzugte Sprache aus Ihren App-Einstellungen zurückgegeben.

Wenn Sie die Sprache anhand der Einstellungen des Benutzergeräts kennenlernen möchten, sollten Sie die folgende Zeichenfolge verwenden:

Swift

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

Zum Auspacken und Benutzen schauen Sie sich die folgende Zeile an:

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

    // For example
    if currentDeviceLanguage == "he" {
        UIView.appearance().semanticContentAttribute = .forceRightToLeft
    } else {
        UIView.appearance().semanticContentAttribute = .forceLeftToRight
    }
}
6
Roman Romanenko

Verwenden Sie den folgenden Code, um die aktuelle Sprache des Benutzergeräts zu erhalten.

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
5
shailendra

Swift

Aktuelle Sprache des Geräts abrufen

NSLocale.preferredLanguages()[0] as String

m die Anwendungssprache zu erhalten

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

Anmerkung:

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

5
Durai Amuthan.H

In Swift:

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

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
  }
3

Für MonoTouch C # -Entwickler verwenden Sie:

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

Hinweis: Ich weiß, dass dies eine iOS-Frage war, aber da ich ein MonoTouch-Entwickler bin, hat mich die Antwort auf dieser Seite in die richtige Richtung geführt und ich dachte, ich würde die Ergebnisse teilen.

3
Chuck Savage

Swift

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
3
Tarik

Wenn Sie nach dem bevorzugten Sprachcode ("en", "de", "es" ...) und dem lokalisierten Namen der bevorzugten Sprache (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)!
}

}

3
Jovan Stankovic
-(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;

}
2
Johnny Rockex

Wenn Sie nur Sprache hier bekommen 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 Landessprache Japanisch und Ihre Region Japanisch ist, dann:

langplusreg = ja-JP

langonly = ja

2
Danboz

Aktualisierte Antwort für Swift 4

let language = Bundle.main.preferredLocalizations.first
1

In Swift 4.2 und Xcode 10.1

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

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

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

Wenn Sie ab iOS 9 nur den Sprachcode ohne Ländercode benötigen, 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;
}
0
jjxtra

Format mit zwei Buchstaben. Apple verwendet den ISO-Standard ISO-3166 .

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

Laut Apple Dokumentation

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

Für Swift 3:

NSLocale.preferredLanguages ​​[0] als String

0
Bill Chan

Offensichtlich stützen sich die Lösungen beispielsweise auf

[[NSLocale preferredLanguages] objectAtIndex:0]

funktioniert normalerweise einwandfrei und gibt die aktuelle Gerätesprache zurück.

Aber es könnte in einigen Fällen 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 [NSLocale preferredLanguages] Gibt tatsächlich die in dieser bestimmten App festgelegte (und verwendete) bevorzugte Sprache zurück, nicht die aktuelle Gerätesprache!

Und ... in diesem Fall ist die einzige Möglichkeit, die aktuelle Gerätesprache (und nicht die zuvor in der App festgelegte) korrekt abzurufen, das Löschen des Schlüssels @ "appleLanguages" in NSUserDefaults wie folgt:

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

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

Ich hoffe das hilft.

0
Chrysotribax

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)
0

@amir Antwort in Swift:

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