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

时间:2009-10-05 20:28:56

标签: iphone objective-c cocoa internationalization

我正在进行国际化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);

9 个答案:

答案 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];

如下所述: Getting current device language in iOS?

答案 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首选项并切换语言&区域到你想要的那个。

这就是诀窍。