Comment obtenir le code de langue actuel avec Swift?

131

Je veux obtenir le code de langue de l'appareil (en, es ...) dans mon application écrit avec Swift. Comment pouvez-vous obtenir cela?

J'essaye ceci:

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

Mais cela renvoie nul.

user3739367
la source

Réponses:

185

Dans Swift 3

let langStr = Locale.current.languageCode
Vadim Motorine
la source
13
devrait être: Locale.current.identifier mais Locale.current.languageCode pour le chinois, il renvoie toujours 'zh', mais il doit être distingué zh-HK, etc
iXcoder
2
@ User9527 À cause de vous, vous n'avez probablement pas activé la localisation pour cette langue dans les paramètres de votre projet.
Kirill Kudaev
Impossible d'attribuer une valeur de type "Chaîne" au type "Locale?"
Puji Wahono
1
Pour autant que je le remarque, il renverra la langue réelle définie dans Paramètres -> Général -> Langue et région -> Langue iPhone UNIQUEMENT SI la localisation pour cette langue est activée dans votre projet sous Projet -> Localisations. Sinon, c'est un langage de développement.
Huralnyk
86

Il est important de faire la différence entre la langue de l' application et la langue locale de l' appareil (le code ci-dessous est en Swift 3 )

Renvoie la langue de l' appareil :

let locale = NSLocale.current.languageCode

Renvoie la langue de l' application :

let pre = Locale.preferredLanguages[0]
raed
la source
4
Je ne comprends pas la différence entre la langue de l'appareil et la langue de l'application. Avez-vous de la documentation sur la différence?
Jérémie
1
@Jeremiah locale contiendra la langue de l'appareil, par exemple la langue de votre appareil est configurée en français. Pre contiendra la langue préférée de l'utilisateur (ou de l'application), par exemple: votre application ne prend en charge que le chinois, vous pouvez donc installer une application chinoise sur un appareil français. J'espère avoir clarifié ce 4 u
raed
Lorsque vous dites que l'appareil est configuré en français, que voulez-vous dire? Il semble que si je change la langue dans les paramètres pour quelque chose d'autre que l'anglais, il est représenté dans les langues préférées mais pas dans languageCode. Comment languageCode est-il changé?
Jérémie
Si vous modifiez les paramètres dans quelque chose d' autre que l' anglais , vous obtiendrez sa valeur NSLocale.current.languageCode
lrie
9
N'est-ce pas l'inverse? Lorsque mon langage de développement d'application est EN et que je l'exécute sur un appareil configuré DE, pour lequel j'ai localisé l'application, le résultat est: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Lorsque mon langage de développement d'application est EN et que je l'exécute sur un appareil configuré FR, pour lequel je n'ai pas localisé le app le résultat est: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra
55

Swift 4 et 5:

Locale.current.languageCode
Bogdan Bystritskiy
la source
Impossible d'attribuer une valeur de type "Chaîne" au type "Locale?"
Puji Wahono
2
Essayez Locale(identifier: Locale.current.identifier);
koen
Locale.autoupdatingCurrent.languageCodeest également disponible
C. Bess le
37

Dans Swift 3:

NSLocale.current.languageCode
Mazorati
la source
35

Pour obtenir la langue actuelle utilisée dans votre application (différente des langues préférées)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Benknopf
la source
29

Swift 3 et 4 et 4.2 et 5

Locale.current.languageCodene compile pas régulièrement. Parce que vous n'avez pas implémenté la localisation pour votre projet.

Vous avez deux solutions possibles

1) String(Locale.preferredLanguages[0].prefix(2)) Il renvoie correctement la langue du téléphone.

Si vous souhaitez obtenir le type en-En, vous pouvez utiliserLocale.preferredLanguages[0]

2) Sélectionnez Project(MyApp)-> Project (not Target)-> appuyez sur le bouton + dans Localizations, puis ajoutez la langue souhaitée.

Ali Ihsan URAL
la source
C'est vraiment intéressant! Où avez-vous lu la première solution? Impossible de trouver ces informations dans la documentation Apple
kuzdu
16

rapide 3

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

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
Bassant Ashraf
la source
1
Séparer le code de langue et le code de pays par "-" est un buggy. Votre code se cassera dans certains cas comme «zh-Hans-US».
Evilisn Jiang
let langStr = Locale.preferredLanguages.first!c'est ce que j'ai fait en examinant ce post. Cela fonctionne, et je compare avec mes langues avec langStr.lowercased().contains("es")pour toutes les variantes de la langue espagnole par exemple.
Ian Ortega le
8

vous pouvez utiliser le code ci-dessous, cela fonctionne bien avec swift 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Amr en colère
la source
1
C'est celui qui fonctionne toujours avec Swift 4! Merci!
Alex Wally
7

Je souhaite suivre la langue choisie par l'utilisateur dans l'application Paramètres à chaque fois que l'utilisateur lance mon application - qui n'est pas encore localisée (mon application est en anglais uniquement). J'ai adopté cette logique:

  1. créer une énumération pour faciliter la gestion des langues dans un tableau

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. créer une ou deux extensions de Locale

    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. Lorsque vous en avez besoin, vous pouvez simplement utiliser l'extension

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
Miniapps
la source
Merci @Syscall :)
Miniapps
J'adore l'extension :). Ne serait-il pas plus logique d'en renvoyer aucun s'il n'est pas capable de lire d'une manière ou d'une autre. parce que de cette façon, cette valeur peut être utilisée pour créer de la valeur.
Alix
5

Dans Swift, vous pouvez obtenir les paramètres régionaux en utilisant.

let locale = Locale.current.identifier
yo2bh
la source
2

Locale.current.languageCode me renvoie un code erroné, j'utilise donc ces extensions:

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})
    }
}
ChikabuZ
la source
0

C'est ce que j'utilise dans Swift 5 Xcode 11:

À l'intérieur des variables de classe:

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

Cela vient comme une chaîne. Il renvoie 2 caractères, c'est à dire "en", "es", "de" ...

À partir de là, je peux facilement déterminer la langue à afficher:

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

Si vous voulez des informations complètes sur la langue, supprimez? .Prefex (2)

Brian M
la source