iOS:如何获取设备当前语言设置?
Posted
技术标签:
【中文标题】iOS:如何获取设备当前语言设置?【英文标题】:iOS: How to Get the Device Current Language Setting? 【发布时间】:2011-10-13 08:29:53 【问题描述】:我的应用程序中有一些功能应该基于运行它的设备的语言设置。
我想获取实际语言,而不是某些国家/地区设置。例如,如果语言是英语,我不在乎是美国、英国、澳大利亚等......
我熟悉 NSLocale
对象,但它似乎与 Region Format
设置有关,而不是与 语言 设置有关(见下面的屏幕截图)所以当我尝试检索使用[locale displayNameForKey:NSLocaleIdentifier value:[locale localeIdentifier]
的语言我得到类似English (United States)
而不是English
的东西;另外,我认为我需要的是 Language 数据,而不是 Region Format(对吗?)。
谁能指导我如何检索语言设置?
【问题讨论】:
【参考方案1】:存储的用户首选语言可以作为数组从语言环境中检索,当前语言标识符是该数组中的第一个对象:
NSString *currentLanguage = [[NSLocale preferredLanguages] objectAtIndex:0];
如果您希望语言更易读,请使用 NSLocale 的displayNameForKey:value:
方法:
NSString *langID = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *lang = [[NSLocale currentLocale] displayNameForKey:NSLocaleLanguageCode value:langID];
【讨论】:
最后的's'参数是什么?应该是 langID 吗? @Flink,确实是 langID。感谢您的评论,我将编辑答案。奇怪的是,错误这么久都没有被发现:) 警告:在 ios 9 中,NSLocale preferredLanguages
的返回值发生了变化。如果之前你只得到“en”,在 iOS 9 中你会得到“en-US”或“en-JP”等。参考:happyteamlabs.com/blog/…【参考方案2】:
试试这个:
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* arrayLanguages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* currentLanguage = [arrayLanguages objectAtIndex:0];
【讨论】:
【参考方案3】:获取Swift
中的语言和地区:
LF.log("language", NSLocale.preferredLanguages())
LF.log("locale", NSBundle.mainBundle().preferredLocalizations)
在我的情况下,我得到:
language: '(
"zh-Hans"
)'
locale: '(
en
)'
【讨论】:
NSBundle.mainBundle().preferredLocalizations
没有给出当前的设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,则给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,那么 info.plist 中 CFBundleLocalizations 的第一项是返回【参考方案4】:
在 Swift 4 中:
let currentLanguage = Locale.current.languageCode
它只会给你语言代码,没有国家代码。
【讨论】:
【参考方案5】:斯威夫特:
let language = NSBundle.mainBundle().preferredLocalizations[0] as NSString
【讨论】:
不幸的是,这是一个错误的答案。如果您将系统语言设置为法语并且您的“语言和地区”设置为美国,您将得到“en”而不是“fr”,而问题是询问语言。NSBundle.mainBundle().preferredLocalizations
没有给出当前设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,那么给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,那么 info.plist 中 CFBundleLocalizations 的第一项是返回【参考方案6】:
工作解决方案:
let language = NSLocale.preferredLanguages()[0]
let languageDic = NSLocale.componentsFromLocaleIdentifier(language) as NSDictionary
//let countryCode = languageDic.objectForKey("kCFLocaleCountryCodeKey")
let languageCode = languageDic.objectForKey("kCFLocaleLanguageCodeKey") as! String
print(languageCode)
【讨论】:
【参考方案7】:NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
【讨论】:
【参考方案8】:在 XCode 的帮助文档中找到解决方案,它写道:
获取当前语言
要从主应用程序包中获取应用程序使用的语言,请使用 NSBundle 类中的 preferredLocalizations 方法:
NSString *languageID = [[NSBundle mainBundle] preferredLocalizations].firstObject;
【讨论】:
【参考方案9】:使用下面的代码来获取本地化语言,而不会遇到 en-india、en-us 等问题。
NSString *Ph = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
在ios9及之后这段代码需要考虑
【讨论】:
这不给出当前设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,则给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,则返回 info.plist 中 CFBundleLocalizations 的第一项 【参考方案10】:要了解在您的本地化中选择的当前语言,请使用
[[NSBundle mainBundle] preferredLocalizations]
例子:
NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
得到两个字母的单词
NSString *language = [[[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0] substringToIndex:2];
斯威夫特:
let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
【讨论】:
这不给出当前设备语言。如果 CFBundleAllowMixedLocalizations 在 info.plist 中为真,则给出您在 info.plist 的 CFBundleDevelopmentRegion 中给出的语言,则返回 info.plist 中 CFBundleLocalizations 的第一项以上是关于iOS:如何获取设备当前语言设置?的主要内容,如果未能解决你的问题,请参考以下文章