在iOS中获取最新的设备语言?
我想显示设备用户界面正在使用的当前语言。 我将使用什么代码?
我想把它作为一个完全拼出格式的NSString
。 (不是@“en_US”)
编辑:对于那些开车的人来说,这里有很多有用的评论,因为答案已经随着新的iOS版本发展。
提供的解决方案实际上会返回设备的当前区域 – 而不是当前选择的语言。 这些往往是一个一样的。 但是,如果我在北美,而且我的语言是日语,我的地区仍然是英语(美国)。 为了检索当前选择的语言,你可以这样做:
NSString * language = [[NSLocale preferredLanguages] firstObject];
这将返回当前所选语言的双字母代码。 “en”表示英语,“es”表示西班牙语,“de”表示德国人等。更多的例子请参考维基百科条目(特别是639-1栏):
ISO 639-1代码列表
然后,将两个字母代码转换为您要显示的字符串是一件简单的事情。 所以如果是“en”,则显示“英文”。
希望这可以帮助那些希望区分地区和当前所选语言的人。
编辑
值得引用来自NSLocale.h的头文件信息:
+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information
对app语言感兴趣的人可以看看@ mindvision的答案
所选答案返回当前设备语言,但不是应用程序中使用的实际语言。 如果您没有在您的应用中为用户的首选语言提供本地化,则可以使用按用户的首选订单排序的第一个本地化。
发现在您的本地化使用内选择的当前语言
[[NSBundle mainBundle] preferredLocalizations];
例:
NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
迅速:
let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
这可能会给你你想要的:
NSLocale *locale = [NSLocale currentLocale]; NSString *language = [locale displayNameForKey:NSLocaleIdentifier value:[locale localeIdentifier]];
它将以语言本身显示语言的名称。 例如:
Français (France) English (United States)
iOS 9解决方案:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
language =“en-US”
NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];
languageDic将具有所需的组件
NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];
countryCode =“US”
NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];
languageCode =“en”
接受的和其他答案都没有考虑到首选语言可以是除设备语言之外的另一种语言 。
设备语言是操作系统元素和Apple应用程序呈现的语言。
首选语言是用户希望将应用程序本地化的语言。Apple仅提供有限的一组翻译。 如果首选语言是苹果翻译他们的应用程序的一种语言,那么它也将是设备语言。 但是,如果用户喜欢苹果不提供翻译的语言,则设备和首选语言将不匹配 。 设备语言不会位于首选语言列表的第一位。
以下功能将通过首选语言列表,并检查苹果框架中是否有翻译。 第一种翻译的语言是设备语言。 该函数将返回其语言代码。
func deviceLanguage() -> String? { let systemBundle: NSBundle = NSBundle(forClass: UIView.self) let englishLocale: NSLocale = NSLocale(localeIdentifier: "en") let preferredLanguages: [String] = NSLocale.preferredLanguages() for language: String in preferredLanguages { let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language) guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else { continue } // ex: es_MX.lproj, zh_CN.lproj if let countryCode: String = languageComponents[NSLocaleCountryCode] { if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil { // returns language and country code because it appears that the actual language is coded within the country code aswell // for example: zh_CN probably mandarin, zh_HK probably cantonese return language } } // ex: English.lproj, German.lproj if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) { if systemBundle.pathForResource(languageName, ofType: "lproj") != nil { return languageCode } } // ex: pt.lproj, hu.lproj if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil { return languageCode } } return nil }
如果首选语言列表是:
- 南非荷兰语(iOS没有翻译成南非荷兰语)
- 西班牙语(设备语言)
首选语言列表可以在 Settings.app – > General – > Language&Region – > Preferred Language Order中编辑
您可以使用设备语言代码并将其翻译为语言名称。 以下行将以设备语言打印设备语言。 例如,如果设备设置为西班牙语,则为“Español”。
if let deviceLanguageCode: String = deviceLanguage() { let printOutputLanguageCode: String = deviceLanguageCode let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode) if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) { // keep in mind that for some localizations this will print a language and a country // see deviceLanguage() implementation above print(deviceLanguageName) } }
我用这个
NSArray *arr = [NSLocale preferredLanguages]; for (NSString *lan in arr) { NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]); }
忽略内存泄漏
结果是
2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文) 2013-03-02 20:01:57.460 xx[12334:907] en: en English 2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語2013-03-02 20:01:57.465 xx[12334:907] fr: fr français 2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch 2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands 2013-03-02 20:01:57.477 xx[12334:907] it: it italiano 2013-03-02 20:01:57.481 xx[12334:907] es: es español
将语言代码(如en_US)翻译成英语(美国)是NSLocale
的内置功能, NSLocale
不关心从哪里获取语言代码。 所以我们没有理由按照公认的答案所建议的来实现自己的翻译。
// Example code - try changing the language codes and see what happens NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"]; NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"]; NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"]; NSLog(@"%@, %@, %@", l1, l2, l3);
打印: 英文,德文,瑞典文
您可以使用NSLocale
的displayNameForKey:value:
方法:
// get a French locale instance NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease]; // use it to get translated display names of fr_FR and en_US NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]); NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);
这将打印出来:
français (France) anglais (États-Unis)
如果您为initWithLocaleIdentifier:
指定了相同的语言环境标识符,并且还指定了displayNameForKey:value:
方法,那么它将为您提供该语言的本机名称。 我发现,如果你删除了国家代码,只使用fr
和en
,那么它也将从显示名称中省略国家(至少在Mac OS X上,不确定iOS)。
即使有更好的方式来获得当前的设备语言。 让我们尝试下面的代码 –
NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);
由Abizern在这里推荐
获取用户设备当前的语言使用下面的代码它为我工作。
NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
迅速
获取设备的当前语言
NSLocale.preferredLanguages()[0] as String
获取应用程序语言
NSBundle.mainBundle().preferredLocalizations[0] as NSString
注意:
它获取您在Info.plist的CFBundleDevelopmentRegion中给出的语言
如果在info.plist中CFBundleAllowMixedLocalizations为true,则返回info.plist中的第一个CFBundleLocalizations项
我试图为自己找到正确的解决方案。 当我使用Locale.preferredLanguages.first
从您的应用程序设置返回首选语言。
如果你想从用户设备设置中了解语言,你应该使用下面的字符串:
Swift 3
let currentDeviceLanguage = Locale.current.languageCode // Will return the optional String
打开并使用下面的行:
if let currentDeviceLanguage = Locale.current.languageCode { print("currentLanguage", currentDeviceLanguage) // For example if currentDeviceLanguage == "he" { UIView.appearance().semanticContentAttribute = .forceRightToLeft } else { UIView.appearance().semanticContentAttribute = .forceLeftToRight } }
对于MonoTouch C#开发人员使用:
NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"
注意:我知道这是一个iOS问题,但是因为我是MonoTouch开发人员,所以在这个页面上的答案让我朝着正确的方向前进,我想我会分享结果。
简单的Swift 3功能:
@discardableResult func getLanguageISO() -> String { let locale = Locale.current guard let languageCode = locale.languageCode, let regionCode = locale.regionCode else { return "de_DE" } return languageCode + "_" + regionCode }
-(NSString *)returnPreferredLanguage { //as written text NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"]; NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever) NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French" return languageName; }
在Swift
:
let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
Swift 3
let locale = Locale.current let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String? print(code!)
如果你想在这里得到唯一的语言是我建议的答案:
NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0]; NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"] objectAtIndex:0];
在我的情况下,我只想要区域设置语言不区域设置区域。
输出:如果您的语言环境语言是日语,而语言环境区域是日本,则:
langplusreg = ja-JP
langonly = ja
根据苹果文件
NSUserDefaults* defs = [NSUserDefaults standardUserDefaults]; NSArray* languages = [defs objectForKey:@"AppleLanguages"]; NSString* preferredLang = [languages objectAtIndex:0];
两个字母的格式。 苹果使用ISO标准ISO-3166 。
NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
在Swift中的@amir响应:
// Get language prefered by user let langageRegion = NSLocale.preferredLanguages().first! let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion) let language = languageDic[NSLocaleLanguageCode]
对于Swift 3:
NSLocale.preferredLanguages [0]作为字符串
从iOS 9开始,如果你只是想要没有国家代码的语言代码,你会想要这样的帮助功能 – 因为语言将包含国家代码。
// gets the language code without country code in uppercase format, ie EN or DE NSString* GetLanguageCode() { static dispatch_once_t onceToken; static NSString* lang; dispatch_once(&onceToken, ^ { lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString]; NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil]; NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)]; if (match.range.location != NSNotFound) { lang = [lang substringToIndex:match.range.length]; } }); return lang; }
显然,解决方案依赖于,例如
[[NSLocale preferredLanguages] objectAtIndex:0]
通常工作正常,并返回当前的设备语言。
但在某些情况下可能会造成误导:
如果你想获得这个值的应用程序已经改变了语言,例如这样的代码:
NSString *lg = @"en"; // or anything like @"en", @"fr", etc. [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:lg, nil] forKey:@"AppleLanguages"]
在这种情况下,[NSLocale preferredLanguages] 实际上返回在这个特定的应用程序,而不是当前的设备语言首选语言设置(和使用)!
并且…在这种情况下,正确获取当前设备语言(而不是之前在应用程序中设置的语言)的唯一方法是首先清除NSUserDefaults中的key @“appleLanguages”,如下所示:
[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];
然后,[NSLocale preferredLanguages]现在返回正确的值。
希望这个帮助。