Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Locale.current报告设备上的错误语言_Ios_Swift_Locale_Nsnumberformatter - Fatal编程技术网

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

Ios Locale.current报告设备上的错误语言,ios,swift,locale,nsnumberformatter,Ios,Swift,Locale,Nsnumberformatter,我正在尝试在iOS应用程序中设置货币值的格式,并使用设备上的当前区域设置使用适当的货币格式 在模拟器中,一切似乎都正常运行:当使用currencyFormatter.locale=locale.current时,它采用正确的区域设置并以正确的货币格式打印数字 然而,在我的iPhone上,它是用法语配置的,带有法语区域设置,我希望使用另一种格式(例如:1234,56€)。但它不起作用,似乎使用了英语格式(例如:1234,56欧元) 事实上,如果我在设备上打印应用程序中的当前区域设置,它不会像我预期

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

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

然而,在我的iPhone上,它是用法语配置的,带有法语区域设置,我希望使用另一种格式(例如:1234,56€)。但它不起作用,似乎使用了英语格式(例如:1234,56欧元)

事实上,如果我在设备上打印应用程序中的当前区域设置,它不会像我预期的那样返回
fr\u fr

NSLog(Locale.current.identifier)
>>> en_FR
该地区很好,但语言却不好,尽管该设备上的iOS显然是法语的

有人知道这件事吗


谢谢

根据@MartinR的提示,我现在使用的是
currencyFormatter.locale=locale(标识符:locale.preferredLanguages.first!)
,它与设备的当前语言和区域设置完全对应


我不完全确定这段代码是防弹的(因为
首先!
,最明显的是),所以如果你有其他建议,请尽管提。

根据@Romain的回答,强制先解开
的包裹Locale.current.identifier
作为回退来避免代码>

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

@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()
@罗曼 这里的问题是,你没有本地化你的应用程序法语,但只有英语

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

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

如果其他所有操作都失败 我花了一个小时调试这个。我在德国,我的iPhone语言设置是英语,我所在的地区是德国

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

    if let deviceLanguageCode = Locale.current.languageCode,
    deviceRegionCode = Locale.current.regionCode {
        // do stuff here
    }
上面的变量
deviceLanguageCode
始终返回
de

但它应该是“恩”
我什么都试过了。我使用了
Locale.autoupdateCurrent.languageCode
Locale.preferredLanguages.first
等,没有任何效果。我检查了我的项目设置,我的
可本地化.strings
文件。一切都好。如果我创建一个新的Xcode项目并打印这些变量,我将获得正确的区域设置和区域:
en_DE

这太气人了
直到我用尽了所有的可能,我读了Paul Hudson的这篇文章(还有谁?),最后,他给出了测试本地化的提示:

提示:您可以通过转到产品菜单,按住Alt键,然后选择“运行…”在选项选项卡下查看,您将看到应用程序语言默认设置为系统语言,但出于测试目的,您可以更改为其他语言

还有……”克勒·霍勒尔!” 有人在我之前去过那里,并将应用程序语言和地区设置为德国!!!难怪我的日子不好过

故事的结尾:确保将这些设置为系统,否则什么都不起作用;)


您的应用程序是否具有法语本地化功能?否则,备用语言是英语。它不是,但我希望我能够在用户的区域设置中打印货币号码,而不必为每种语言提供本地化。可能吗?例如,请参见:“…回退语言是用户在设备设置中最近选择的语言,也在应用程序包中表示。”谢谢,因此事实上,
Locale返回的语言代码。当前的
不一定表示设备的当前语言,但是应用程序支持的第一种语言,或者回退语言。。。我想我必须用另一种方式来做我想做的事情。这里的细节:–我假设目的是提供一致的用户界面,即不是像“上次更新:22 décembre 2010”这样的东西。你说得对,这样更安全。将其标记为正确答案!你好你找到解决问题的好办法了吗。我也有同样的问题,在使用Locale.preferredLanguages[0]或Locale.current.identifier时,我的手机一直显示“en”,但我的手机设置为法语。这只发生在一个应用程序上,其他应用程序按预期工作,返回“fr”。还有一件事要尝试!看我下面的帖子:)我应用这个答案是为了在应用程序小部件中显示正确的区域设置。谢谢非常感谢。这解释了我起初认为是错误的行为。这个答案必须标记为解决方案。但我有一点意见:只有当您有一个或多个本地化资源,例如Localizable.strings或其他可以本地化的资源时,它才有效。