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


82

我正在将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);

有什么简单的我想念的吗?偏好还是进口?

我曾经做过的事:

正如Darren的答案所暗示的那样,我要查找的首选项不在中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);

Answers:


36

与其直接使用未公开的密钥查询默认值,不如向NSLocale询问首选语言的数组


@PeterHosey对于当前的语言,我也有类似的问题,并尝试了所有方法,但没有一个起作用。真可悲...您可以看看这个吗,stackoverflow.com/questions/26572115/…?谢谢!
S1U 2014年

@ s1u Xcode 6.1中存在一个错误。检查此答案:stackoverflow.com/a/26641497/1085556
Bart van Kuik 2014年

@ s1u:几件事情:(1)可以有多种首选语言;没有单一的“当前语言”,并且(2)关于您(已删除)的答案返回了当前语言环境(也就是地区)的主要语言,而不是用户的首选语言。
Peter Hosey 2014年

2
AppleLanguages密钥不无证,它是唯一记载的方式来获得对系统用户的首选语言OS X 10.5之前(其中,这几天是非常罕见的,但尽管如此,记录)。
dreamlax

58

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


谢谢Darren,这让我开始了,我还想出了如何获得当前的语言设置,这正是我真正想做的。
prairiedogg

2
嗨Prairiedogg,您如何获得当前的语言设置?我也有同样的问题。所有语言都返回EN值。
Zaldy 2010年

@ZaldzBugz:类似:NSLocale * locale = [NSLocale currentLocale]; NSString * lang = [locale displayNameForKey:NSLocaleIdentifier value:[[NSLocale preferredLanguages] objectAtIndex:0]];
powerj1984 2012年

3
在iOS 8上不是这种情况。如果您的语言是德语,而您所在的地区是美国,则iOS 8将返回“ de_US”。这是它应该做的。
各地,2015年

例如,用户去澳大利亚时,该区域会自动更新吗?
Nagendra Rao


9

对我们来说,问题在于我们在开发方案中覆盖了应用程序语言和应用程序区域。确保在方案选项(“编辑方案->选项”)中将“应用程序语言”设置为“系统语言”。


感谢Simon指出了这方面...为了进行测试,我已将其设置为本地语言,但后来我忘记对其进行更改。
Ameer

就是这样!简直不敢相信这是一个将其弄乱的Xcode设置。
Pedro

这节省了我的培根!谢谢。
柯比托德

4

对我来说

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

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

当您在模拟器中时,会产生相同的结果。


2
实际上,就我而言,在iOS 8 / Xcode 6上始终en_US
Adrian

3

我遇到一个问题,即在设置为法语的设备上以英语格式化月份名称。

我的解决方案是使用此:

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

我发现[NSLocale currentLocale]在iOS10中将月份名称正确翻译为法语,但在iOS11中却没有。使用:NSLocale * locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]]; 解决了问题。感谢本+1
鸟人

2

我发现如果我将“ en_US”留在外面,但是有一个“ en”本地化版本是“ en_US”的副本,则模拟器会自动开始尊重语言设置,但是只要“ en_US”是一个选项,它就会始终选择它的设置。


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]));

这是什么 另一方面,如果设备的当前语言是西班牙语,英语或葡萄牙语,则应用程序将使用本地化的字符串,而如果当前语言不是其中一种,并且应用程序不支持,则将其设置为英语。


0

在实际的iPad上,它显示正确的语言环境。但是,模拟器具有自己的iOS,默认情况下将其设置为en-US。转到模拟器的iOS首选项,然后将语言和地区切换为所需的语言和地区。

这样就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.