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

use*_*367 108 nslocale swift

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

我正在尝试这个:

  var preferredLanguages : NSLocale!
  let pre = preferredLanguages.displayNameForKey(NSLocaleIdentifier, value: preferredLanguages)
Run Code Online (Sandbox Code Playgroud)

但这会返回零.

谢谢!

Vad*_*ine 164

在Swift 3中

let langStr = Locale.current.languageCode
Run Code Online (Sandbox Code Playgroud)

  • 应该是:Locale.current.identifier但是中文的Locale.current.languageCode,它总是返回'zh',但它必须要区分zh-HK等 (11认同)
  • 据我所知,仅当您的项目在“项目”->“本地化”下启用了该语言的本地化时,它才会返回“设置”->“常规”->“语言和区域”->“iPhone 语言”中设置的实际语言。否则就是开发语言。 (7认同)
  • @ User9527由于您的原因,很可能未在项目设置中启用该语言的本地化。 (2认同)

rae*_*aed 68

App语言设备语言环境之间做出区别非常重要(下面的代码在Swift 3中)

将返回设备语言:

let locale = NSLocale.current.languageCode
Run Code Online (Sandbox Code Playgroud)

将返回App语言:

let pre = Locale.preferredLanguages[0]
Run Code Online (Sandbox Code Playgroud)

  • 不是相反吗?当我的应用程序开发语言是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` (6认同)
  • 这是错误的,还有 1 个原因:iOS 13.1 引入了每个应用程序的语言设置,并且 `Locale.preferredLanguages[0]` 没有考虑到这一点,而 `Locale.current.languageCode` 则考虑了这一点。 (5认同)
  • @Jeremiah locale 将包含设备语言,例如您的设备语言配置为法语。Pre 将包含用户(或 App)首选语言,例如:您的 App 仅支持中文,因此您可以在法国设备上安装中文应用。希望我能澄清这一点 4 u (3认同)
  • 我不了解设备语言或应用程序语言之间的区别。您是否有关于差异的任何文档? (2认同)

Bog*_*kiy 39

在Swift 4中:

Locale.current.languageCode
Run Code Online (Sandbox Code Playgroud)

  • 尝试 `Locale(identifier: Locale.current.identifier)`; (2认同)
  • `Locale.autoupdatingCurrent.languageCode` 也可用 (2认同)

maz*_*ati 37

在Swift 3中:

NSLocale.current.languageCode
Run Code Online (Sandbox Code Playgroud)


小智 36

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

NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode)!
Run Code Online (Sandbox Code Playgroud)


Ali*_*RAL 20

Swift 3&4和4.2

Locale.current.languageCode没有定期进行编译.因为你没有实现本地化到项目.

您有2个选择解决方案

第一

String(Locale.preferredLanguages[0].prefix(2)) 它正确地返回电话.

如果你想获得en-En类型,你可以使用Locale.preferredLanguages[0]

第二

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


Joh*_*rug 14

特尔;博士:

使用Bundle.main.preferredLocalizations[0]让您的应用的用户界面当前显示的语言。不要使用Locale.current,因为它描述了区域的格式(时间,货币,距离等),并有无关的语言。

详细解答:

关于如何获取应用程序 UI 所显示语言的语言(!)代码的明确答案来自 Apple 工程师 Quinn“The Eskimo”,我引用/解释了 Swift:

Locale.current返回当前区域设置,即由Settings > General > Language & Region > Region Formats 设置的值。这与您的应用程序运行所使用的语言无关。对于该领域的用户来说,将他们的区域设置和语言设置为“冲突”值是完全合理的,实际上也很常见。例如,居住在法国的以英语为母语的人会将语言设置为英语,但可能会选择将语言环境设置为法语(因此他们可以获得公制度量衡、24 时间等)。

您的应用程序运行所用的语言由语言设置决定,即Settings > General > Language & Region > Preferred Language Order。当系统运行您的应用程序时,它会获取此语言列表(首选列表)并将其与您的应用程序本地化为的语言列表(应用程序列表)进行匹配。应用程序列表中首选列表中的第一种语言是为应用程序选择的语言。这是您将在主包preferredLocalizations数组的第一个条目中找到的内容。

代码中的语言名称

要从其代码中获取语言的人类可读名称,您可以使用以下命令:

let langCode = Bundle.main.preferredLocalizations[0]
let usLocale = Locale(identifier: "en-US")
var langName = ""
if let languageName = usLocale.localizedString(forLanguageCode: langCode) {
    langName = languageName
}
        
Run Code Online (Sandbox Code Playgroud)

这将为您提供当前 UI 语言的英文名称。

  • 这应该有更多的赞成票。虽然问题是关于“设备语言”,但我认为_这个_答案(即UI语言)是人们(包括我)真正需要的。 (5认同)

Bas*_*raf 12

迅捷3

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

let arr = preferredLanguage.components(separatedBy: "-")
let deviceLanguage = arr.first
print (deviceLanguage) //en
Run Code Online (Sandbox Code Playgroud)

  • 用“-”分隔语言代码和国家代码是有问题的。您的代码在某些情况下会中断,例如“zh-Hans-US”。 (2认同)

Mak*_* BK 7

斯威夫特 5.4:

let languagePrefix = Locale.preferredLanguages[0]
print(languagePrefix)
Run Code Online (Sandbox Code Playgroud)


Chi*_*buZ 6

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})
    }
}
Run Code Online (Sandbox Code Playgroud)


Amr*_*gry 5

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

var preferredLanguage : String = Bundle.main.preferredLocalizations.first!
Run Code Online (Sandbox Code Playgroud)

  • 这实际上仍然适用于 Swift 4!谢谢! (2认同)

Min*_*pps 5

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

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

    enum Language: String {
    
    case none = ""
    case en = "English"
    case fr = "French"
    case it = "Italian"
    
    } // add as many languages you want
    
    Run Code Online (Sandbox Code Playgroud)
  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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 必要时,您可以简单地使用扩展名

    if let currentLanguage = Locale.currentLanguage {
        print(currentLanguage.rawValue)
        // Your code here.
    }
    
    Run Code Online (Sandbox Code Playgroud)


Yog*_*ate 5

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

let locale = Locale.current.identifier
Run Code Online (Sandbox Code Playgroud)


小智 5

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

\n

类变量内部:

\n
let languagePrefix = Bundle.main.preferredLocalizations.first?.prefix(2)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
 if languagePrefix == "es" { self.flipCard.setTitle("\xc3\xbaltima carta", for: .normal) }\n if languagePrefix == "en" { self.flipCard.setTitle("Last Card", for: .normal) }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n