¿Cómo obtener el código de idioma actual con Swift?

131

Quiero obtener el código de idioma del dispositivo (en, es ...) en mi aplicación escrito con Swift. ¿Cómo puedo conseguir esto?

Estoy intentando esto:

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

Pero esto vuelve nulo.

usuario3739367
fuente

Respuestas:

185

En Swift 3

let langStr = Locale.current.languageCode
Vadim Motorine
fuente
13
debe ser: Locale.current.identifier pero Locale.current.languageCode para los chinos, que siempre vuelven 'zh', pero tendrá que ser distinguir zh-HK, etc
iXcoder
2
@ User9527 Debido a que probablemente no habilitó la localización para ese idioma en la configuración de su proyecto.
Kirill Kudaev
¿No se puede asignar el valor del tipo 'Cadena' al tipo 'Configuración regional?'
Puji Wahono
1
Por lo que veo, devolverá el idioma real configurado en Configuración -> General -> Idioma y región -> Idioma del iPhone SOLO SI la localización de este idioma está habilitada en su proyecto en Proyecto -> Localizaciones. De lo contrario, es lenguaje de desarrollo.
Huralnyk
85

Es importante marcar la diferencia entre el idioma de la aplicación y el idioma de la configuración regional del dispositivo (el código a continuación se encuentra en Swift 3 )

Devolverá el idioma del dispositivo :

let locale = NSLocale.current.languageCode

Devolverá el idioma de la aplicación :

let pre = Locale.preferredLanguages[0]
raed
fuente
44
No entiendo la diferencia entre el idioma del dispositivo o el idioma de la aplicación. ¿Tienes alguna documentación sobre la diferencia?
Jeremías
1
La configuración regional de @Jeremiah contendrá el idioma del dispositivo, por ejemplo, el idioma del dispositivo está configurado en francés. Pre contendrá el idioma preferido del usuario (o aplicación), por ejemplo: su aplicación solo admite chino, por lo que puede instalar una aplicación china en un dispositivo francés. Esperanza clarifiqué este 4 U
raed
Cuando dice que el dispositivo está configurado en francés, ¿qué quiere decir? Parece que si cambio el idioma en la configuración a algo diferente al inglés, se representa en idiomas preferidos pero no en languageCode. ¿Cómo se cambia languageCode?
Jeremías
Si cambia la configuración de entrada a otra que no sea inglés, obtendrá su valor en NSLocale.current.languageCode
enrutado el
9
¿No es al revés? Cuando mi lenguaje de desarrollo de aplicaciones es la norma EN y ejecuta en un dispositivo configurado DE, para el que he localizado la aplicación del resultado es: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de cuando mi lenguaje de desarrollo de aplicaciones es la norma EN y ejecuta en un dispositivo de FR configurado, por lo que he no localizada la aplicación el resultado es: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra
55

Swift 4 y 5:

Locale.current.languageCode
Bogdan Bystritskiy
fuente
¿No se puede asignar el valor del tipo 'Cadena' al tipo 'Configuración regional?'
Puji Wahono
2
Trate Locale(identifier: Locale.current.identifier);
koen
Locale.autoupdatingCurrent.languageCodetambién está disponible
C. Bess
37

En Swift 3:

NSLocale.current.languageCode
mazorati
fuente
35

Para obtener el idioma actual utilizado en su aplicación (diferente de los idiomas preferidos)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Benknopf
fuente
29

Swift 3 y 4 y 4.2 y 5

Locale.current.languageCodeno se compila regularmente Porque no implementó la localización para su proyecto.

Tienes dos posibles soluciones

1) String(Locale.preferredLanguages[0].prefix(2)) Devuelve el teléfono correctamente.

Si desea obtener el tipo en-En, puede usarLocale.preferredLanguages[0]

2) Seleccione Project(MyApp)-> Project (not Target)-> presione el botón + Localizations, luego agregue el idioma que desee.

Ali Ihsan URAL
fuente
¡Esto es realmente interesante! ¿Dónde leíste la solución uno? No se puede encontrar esta información en la documentación de Apple
kuzdu
16

rápido 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
fuente
1
El código de idioma y el código de país separados por "-" tiene errores. Su código se romperá en algunos casos como 'zh-Hans-US'.
Evilisn Jiang
let langStr = Locale.preferredLanguages.first!Esto es lo que he hecho al revisar esta publicación. Está funcionando, y lo comparo con mis idiomas langStr.lowercased().contains("es")para todas las variaciones del idioma español, por ejemplo.
Ian Ortega
8

puede usar el siguiente código, funciona bien con swift 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Amr enojado
fuente
1
¡Este es el que aún funciona con Swift 4! ¡Gracias!
Alex Wally
7

Quiero hacer un seguimiento del idioma elegido por el usuario en la aplicación Configuración cada vez que el usuario inicia mi aplicación, que aún no está localizado (mi aplicación está solo en inglés). Adopté esta lógica:

  1. crear una enumeración para facilitar el manejo de los idiomas en una matriz

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. crear un par de extensiones para 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. Cuando lo necesite, simplemente puede usar la extensión

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
Miniapps
fuente
Gracias @Syscall :)
Miniapps
Me encanta la extensión :). ¿No tiene más sentido devolver ninguno si no puede leer de alguna manera? porque de esa manera ese valor se puede usar para hacer algún valor.
Alix
5

En Swift, puede obtener la configuración regional utilizando.

let locale = Locale.current.identifier
yo2bh
fuente
2

Locale.current.languageCode me devuelve un código incorrecto, así que uso estas extensiones:

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
fuente
0

Esto es lo que uso en Swift 5 Xcode 11:

Dentro de las variables de clase:

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

Esto viene como una cuerda. Devuelve 2 caracteres, es decir, "en", "es", "de" ...

A partir de esto, puedo determinar fácilmente qué idioma mostrar:

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

Si desea la información completa del idioma, elimine? .Prefex (2)

Brian M
fuente