458 Stimmen

Aktuelle Gerätesprache in iOS abrufen?

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 ausgeschriebener Form. (Nicht @"en_US")

EDIT: Für diejenigen, die vorbeifahren, gibt es hier eine Menge nützlicher Kommentare, da sich die Antwort mit neuen iOS-Versionen weiterentwickelt hat.

1 Stimmen

Dies ist eingebaut in NSLocale . Siehe meine Antwort.

18 Stimmen

iOS9 Kommentar: achten Sie darauf, dass Apple aus irgendeinem Grund das Format geändert hat, das von [NSLocale preferredLanguages] . früher wurde sie durch einen Unterstrich getrennt (z. B. en_US ), aber jetzt wurde er in einen Bindestrich umgewandelt: en-US

7 Stimmen

Mehr zu iOS9: Der Erhalt von [NSLocale preferredLanguages] auf einem iOS 8.4-Simulator im Vergleich zu einem 9.0-Simulator weist ebenfalls Diskrepanzen auf. Auf iOS 8.4 ist es "en" und iOS 9.0 ist es "en-US".

833voto

Dubron Punkte 8581

Die angebotenen Lösungen geben die aktuelle Region des Geräts zurück - nicht die aktuell ausgewählte Sprache. Diese sind oft ein und dasselbe. Wenn ich mich jedoch in Nordamerika befinde und meine Sprache auf Japanisch eingestellt habe, wird meine Region immer noch Englisch (Vereinigte Staaten) sein. Um die aktuell ausgewählte Sprache abzurufen, können Sie Folgendes tun:

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

Dies gibt einen zweistelligen 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 anzuzeigende Zeichenfolge umwandeln. Wenn es also "en" ist, wird "Englisch" angezeigt.

EDITAR

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

Wer sich für die Sprache der Apps interessiert, sollte einen Blick darauf werfen @mindvision's Antwort

2 Stimmen

Genau das, wonach ich gesucht habe. Ich hatte das gleiche Problem, bei dem die Region nicht mit der Sprache übereinstimmt.

13 Stimmen

Schlechte Antwort: gibt zh-Hans für Chinesisch zurück, was nicht der Iso-Code ist.

2 Stimmen

Die ersten beiden Zeichen geben das Land an, die Zeichen nach dem Bindestrich die Region, der Rest dient nur zur weiteren Eingrenzung (z. B. lokale Dialekte). zh ist als Iso-Code für Chinesisch aufgeführt. Wer, wie ich, nach einer bestimmten Sprache sucht, kann es mit der IANA-Register

292voto

mindvision Punkte 2869

Die gewählte Antwort gibt die aktuelle Gerätesprache zurück, nicht aber die tatsächlich in der Anwendung verwendete Sprache. Wenn Sie in Ihrer App keine Lokalisierung für die bevorzugte Sprache des Benutzers bereitstellen, wird die erste verfügbare Lokalisierung, geordnet nach der vom Benutzer bevorzugten Reihenfolge, verwendet.

Um die aktuell gewählte Sprache innerhalb Ihrer Lokalisierungen zu ermitteln, verwenden Sie

[[NSBundle mainBundle] preferredLocalizations];

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

Schnell:

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

0 Stimmen

Was ist, wenn wir den gesamten Namen der Sprache danach erhalten wollen?

0 Stimmen

Wenn Sie den gesamten Sprachnamen aus der preferredLocalization erhalten möchten, können Sie [[NSLocale alloc] initWithLocaleIdentifier:language] (von oben) verwenden. Dann haben Sie die Locale und können displayNameForKey aufrufen.

0 Stimmen

Hey, es funktioniert nicht für iOS 14.5, ich habe die Gerätesprache auf Spanisch eingestellt und die App bekommt immer noch die englische Sprache. Ich weiß nicht, warum.

92voto

amir Punkte 1292

Lösung für iOS 9:

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

Sprache = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic wird die erforderlichen Komponenten enthalten

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

countryCode = "US"

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

languageCode = "de"

5 Stimmen

kCFLocaleLanguageCodeKey ist eine definierte Konstante, die Sie verwenden können, anstatt eine eigene Zeichenfolge zu erstellen.

1 Stimmen

NSLocaleLanguageCode = @"kCFLocaleCountryCodeKey"

0 Stimmen

NSLocaleCountryCode und NSLocaleLanguageCode für @"kCFLocaleCountryCodeKey" bzw. @"kCFLocaleLanguageCodeKey" verwenden

67voto

Philippe Leybaert Punkte 161931

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)

35 Stimmen

Falsche Antwort: dies gibt das Gebietsschema zurück, nicht die Sprache, die unterschiedlich sein kann...

6 Stimmen

Das ist definitiv falsch. Wenn Sie zum Beispiel die Sprache in den Telefoneinstellungen auf Englisch und das Regionalformat auf, sagen wir, Deutsch, Deutschland einstellen, wird im obigen Beispiel "Deutsch" angezeigt. Die Sprache des Telefons ist jedoch auf Englisch eingestellt.

2 Stimmen

Das ist gar nicht so falsch. Das Gebietsschema enthält sowohl Sprach- als auch Regionalinformationen. In @jake_hetfields Beispiel würde also nicht "Deutsch", sondern "Englisch (Deutschland)" zurückgegeben. In Kombination mit der Antwort von dreamlab sollte dies die richtige Antwort sein.

38voto

dreamlab Punkte 3346

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

El Gerätesprache ist die Sprache, in der die Elemente des Betriebssystems und die Apple-Anwendungen dargestellt werden.

El bevorzugte Sprache ist die Sprache, in der der Benutzer die Anwendungen lokalisiert haben 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, wird dies auch die Gerätesprache sein. Allerdings wenn der Benutzer eine Sprache bevorzugt, für die Apple keine Übersetzungen anbietet, wird die Gerät und bevorzugte Sprachen stimmen nicht überein . Die Gerätesprache wird nicht an erster Stelle in der Liste der bevorzugten Sprachen stehen.

Die folgende Funktion geht die Liste der bevorzugten Sprachen durch und prüft, ob es eine Übersetzung in den Apple-Frameworks gibt. Die erste Sprache, für die es eine Übersetzung gibt, ist die Gerätesprache. Die Funktion gibt den 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 ist nicht ins Afrikaans übersetzt)
  2. Spanisch (Gerätesprache)

El Liste der bevorzugten Sprachen kann sein bearbeitet in : Einstellungen.app -> Allgemein -> Sprache & Region -> Bevorzugte Sprachreihenfolge


Sie können dann den Sprachcode des Geräts verwenden und ihn in den Namen der Sprache übersetzen. In den folgenden Zeilen wird die Gerätesprache in der Gerätesprache ausgegeben. 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)
    }
}

0 Stimmen

Meines Erachtens wird durch die Initialisierung Ihrer Bundle-Instanz mit NSBundle(forClass: UIView.self) Sie versuchen, die spezifischste Sprache für eine bestimmte Ansicht zu finden. Bei der Verwendung dieser Methode stieß ich jedoch auf ein Problem, bei dem für die angegebene Klasse keine Sprache zurückgegeben wurde. Ich änderte die Initialisierung in NSBundle.mainBundle() und erhielt den erwarteten Sprachcode zurück.

0 Stimmen

Klarstellung: Die Initialisierung des Bundles mit mainBundle() scheint die von Apple empfohlene zu sein, wie sie 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 .

0 Stimmen

@Pouria NSBundle.mainBundle() gibt Ihr App-Bundle zurück, während NSBundle(forClass: UIView.self) gibt das UIKit-Bundle des Systems zurück. Die beschriebene Methode sucht nach Verzeichnissen im Bundle. Ihr App-Bundle enthält nur die Verzeichnisse für die Sprachen, die Sie lokalisieren möchten. Um die Gerätesprache zu bestimmen, müssen Sie das System-Bundle überprüfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X