我正在进行国际化iPhone应用程序的过程 - 我需要根据用户当前的语言环境对某些视图进行编程更改。我疯了,因为无论iPhone模拟器或实际硬件上的语言偏好如何,locale
总是评估为“en_US”:
NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
疯狂的是,应用程序的其余部分按预期运行。从Localization.strings文件中选择正确的字符串并在界面中使用,并使用所选语言环境的正确.xib文件。
我也尝试了以下内容,但没有用,结果相同:
NSString *locale = [[NSLocale autoupdatingCurrentLocale] localeIdentifier];
NSLog(@"current locale: %@", locale);
有什么简单的我不见了吗?可能是偏好还是导入?
我以前做的事情:
正如达伦的回答所暗示的那样,我正在寻找的偏好不在NSLocale
,而是在这里:
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
NSArray* languages = [userDefaults objectForKey:@"AppleLanguages"];
NSString* preferredLanguage = [languages objectAtIndex:0];
NSLog(@"preferredLanguage: %@", preferredLang);
彼得的答案似乎是一个更好的解决方案:
NSArray* preferredLanguages = [NSLocale preferredLanguages];
NSLog(@"preferredLanguages: %@", preferredLanguages);
答案 0 :(得分:55)
[NSLocale currentLocale]
基于设备的区域格式设置,而不是语言。如果该地区设置为美国,无论您使用哪种语言,都将获得en_US。
答案 1 :(得分:35)
而不是直接使用未记录的密钥ask the NSLocale class for the array of preferred languages查询默认值。
答案 2 :(得分:14)
要获取当前设备语言,请改用:
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];
答案 3 :(得分:6)
对我们来说,问题是我们在开发方案中覆盖了应用程序语言和应用程序区域。确保在方案选项(编辑方案 - >选项)中将应用程序语言设置为系统语言。
答案 4 :(得分:4)
对我而言,
NSString *localeString = [[NSLocale currentLocale] localeIdentifier];
和
NSArray *array = [NSLocale preferredLanguages];
self.label.text = array[0];
当您在模拟器中时,会产生相同的结果。
答案 5 :(得分:3)
我遇到了一个问题,即在设置为法语的设备上用英语格式化月份名称。
我的解决方案是使用它:
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0] ];
[self.monthNameFormatter setLocale:locale];
[self.monthNameFormatter setDateFormat:@"MMMM"];
[self.monthNameFormatter stringFromDate:myDate];
答案 6 :(得分:2)
我发现如果我退出“en_US”,但是“en”本地化是“en_US”的副本,模拟器会自动开始尊重语言设置,但只要“en_US”是一个选项,它总是无论设置如何,都会选择它。
答案 7 :(得分:1)
问题太旧了,但这段代码可能会对很多人有所帮助:
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]));
这是什么?如果设备的当前语言是西班牙语,英语或葡萄牙语,则使用应用程序使用本地化字符串,另一方面,如果当前语言不是其中之一且应用程序不支持,则设置为英语。
答案 8 :(得分:0)
在真正的iPad上显示正确的区域设置。 但是,模拟器有自己的iOS,默认设置为en-US。 转到模拟器iOS首选项并切换语言&区域到你想要的那个。
这就是诀窍。