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:如何获取设备当前语言设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取系统设备语言,swift iOS

获取设备声音输出的当前音量 - iOS

如何在 IOS 中获取 ISO 语言代码?

如何获取当前位置IOS设备

在iOS中获取当前的设备语言?

如何在 iOS 6 中以编程方式获取设备的当前方向?