NSLocale currentLocale总是返回“en_US”而不是用户当前的语言

我正在对iPhone应用程序进行国际化 – 我需要根据用户的当前语言环境对某些视图进行编程更改。 我疯了,因为不pipeiPhone模拟器或实际硬件上的语言偏好是什么, locale总是评估为“en_US”:

 NSString *locale = [[NSLocale currentLocale] localeIdentifier]; NSLog(@"current locale: %@", locale); 

疯狂的事情是,应用程序的其余部分按预期行事。 从Localization.strings文件中select正确的string并在接口中使用,并使用所选语言环境的正确.xib文件。

我也尝试了以下,无果而终,结果相同:

 NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier]; NSLog(@"current locale: %@", locale); 

有没有简单的我失踪? 一个偏好或一个导入也许?

我曾经做过的事情:

正如Darren的回答所示,我所寻找的偏好不在NSLocale ,而在于:

 NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults]; NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"]; NSString* preferredLanguage = [languages objectAtIndex:0]; NSLog(@"preferredLanguage: %@", preferredLang); 

彼得的答案似乎是一个更好的解决scheme:

 NSArray* preferredLanguages = [NSLocale preferredLanguages]; NSLog(@"preferredLanguages: %@", preferredLanguages); 

不要直接使用未公开的键来查询默认值, 而要向NSLocale 提供首选语言的数组 。

[NSLocale currentLocale]基于设备的区域格式设置,而不是语言。 如果该地区设置为美国,则无论您使用的是哪种语言,都将获得en_US。

要获取当前的设备语言,请改用它:

 NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0]; 

如下所述: 在iOS中获取最新的设备语言?

对我来说,两者

 NSString *localeString = [[NSLocale currentLocale] localeIdentifier]; 

 NSArray *array = [NSLocale preferredLanguages]; self.label.text = array[0]; 

在模拟器中产生相同的结果。

我发现,如果我离开“en_US”,但有一个“en”本地化是“en_US”的副本,模拟器自动启动尊重语言设置,但只要“en_US”是一个选项,它总是select它的设置。

我有一个问题,在设置为法语的设备上使用英文格式化月份名称。

我的解决scheme是使用这个:

  NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ]; [self.monthNameFormatter setLocale:locale]; [self.monthNameFormatter setDateFormat:@"MMMM"]; [self.monthNameFormatter stringFromDate:myDate]; 

问题太旧了,但是这个代码可能对很多人有帮助:

main.m应该是这样的:

  NSString *localecode=[[NSLocale currentLocale] localeIdentifier]; localecode=[localecode substringToIndex:2]; //en_GB -> en NSArray *arr = [NSLocale preferredLanguages]; NSMutableArray * mutable = [arr mutableCopy]; NSString *prefered = [mutable firstObject]; if(![localecode isEqualToString:prefered]){ if(![prefered isEqualToString:@"es"] && ![prefered isEqualToString:@"en"] && ![prefered isEqualToString:@"pt"]){ int index = [mutable indexOfObject:@"en"]; [mutable replaceObjectAtIndex:0 withObject:@"en"]; [mutable replaceObjectAtIndex:index withObject:prefered]; [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"]; } else{ int index = [mutable indexOfObject:localecode]; [mutable replaceObjectAtIndex:0 withObject:localecode]; [mutable replaceObjectAtIndex:index withObject:prefered]; [[NSUserDefaults standardUserDefaults] setObject:mutable forKey:@"AppleLanguages"]; } } return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

这是什么? 如果设备的当前语言是西class牙语,英语或葡萄牙语,则使用应用程序使用本地化的string,反之,如果当前语言不是其中之一,并且不被应用程序支持,则设置为英语。

对我们来说,问题在于我们在开发scheme中忽略了应用程序语言和应用程序区域。 确保在scheme选项(编辑scheme – >选项)中将应用程序语言设置为系统语言。

在真实的iPad上显示正确的语言环境。 但是,模拟器有它自己的iOS,默认情况下它被设置为en-US。 转到模拟器iOS首选项,并将语言和区域切换到您想要的。

这就是诀窍。