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首选项,并将语言和区域切换到您想要的。
这就是诀窍。