Wie erhalte ich mit Swift den aktuellen Sprachcode?


130

Ich möchte den Sprachcode des Geräts (en, es ...) in meiner mit Swift geschriebenen App erhalten. Wie kann man das bekommen?

Ich versuche das:

var preferredLanguages : NSLocale!
let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)

Aber das gibt nichts zurück.

Antworten:


184

In Swift 3

let langStr = Locale.current.languageCode

13
sollte sein: Locale.current.identifier aber Locale.current.languageCode für Chinesisch, es gibt immer 'zh' zurück, aber es muss zh-HK usw. unterschieden werden
iXcoder

2
@ User9527 Wegen Ihnen haben Sie wahrscheinlich die Lokalisierung für diese Sprache in Ihren Projekteinstellungen nicht aktiviert.
Kirill Kudaev

Kann dem Typ 'Gebietsschema' keinen Wert vom Typ 'String' zuweisen?
Puji Wahono

1
Soweit ich weiß, wird die unter Einstellungen -> Allgemein -> Sprache & Region -> iPhone-Sprache festgelegte tatsächliche Sprache NUR zurückgegeben, wenn die Lokalisierung für diese Sprache in Ihrem Projekt unter Projekt -> Lokalisierungen aktiviert ist. Ansonsten ist es Entwicklungssprache.
Huralnyk

84

Es ist wichtig, den Unterschied zwischen der App-Sprache und der Sprache des Gerätegebietsschemas zu machen (Der folgende Code befindet sich in Swift 3 ).

Gibt die Gerätesprache zurück :

let locale = NSLocale.current.languageCode

Gibt die App- Sprache zurück:

let pre = Locale.preferredLanguages[0]

4
Ich verstehe den Unterschied zwischen Gerätesprache und App-Sprache nicht. Haben Sie Unterlagen über den Unterschied?
Jeremiah

1
Das Gebietsschema @Jeremiah enthält die Gerätesprache. Beispielsweise ist Ihre Gerätesprache auf Französisch konfiguriert. Pre enthält die vom Benutzer (oder der App) bevorzugte Sprache. Beispiel: Ihre App unterstützt nur Chinesisch, sodass Sie eine chinesische App auf einem französischen Gerät installieren können. Hoffe, ich habe diese 4 u
raed

Wenn Sie sagen, dass das Gerät auf Französisch konfiguriert ist, was meinen Sie damit? Es scheint, dass wenn ich die Sprache in den Einstellungen auf etwas anderes als Englisch ändere, sie in bevorzugten Sprachen dargestellt wird, aber nicht in languageCode. Wie wird languageCode geändert?
Jeremiah

Wenn Sie die Einstellungen in etwas anderes als Englisch ändern, erhalten Sie den Wert in NSLocale.current.languageCode
raed

9
Ist es nicht umgekehrt? Wenn meine App-Entwicklungssprache EN ist und ich auf einem DE-konfigurierten Gerät ausgeführt werde, für das ich die App lokalisiert habe, lautet das Ergebnis: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Wenn meine App-Entwicklungssprache EN ist und ich auf einem FR-konfigurierten Gerät ausgeführt habe, für das ich das nicht lokalisiert habe App das Ergebnis ist: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra

55

Swift 4 & 5:

Locale.current.languageCode

Kann dem Typ 'Gebietsschema' keinen Wert vom Typ 'String' zuweisen?
Puji Wahono

2
Versuchen Sie es Locale(identifier: Locale.current.identifier);
Koen

Locale.autoupdatingCurrent.languageCodeist auch verfügbar
C. Bess


35

Um die aktuelle Sprache in Ihrer App zu verwenden (anders als die bevorzugten Sprachen)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

Swift 3 & 4 & 4.2 & 5

Locale.current.languageCodekompiliert nicht regelmäßig. Weil Sie keine Lokalisierung für Ihr Projekt implementiert haben.

Sie haben zwei mögliche Lösungen

1) String(Locale.preferredLanguages[0].prefix(2)) Das Telefon wird ordnungsgemäß zurückgegeben.

Wenn Sie den Typ erhalten möchten en-En, können Sie verwendenLocale.preferredLanguages[0]

2) Wählen Sie Project(MyApp)-> Project (not Target)-> drücken Sie die Taste + Localizationsund fügen Sie die gewünschte Sprache hinzu.


Das ist wirklich interessant! Wo haben Sie Lösung eins gelesen? Kann diese Information nicht in der
Apfeldokumentation

16

schnell 3

let preferredLanguage = Locale.preferredLanguages[0] as String
print (preferredLanguage) //en-US

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en

1
Die Trennung von Sprachcode und Ländercode durch "-" ist fehlerhaft. Ihr Code wird in einigen Fällen wie "zh-Hans-US" beschädigt.
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!Dies ist, was ich getan habe, um diesen Beitrag zu überprüfen. Es funktioniert und ich vergleiche meine Sprachen langStr.lowercased().contains("es")zum Beispiel mit allen spanischen Sprachvarianten.
Ian Ortega

8

Sie können den folgenden Code verwenden, es funktioniert gut mit Swift 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!

1
Dies ist derjenige, der tatsächlich noch mit Swift 4 funktioniert! Vielen Dank!
Alex Wally

7

Ich möchte die vom Benutzer in der Einstellungen-App ausgewählte Sprache jedes Mal verfolgen, wenn der Benutzer meine App startet - das ist noch nicht lokalisiert (meine App ist nur in Englisch). Ich habe diese Logik übernommen:

  1. Erstellen Sie eine Aufzählung , um den Umgang mit den Sprachen im Array zu vereinfachen

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. Erstellen Sie einige Erweiterungen für das Gebietsschema

    extension Locale {
    
        static var enLocale: Locale {
    
            return Locale(identifier: "en-EN")
        } // to use in **currentLanguage** to get the localizedString in English
    
        static var currentLanguage: Language? {
    
            guard let code = preferredLanguages.first?.components(separatedBy: "-").last else {
    
                print("could not detect language code")
    
                return nil
            }
    
            guard let rawValue = enLocale.localizedString(forLanguageCode: code) else {
    
                print("could not localize language code")
    
                return nil
            }
    
            guard let language = Language(rawValue: rawValue) else {
    
                print("could not init language from raw value")
    
                return nil
            }
            print("language: \(code)-\(rawValue)")
    
            return language
        }
    }
  3. Bei Bedarf können Sie einfach die Erweiterung verwenden

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }

Danke @Syscall :)
Miniapps

Ich liebe die Erweiterung :). Wäre es nicht sinnvoller, keine zurückzugeben, wenn es nicht in der Lage ist, irgendwie zu lesen? weil auf diese Weise dieser Wert verwendet werden kann, um einen Wert zu erzeugen.
Alix

5

In Swift können Sie das Gebietsschema mit abrufen.

let locale = Locale.current.identifier

2

Locale.current.languageCode Gibt mir falschen Code zurück, daher verwende ich diese Erweiterungen:

extension Locale {
    static var preferredLanguageCode: String {
        let defaultLanguage = "en"
        let preferredLanguage = preferredLanguages.first ?? defaultLanguage
        return Locale(identifier: preferredLanguage).languageCode ?? defaultLanguage
    }

    static var preferredLanguageCodes: [String] {
        return Locale.preferredLanguages.compactMap({Locale(identifier: $0).languageCode})
    }
}

0

Folgendes verwende ich in Swift 5 Xcode 11:

Innerhalb der Klassenvariablen:

let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)

Dies kommt als Zeichenfolge. Es werden 2 Zeichen zurückgegeben, dh "en", "es", "de" ...

Daraus kann ich leicht bestimmen, welche Sprache angezeigt werden soll:

 if languagePrefix == "es" { self.flipCard.setTitle("última carta", for: .normal) }
 if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }

Wenn Sie die vollständigen Informationen der Sprache wünschen, entfernen Sie? .Prefex (2)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.