如何使用Swift获取当前的语言代码?
在Swift中如何获取当前语言代码?
在Swift 3中,我们需要区分应用语言和设备区域语言之间的差异。
要获取设备语言,可以使用以下代码:
let locale = NSLocale.current.languageCode
要获取应用语言,可以使用以下代码:
let pre = Locale.preferredLanguages[0]
有人提出了关于设备语言和应用语言之间差异的问题,是否有相关文档可以解释?
locale将包含设备语言,例如,如果设备语言设置为法语,则locale将返回“fr”。pre将包含用户(或应用程序)首选语言,例如,如果你的应用程序仅支持中文,则可以在法语设备上安装一个中文应用程序。希望我已经澄清了这个问题。
有人问如果我将设备的语言设置为法语是什么意思?似乎如果我在设置中更改语言为英语以外的其他语言,它会出现在preferredLanguages中,但不会在languageCode中显示。languageCode是如何变化的?
如果你在设置中将语言更改为非英语语言,你将在NSLocale.current.languageCode中获得相应的值。
有人提出反对意见说这是错误的。当我的应用程序开发语言是英文,我在德语配置的设备上运行,并且已经将应用程序本地化时,结果是:Locale.current.languageCode: de Locale.current.identifier: de_DE Locale.preferredLanguages[0]: de
当我的应用程序开发语言是英文,我在法语配置的设备上运行,并且未将应用程序本地化时,结果是:Locale.current.languageCode: en Locale.current.identifier: en_FR Locale.preferredLanguages[0]: fr
我在这里看到的是,preferredLanguages[0]始终返回设备语言,可能是你没有正确显示开发语言!为了强制应用程序语言,你应该通过Scheme进行设置,请参考链接:medium.com/lean-localization/… 如果需要更多帮助,我们需要通过其他方式进行。想一想。
有人回答说我已经设置了Scheme来测试上述内容。一个Scheme是德语/德国,一个Scheme是法语/法国。如果我有德语本地化,则应用程序所使用的区域设置是德语。如果没有针对设备的本地化,那么应用程序所使用的区域设置是英语(即我的开发语言)。至少我看到的是这样的。
对方说,你能给我访问你的代码吗?有一个GitHub链接吗?
你是否重新创建了这个问题?
对不起,我回复晚了。这很奇怪,但是我无论设备是英语还是法语,我始终得到的结果都是德语!
另一个人指出另一个错误之处:iOS 13.1引入了每个应用程序的语言设置,而Locale.preferredLanguages[0]
不会考虑到这一点,而Locale.current.languageCode
会考虑到。
有人问如何实现“iOS 13.1每个应用程序的语言设置”,我查找了一下,但没找到相关信息。我的应用程序支持12种语言,并根据设备的语言设置进行设置。看起来我应该从preferredLanguages列表中逐个扫描,如果找不到英语以外的语言,那么就使用英语。但是我需要在应用程序的代码中声明这些语言(能力)吗?
对方回答说,在调试控制台(lldb)中,无论是Locale.preferredLanguages[0]还是NSLocale.current.languageCode都显示相同的结果“en”,但是我的iPhone并没有设置为英语。对此有什么解释吗?
有人表示这在新的iOS版本中可能已经不起作用了。
这是错误的,Locale.current.languageCode
是当前应用程序的语言代码。
问题出现的原因是在Swift 4和5中,获取当前语言代码的方法发生了变化。在旧的方法中,可以直接使用Locale.current.languageCode
来获取当前语言代码。然而,在新的版本中,这个方法返回的类型是String,而不是Locale类型,因此会出现类型不匹配的错误。
解决这个问题的方法是使用新的方法Locale(identifier: Locale.current.identifier)
来获取Locale类型的对象,然后再从这个对象中获取语言代码。另外,也可以使用Locale.autoupdatingCurrent.languageCode
来获取语言代码。
以下是代码示例:
let locale = Locale(identifier: Locale.current.identifier)
let languageCode = locale.languageCode
let autoupdatingLocale = Locale.autoupdatingCurrent
let autoupdatingLanguageCode = autoupdatingLocale.languageCode
通过上述代码,我们可以获取当前语言代码并解决类型不匹配的错误。
在Swift 3中,获取当前语言代码的正确方法应该是使用Locale.current.identifier
,而不是Locale.current.languageCode
。对于中文而言,Locale.current.languageCode
总是返回'zh',但是实际上需要区分zh-HK等不同的语言代码。
这是因为你很可能没有在项目设置中启用该语言的本地化功能。
无法将类型'String'赋值给类型'Locale?'
据我所知,只有在项目的本地化设置下启用该语言的本地化功能后,Locale.current.identifier
才会返回在“设置”->“通用”->“语言与地区”->“iPhone语言”中设置的实际语言。否则,它将返回开发语言。
我如何使用只使用Xcode的命令行版本创建一个可执行二进制文件来输出这个值?