Frage

Ich mag die aktuelle Sprache zeigen, dass das Gerät UI verwendet. Was Code würde ich verwenden?

Ich möchte dies als NSString in vollständig ausgeschrieben Format. (Nicht @ "en_US")

EDIT:. Denn auf diejenigen Fahren durch, es gibt eine Tonne von nützlichen Kommentare hier, wie die Antwort mit neuen iOS Versionen entwickelt hat

War es hilfreich?

Lösung

Die zur Verfügung gestellten Lösungen tatsächlich den aktuellen Bereich der Vorrichtung zurückkehren - nicht die aktuell ausgewählten Sprache. Diese sind oft ein und dasselbe. Wenn ich jedoch in Nordamerika bin und ich stelle meine Sprache auf Japanisch, wird meine Region nach wie vor Englisch (USA) sein. Um die aktuell ausgewählte Sprache abzurufen, können Sie tun:

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

Dies wird wieder einen zweistelligen Code für die aktuell gewählte Sprache. "En" für Englisch, "es" für Spanisch, "de" für Deutsch usw. Weitere Beispiele finden Sie in diesem Wikipedia-Eintrag (insbesondere die 639-1 Spalte):

Liste der ISO 639-1 Codes

Dann ist es einfach eine Frage der Umwandlung der beiden Buchstaben-Codes an die Zeichenfolge, die Sie möchten, anzuzeigen. Also, wenn es "en", Anzeige "English".

Hope, das hilft jemand, der zwischen Region und aktuell ausgewählte Sprache zu unterscheiden sucht.

Bearbeiten

Worth 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

interessierte Menschen in App Sprache zu sehen @ Mindvision Antwort

Andere Tipps

Die gewählte Antwort liefert die aktuelle Gerätesprache, aber nicht die eigentliche Sprache in der App verwendet. Wenn Sie nicht über eine Lokalisierung in Ihrer Anwendung für den bevorzugte Sprache des Benutzers bereitzustellen, die ersten Lokalisierung zur Verfügung, die von dem vom Benutzer bevorzugten Reihenfolge geordnet, verwendet wird.

die aktuelle Sprache in Ihren Lokalisierungen ausgewählt Um herauszufinden, verwendet

[[NSBundle mainBundle] preferredLocalizations];

Beispiel:

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

Swift:

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

Lösung für iOS 9:

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

language = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic werden die benötigten Komponenten

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

= country "US"

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

Sprachcode = "en"

Dies wird Ihnen wahrscheinlich, was Sie wollen:

NSLocale *locale = [NSLocale currentLocale];

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

Es wird den Namen der Sprache zeigen, in der Sprache selbst. Zum Beispiel:

Français (France)
English (United States)

„Warnung“ Die akzeptierte, und die anderen Antworten alle nehmen Sie nicht zu berücksichtigen, dass die bevorzugt Sprache kann eine andere Sprache als die Gerätesprache sein .

Die Gerätesprache ist die Sprache, in dem Betriebssystemelement und Apple-Anwendungen präsentiert werden.

Die bevorzugte Sprache ist die Sprache der Benutzer Anwendungen in lokalisiert haben möchte. Apple stellt nur eine begrenzte Anzahl an Übersetzungen. Wenn die bevorzugte Sprache ist eine Sprache von Apple ihre Apps übersetzt, wird es auch die Gerätesprache sein. Doch , wenn der Benutzer bevorzugt eine Sprache, für die Apple-bietet keine Übersetzungen, die Gerät und bevorzugten Sprachen werden entsprechen nicht . Die Gerätesprache auf dem ersten Position nicht in der bevorzugten Sprachen Liste sein wird.

Die folgende Funktion wird die bevorzugte Sprache Liste durchgehen und prüfen, ob eine Übersetzung in dem Apple-Frameworks ist. Die erste Sprache eine Übersetzung haben, ist die Gerätesprache. Die Funktion wird seinen 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 bevorzugte Sprache Liste ist:

  1. Afrikaans (iOS nicht in Afrikaans übersetzt) ??
  2. Spanisch (Device Language)

Die die gewünschte Sprache Liste kann sein editierten in : Settings.app -> Allgemein -> Sprache und Region -> Bevorzugte Sprache Order


Sie können als das Gerät Sprachcode verwenden und sie in die Sprache Namen übersetzen. Die folgenden Zeilen werden die Gerätesprache in der Gerätesprache drucken. 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)
    }
} 

Ich benutze diesen

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

ignoriert Speicherverlust ..

und Ergebnis

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

Übersetzen von Sprachcodes wie en_US in Englisch (USA) ist eine eingebaute Funktion von NSLocale und NSLocale kümmert sich nicht darum, wo Sie die Sprachcodes von bekommen. So gibt es wirklich keinen Grund, Ihre eigene Übersetzung zu implementieren, wie die akzeptierte Antwort vermuten läßt.

// 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);

Prints: Englisch, Deutsch, Schwedisch

Auch gibt es eine bessere Art und Weise aktuelle Gerätesprache zu erhalten. Lassen Sie uns versuchen, es von unten Code -

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

Vorgeschlagen von Abizern auf hier

Sie können die displayNameForKey:value: Methode verwenden 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 ausdrucken:

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

Wenn Sie die gleiche Gebietsschemabezeichner für die initWithLocaleIdentifier: und auch die displayNameForKey:value: Methode angeben, dann wird es geben Ihnen die einheimischen Namen der Sprache. Ich habe entdeckt, dass, wenn Sie den Ländercode entfernen und verwende nur fr und en, dass es auch das Land, aus dem Anzeigenamen nicht angegeben wird (unter Mac OS X zumindest nicht sicher iOS).

Ich habe versucht, die richtige Lösung für mich herausgefunden. Als ich Locale.preferredLanguages.first verwenden wurde die gewünschte Sprache aus dem App-Einstellungen zurück.

Wenn Sie die Sprache von Einstellungen Benutzergerät kennen lernen, sollten Sie die Verwendung Zeichenfolge unter:

Swift 3

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

auszupacken und Nutzung Blick auf die Zeile unter:

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

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

Code der folgenden es Benutzergerät aktuelle Sprachgebrauch immer es für mich gearbeitet.

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

Swift

Um aktuelle Sprache des Geräts zu erhalten

NSLocale.preferredLanguages()[0] as String

Anwendungssprache erhalten

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

Hinweis:

Es holt die Sprache, die Sie in gegeben haben CFBundleDevelopmentRegion von info.plist

, wenn CFBundleAllowMixedLocalizations ist wahr in info.plist dann erste Element von CFBundleLocalizations in info.plist zurückgegeben

Für Monotouch C # Entwickler verwenden:

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

. Hinweis: Ich weiß, dass dies eine iOS Frage war, aber als ich ein Monotouch Entwickler bin, ist die Antwort auf dieser Seite führte mich in der richtigen Richtung und ich dachte, dass ich die Ergebnisse gemeinsam nutzen würde

In Swift:

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

Swift 3

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

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
  }

Wenn Sie sich für die gewünschte Sprache Code ( "en", "de", "es" ...) und lokalisierte bevorzugte Sprache Namen (für aktuelle locale) suchen, ist 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)!
}

}

-(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;

}

Wenn Sie hier nur die Sprache bekommen wollen, ist meine vorgeschlagene Antwort:

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

In meinem Fall wollte ich nur nur Locale Sprache nicht locale Region.

Ausgabe: Wenn Ihre Locale Sprache ist japanisch und locale Region ist Japan dann:

langplusreg = ja-JP

langonly = ja

aktualisiert Antwort für Swift 4

let language = Bundle.main.preferredLocalizations.first

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

 let language = Bundle.main.preferredLocalizations.first! as NSString

In Swift 4.2 und Xcode 10.1

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

Laut Apple Dokumentation

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

Zwei Buchstaben-Format. Apple verwendet die ISO-Norm ISO-3166 .

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];

@amir Antwort in Swift:

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

Für Swift 3:

NSLocale.preferredLanguages ??[0] als String

Wie von iOS 9, wenn Sie nur den Sprachcode möchten, ohne Ländervorwahl, werden Sie diese Art von Hilfsfunktion wollen -. Da die Sprache der Ländercode enthalten

// 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;
}

Offensichtlich sind die Lösungen angewiesen, beispielsweise auf

[[NSLocale preferredLanguages] objectAtIndex:0]

in der Regel gut funktionieren und gibt die aktuelle Gerätesprache.

Aber es könnte in manchen Fällen irreführend sein:

Wenn die App, in dem Sie diesen Wert erhalten mögen bereits die Sprache geändert, zum Beispiel 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] tatsächlich gibt die bevorzugte Sprache Satz (und verwendet) in dieser speziellen Anwendung, nicht die aktuelle Gerätesprache!

Und ... in diesem Fall ist der einzige Weg, um richtig die tatsächliche aktuelle Geräte Sprache zu erhalten (und nicht vorher in der App gesetzt), ist zum einen die Schlüssel löschen @ „appleLanguages“ in NSUserDefaults, wie folgt aus:

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

Dann [NSLocale preferredLanguages] gibt nun den korrekten Wert.

Hope diese Hilfe.

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top