如何使用Swift获取当前语言代码?


131

我想在用Swift编写的应用程序中获取设备的语言代码(en,es ...)。如何得到这个?

我正在尝试:

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

但这返回零。

Answers:


185

在Swift 3中

let langStr = Locale.current.languageCode

13
应该为:Locale.current.identifier但中文为Locale.current.languageCode,它始终返回'zh',但必须区分zh-HK,等等
iXcoder

2
@ User9527由于您的原因,很可能未在项目设置中启用该语言的本地化。
Kirill Kudaev

无法将类型为“字符串”的值分配为类型为“语言环境?”
普吉·瓦霍诺(Puji Wahono)

1
据我所知,如果项目中在项目->本地化下启用了该语言的本地化,它将返回设置->常规->语言和区域-> iPhone语言中设置的实际语言。否则,它就是开发语言。
Huralnyk

85

区分App语言设备区域设置语言是很重要的(下面的代码在Swift 3中

将返回设备语言:

let locale = NSLocale.current.languageCode

将返回App语言:

let pre = Locale.preferredLanguages[0]

4
我不了解设备语言或应用程序语言之间的区别。您是否有关于差异的任何文档?
耶利米

1
@耶利米语言环境将包含设备语言,例如,您的设备语言配置为法语。Pre将包含用户(或App)的首选语言,例如:您的App仅支持中文,因此您可以在法语设备上安装中文应用。希望我能澄清一下这4 u
raed

当您说设备配置为法语时,您是什么意思?看来,如果我将设置中的语言更改为英语以外的其他语言,则会以PreferredLanguages表示,而不会以languageCode表示。如何更改languageCode?
耶利米

如果您在设置中更改到其他的东西,英语,你会在NSLocale.current.languageCode得到它的价值
RAED

9
是不是反过来了?当我的应用程序开发语言是EN且我在将其本地化的DE配置设备上运行时,结果是:Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de 当我的应用程序开发语言是EN且我正在将其本地化的FR配置设备上运行时,应用程序的结果是: Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
Arjen Hiemstra



35

要获取您的应用中使用的当前语言(不同于首选语言)

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!

29

斯威夫特3&4&4.2&5

Locale.current.languageCode不定期编译。因为您没有为项目实现本地化。

您有两种可能的解决方案

1)String(Locale.preferredLanguages[0].prefix(2)) 正确返回手机语言。

如果要获取类型en-En,可以使用Locale.preferredLanguages[0]

2)选择Project(MyApp)-> Project (not Target)->按+按钮进入Localizations,然后添加所需的语言。


这真的很有趣!您在哪里阅读了解决方案一?在Apple文档中找不到此信息
kuzdu,

16

迅捷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
语言代码和国家/地区代码之间用“-”分隔是错误的。在某些情况下,例如“ zh-Hans-US”,您的代码将被破坏。
Evilisn Jiang

let langStr = Locale.preferredLanguages.first!这就是我对这篇文章的评论。它正在运行,例如,我将langStr.lowercased().contains("es")所有西班牙语言版本的语言与我的语言进行比较。
伊恩·奥尔特加

8

您可以使用以下代码,在swift 3上可以正常使用

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

1
这是实际上仍然可以与Swift 4一起使用的版本!谢谢!
Alex Wally

7

每当用户启动我的应用程序时,我想跟踪用户在“设置”应用程序中选择的语言-该语言尚未本地化(我的应用程序仅使用英语)。我采用了以下逻辑:

  1. 创建一个枚举以使其更易于处理数组中

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
  2. 创建两个延伸语言环境

    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. 必要时,您可以简单地使用扩展名

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

感谢@Syscall :)
Miniapps

喜欢扩展:)。如果无法以某种方式读取,则不返回任何内容将更有意义。因为那样一来,价值就可以用来创造价值。
Alix

5

在Swift中,您可以使用语言环境。

let locale = Locale.current.identifier

2

Locale.current.languageCode 返回错误的代码,所以我使用这些扩展名:

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

这是我在Swift 5 Xcode 11中使用的:

在类变量里面:

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

这是一个字符串。它返回两个字符,即“ en”,“ es”,“ de” ...

由此,我可以轻松确定要显示的语言:

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

如果您需要语言的完整信息,请删除?.prefex(2)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.