Como obter o código de idioma atual com o Swift?

131

Quero obter o código do idioma do dispositivo (en, es ...) no meu aplicativo, escrito com Swift. Como conseguir isso?

Estou tentando isso:

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

Mas isso retorna nulo.

user3739367
fonte

Respostas:

185

Em Swift 3

let langStr = Locale.current.languageCode
Vadim Motorine
fonte
13
deve ser: Locale.current.identifier, mas Locale.current.languageCode para chinês, ele sempre retorna 'zh', mas precisa distinguir zh-HK, etc #
iXcoder
2
@ User9527 Por sua causa, você provavelmente não ativou a localização para esse idioma nas configurações do seu projeto.
Kirill Kudaev 11/03/19
Não é possível atribuir um valor do tipo 'String' ao tipo 'Localidade?'
Puji Wahono 04/07/19
1
Tanto quanto eu percebo, ele retornará o idioma real definido em Configurações -> Geral -> Idioma e região -> Idioma do iPhone SOMENTE SE A localização desse idioma estiver ativada no seu projeto em Projeto -> Localizações. Caso contrário, é uma linguagem de desenvolvimento.
Huralnyk 19/11/19
85

É importante fazer a diferença entre o idioma do aplicativo e o idioma do local do dispositivo (o código abaixo está no Swift 3 )

Retornará o idioma do dispositivo :

let locale = NSLocale.current.languageCode

Retornará o idioma do aplicativo :

let pre = Locale.preferredLanguages[0]
raed
fonte
4
Não entendo a diferença entre o idioma do dispositivo ou o idioma do aplicativo. Você tem alguma documentação sobre a diferença?
21418 Jeremiah
1
A localidade @Jeremiah conterá o idioma do dispositivo, por exemplo, o idioma do seu dispositivo está configurado para francês. Pre conterá o idioma preferido do usuário (ou aplicativo), por exemplo: seu aplicativo suporta apenas chinês, para que você possa instalar um aplicativo chinês em um dispositivo francês. Esperança I esclareceu este 4 u
raed
Quando você diz que o dispositivo está configurado para francês, o que você quer dizer? Parece que, se eu alterar o idioma nas configurações para algo diferente do inglês, ele será representado nas línguas preferenciais, mas não no idiomaCode. Como o languageCode é alterado?
21418 Jeremiah
Se você alterar as configurações de entrada para algo diferente do inglês, obterá seu valor em NSLocale.current.languageCode
raed
9
Não é o contrário? Quando meu idioma de desenvolvimento de aplicativo é EN e eu corro em um dispositivo configurado para DE, para o qual localizei o aplicativo, o resultado é: Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de Quando meu idioma de desenvolvimento de aplicativo é EN e eu corro em um dispositivo configurado para FR, para o qual não localizei o O resultado é: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra 12/1118
55

Swift 4 e 5:

Locale.current.languageCode
Bogdan Bystritskiy
fonte
Não é possível atribuir um valor do tipo 'String' ao tipo 'Localidade?'
Puji Wahono
2
Tente Locale(identifier: Locale.current.identifier);
Koen
Locale.autoupdatingCurrent.languageCodetambém está disponível
C. Bess
37

No Swift 3:

NSLocale.current.languageCode
mazorati
fonte
35

Para usar o idioma atual no seu aplicativo (diferente dos idiomas preferidos)

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

Swift 3 e 4 e 4.2 e 5

Locale.current.languageCodenão compila regularmente. Porque você não implementou a localização para o seu projeto.

Você tem duas soluções possíveis

1) String(Locale.preferredLanguages[0].prefix(2)) Ele retorna o telefone corretamente.

Se você deseja obter o tipo en-En, pode usarLocale.preferredLanguages[0]

2) Selecione Project(MyApp)-> Project (not Target)-> pressione o botão + Localizationse adicione o idioma desejado.

Ali Ihsan URAL
fonte
Isso é realmente interessante! Onde você leu a solução um? Não é possível encontrar essas informações na documentação de maçã
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
fonte
1
O código do idioma e o país separados por "-" são de buggy. Seu código será quebrado em alguns casos como 'zh-Hans-US'.
Evilisn Jiang
let langStr = Locale.preferredLanguages.first!Foi isso que fiz ao revisar este post. Está funcionando e eu comparo com meus idiomas com langStr.lowercased().contains("es")todas as variações de idioma espanhol, por exemplo.
Ian Ortega
8

você pode usar o código abaixo funciona bem com o swift 3

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Amr Angry
fonte
1
Este é o que ainda funciona com o Swift 4! Obrigado!
Alex Wally
7

Desejo acompanhar o idioma escolhido pelo usuário no aplicativo Configurações toda vez que o usuário inicia o meu aplicativo - que ainda não está localizado (meu aplicativo está apenas em inglês). Eu adotei essa lógica:

  1. criar uma enumeração para facilitar o manuseio dos idiomas na matriz

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. crie algumas extensões para o 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 precisar, você pode simplesmente usar a extensão

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
Miniapps
fonte
Obrigado @Syscall :)
Miniapps
Ame a extensão :). Não faria mais sentido não retornar nenhum se não conseguir ler de alguma forma. porque dessa forma esse valor pode ser usado para gerar algum valor.
Alix
5

No Swift, você pode obter o código do idioma usando.

let locale = Locale.current.identifier
yo2bh
fonte
2

Locale.current.languageCode retorna um código errado, então eu uso essas extensões:

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

É isso que eu uso no Swift 5 Xcode 11:

Dentro das variáveis ​​de classe:

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

Isso vem como uma string. Retorna 2 caracteres, ou seja, "en", "es", "de" ...

A partir disso, posso determinar facilmente qual idioma exibir:

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

Se você deseja obter as informações completas do idioma, remova? .Prefex (2)

Brian M
fonte