Come ottenere il codice lingua corrente con Swift?


131

Voglio ottenere il codice della lingua del dispositivo (en, es ...) nella mia app scritto con Swift. Come posso ottenerlo?

Sto provando questo:

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

Ma questo restituisce zero.

Risposte:


185

In Swift 3

let langStr = Locale.current.languageCode

13
dovrebbe essere: Locale.current.identifier ma Locale.current.languageCode per il cinese, restituisce sempre "zh", ma deve distinguere zh-HK, ecc.
iXcoder,

2
@ User9527 A causa tua molto probabilmente non hai abilitato la localizzazione per quella lingua nelle impostazioni del tuo progetto.
Kirill Kudaev l'

Impossibile assegnare il valore di tipo "String" al tipo "Locale?"
Puji Wahono,

1
Per quanto noto, restituirà la lingua effettiva impostata in Impostazioni -> Generale -> Lingua e regione -> Lingua iPhone SOLO se la localizzazione per questa lingua è abilitata nel progetto in Progetto -> Localizzazioni. Altrimenti è il linguaggio di sviluppo.
Huralnyk,

85

È importante fare la differenza tra la lingua dell'app e la lingua delle impostazioni locali del dispositivo (il codice seguente è in Swift 3 )

Restituirà la lingua del dispositivo :

let locale = NSLocale.current.languageCode

Restituirà la lingua dell'app :

let pre = Locale.preferredLanguages[0]

4
Non capisco la differenza tra Lingua dispositivo o Lingua app. Hai qualche documentazione sulla differenza?
Geremia,

1
Le impostazioni internazionali @Jeremiah conterranno la lingua del dispositivo, ad esempio la lingua del dispositivo è configurata in francese. Pre conterrà la lingua preferita dell'utente (o dell'app), ad esempio: la tua app supporta solo il cinese, quindi puoi installare un'app cinese su un dispositivo francese. Speranza Ho chiarito questo 4 u
Raed

Quando dici che il dispositivo è configurato in francese cosa intendi? Sembra che se cambio la lingua nelle impostazioni in qualcosa di diverso dall'inglese, questo viene rappresentato nelle lingue preferite ma non in languageCode. Come viene modificato languageCode?
Geremia,

Se si modifica l'nelle impostazioni a qualcosa di diverso che l'inglese si otterrà il valore d'NSLocale.current.languageCode
Raed

9
Non è il contrario? Quando la mia app linguaggio di sviluppo è IT e ho eseguito su un dispositivo configurato DE, per il quale ho localizzato l'applicazione il risultato è il seguente: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Quando il mio app linguaggio di sviluppo è IT e corro su un dispositivo FR configurato, per il quale ho non localizzato il app il risultato è: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra

55

Swift 4 e 5:

Locale.current.languageCode

Impossibile assegnare il valore di tipo "String" al tipo "Locale?"
Puji Wahono,

2
Provare Locale(identifier: Locale.current.identifier);
Koen,

Locale.autoupdatingCurrent.languageCodeè anche disponibile
C. Bess il


35

Per utilizzare la lingua corrente nella tua app (diversa dalle lingue preferite)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

Swift 3 & 4 & 4.2 & 5

Locale.current.languageCodenon si compila regolarmente. Perché non hai implementato la localizzazione per il tuo progetto.

Hai due possibili soluzioni

1) String(Locale.preferredLanguages[0].prefix(2)) Restituisce correttamente la lingua del telefono.

Se vuoi ottenere il tipo en-En, puoi usareLocale.preferredLanguages[0]

2) Seleziona Project(MyApp)-> Project (not Target)-> premi il pulsante + in Localizations, quindi aggiungi la lingua che desideri.


Questo è davvero interessante! Dove hai letto la soluzione 1? Non è possibile trovare queste informazioni nella documentazione di Apple
kuzdu,

16

veloce 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
Il codice lingua separato e il codice paese per "-" sono errati. Il tuo codice si romperà in alcuni casi come "zh-Hans-US".
Evilisn Jiang,

let langStr = Locale.preferredLanguages.first!questo è quello che ho fatto rivedendo questo post. Funziona e paragone con le mie lingue con, langStr.lowercased().contains("es")ad esempio, per tutte le varianti della lingua spagnola.
Ian Ortega,

8

è possibile utilizzare il codice seguente funziona perfettamente con Swift 3

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

1
Questo è quello che funziona ancora con Swift 4! Grazie!
Alex Wally,

7

Voglio tracciare la lingua scelta dall'utente nell'app Impostazioni ogni volta che l'utente avvia la mia app, che non è ancora localizzata (la mia app è solo in inglese). Ho adottato questa logica:

  1. creare un enum per semplificare la gestione delle lingue nell'array

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. crea un paio di estensioni a 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. Quando ne hai bisogno, puoi semplicemente usare l'estensione

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

Grazie @Syscall :)
Miniapps

Adoro l'estensione :). Non avrebbe più senso restituire nessuno se non fosse in grado di leggere in qualche modo. perché in quel modo quel valore può essere usato per ricavarne un valore.
Alix,

5

In Swift, è possibile ottenere le impostazioni internazionali utilizzando.

let locale = Locale.current.identifier

2

Locale.current.languageCode mi restituisce un codice errato, quindi utilizzo queste estensioni:

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

Questo è quello che uso in Swift 5 Xcode 11:

All'interno delle variabili di classe:

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

Questo viene come una stringa. Restituisce 2 caratteri, ovvero "en", "es", "de" ...

Da questo posso facilmente determinare quale lingua visualizzare:

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

Se desideri le informazioni complete sulla lingua, rimuovi? .Prefex (2)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.