Locale.current在设备上报告错误的语言

时间:2018-01-07 10:58:16

标签: ios swift locale nsnumberformatter

我正在尝试在iOS应用中格式化货币值,并且我正在使用设备上的当前区域设置来使用适当的货币格式。

在模拟器中,一切似乎都运行良好:使用currencyFormatter.locale = Locale.current时,它采用正确的区域设置并使用正确的货币格式打印数字。

然而,在我的iPhone上,使用法语区域设置法语配置,我希望可以使用其他格式(例如: 1 234,56€)。但它不起作用,似乎使用英语格式(例如:€1 234,56 )。

事实上,如果我在设备上的应用中打印当前的Locale,它就不会像我期望的那样返回fr_FR

NSLog(Locale.current.identifier)
>>> en_FR

该地区很好,但语言不是,但该设备上的iOS显然是法语。

有人对此有所了解吗?

谢谢!

5 个答案:

答案 0 :(得分:5)

根据@ Romain的回答,使用first!作为后备可以避免强制展开Locale.current.identifier

func getPreferredLocale() -> Locale {
    guard let preferredIdentifier = Locale.preferredLanguages.first else {
        return Locale.current
    }
    return Locale(identifier: preferredIdentifier)
}

答案 1 :(得分:3)

@florieger以扩展名形式的答案:

import Foundation

extension Locale {
    static func preferredLocale() -> Locale {
        guard let preferredIdentifier = Locale.preferredLanguages.first else {
            return Locale.current
        }
        return Locale(identifier: preferredIdentifier)
    }
}

然后像这样使用它:

dateFormatter.locale = Locale.preferredLocale()
datePicker.locale = Locale.preferredLocale()

答案 2 :(得分:1)

按照@ MartinR的提示,我现在正在使用currencyFormatter.locale = Locale(identifier: Locale.preferredLanguages.first!),这与设备的当前语言&区域设置。

我不完全确定此代码是防弹的(因为first!,最值得注意的是)所以如果您有其他建议,请随意。

答案 3 :(得分:0)

@罗曼 这里的问题是您尚未将应用本地化为法语,而仅将英语本地化。

转到带有应用程序名称的左上蓝色文件,选择“项目”>“信息”,然后在“本地化”区域中将看到“英语-开发语言”。 按+并选择法语(fr)。

就是这样。 现在,您可以使用Locale.current,并且如果设备(或模拟器)的第一语言是法语,则您的应用程序将显示法语货币格式。

答案 4 :(得分:0)

如果一切都失败了

我花了一个小时调试这个。我在德国,我的 iPhone 语言设置是英语,我的地区是德国。

我正在调试一个应用程序,该应用程序从 iPhone 获取语言环境并将其作为标头在 API 调用中传递给服务器。我想知道为什么我总是以德语获取所有数据字符串。查看应用程序,一切都正确完成:

    if let deviceLanguageCode = Locale.current.languageCode,
    deviceRegionCode = Locale.current.regionCode {
        // do stuff here
    }

deviceLanguageCode 上方的变量始终返回 de
但应该是“en”!
我尝试了一切。我使用了 Locale.autoupdatingCurrent.languageCodeLocale.preferredLanguages.first 等,没有任何效果。我检查了我的项目设置,我的 Localizable.strings 文件。都好。如果我创建一个新的 Xcode 项目并打印这些变量,我将获得正确的语言环境和区域:en_DE

这太令人气愤了!
只有当我用尽所有可能性时,我才阅读了 Paul Hudson(还有谁?)的 post,最后,他给出了测试本地化的提示:

<块引用>

提示:您可以通过转到“产品”菜单,按住 Alt 键,然后选择“运行...”来切换语言,但您可以在那里更改为其他人以进行测试。

还有……“惊魂未定!” 有人在我之前已经在那里并将应用程序语言和地区设置为德国!!!难怪我过得很辛苦!

故事结束:确保将这些设置为系统,否则将不起作用;)

enter image description here