如何获取当前应用程序的语言环境?

15
我需要获取当前的地区设置。不是用户的地区设置,而是我的应用程序的地区设置。
假设我的应用程序有两个本地化选项(在项目设置中):英语(默认)和法语。如果用户在iPhone上设置了法语语言,则我的应用程序将显示法语界面。如果用户在iPhone上设置了德语语言,则我的应用程序将显示英语界面(因为英语是默认语言)。
那么我该如何获取当前正在显示的应用程序地区设置呢? 提前感谢您的回复。
6个回答

31

可能有比这更简单的方法(请参见其他答案),但是这种方法最为健壮,只要通过“strings”文件本地化应用程序的一般原则不会过时,此方法就可以工作。

通常情况下,并不需要获取应用程序语言环境(但是请继续阅读,这是可能的!)。如果您需要本地化文本,则使用NSLocalizedString()。如果您需要本地化图像,则使用本地化资源等。然而,我能想到的一些原因使得获取“应用程序语言环境”成为一件好事:例如用于分析目的(您希望知道您的应用程序使用的语言),或者为基于服务器的通信提供一致的单语言界面(例如,将服务器错误消息本地化为用户在应用程序中看到的相同语言)。

如果您想获取当前可见的应用程序的本地化信息,我假设您为每种受支持的语言设置了一个Localizable.strings文件。因此,在英语字符串文件中,您可以添加以下行:

"lang" = "en";

并且在法语字符串文件中,您需要添加以下行:

"lang" = "fr";

那么,您可以通过调用NSLocalizedString("lang") (Swift) 或 NSLocalizedString(@"lang") (Objective-C) 来获得应用程序的语言环境。当然,每当您向应用中添加新的本地化时,都需要在新的本地化字符串文件中设置一个“lang”条目。


23
所选答案返回当前设备的语言,但不会返回应用中实际使用的语言。如果您的应用程序没有为首选语言提供本地化:

所选答案返回当前设备的语言,但不会返回应用中实际使用的语言。如果您的应用程序没有为首选语言提供本地化:

NSString *language = NSBundle.mainBundle.preferredLocalizations.firstObject;

NSLocale *locale = NSLocale.currentLocale;
NSString *countryCode = [locale objectForKey:NSLocaleCountryCode];

NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSString *country = [usLocale displayNameForKey:NSLocaleCountryCode 
                                          value:countryCode];

NSLog(@"country: %@", country);

太好了!我能把它转换成NSLocale吗? - Alexander
在Stack Overflow上抄袭他人答案是不应该的,尤其是没有给予任何功劳。如果另一个问题的答案可以解决它,那么请投票将其关闭为重复问题,而不是抄袭答案。 - Fogmeister

14

在Swift 3中使用:

let language = Bundle.main.preferredLocalizations.first


4
您可以从语言环境中获取国家代码,方法如下:
NSLocale *currentLocale = [NSLocale currentLocale];  // get the current locale.
NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode];

获取国家代码,例如es(西班牙),fr(法国)等。

您可以将此代码映射到您的界面选择中。

希望这能帮助您。


1
您可以使用以下代码获取所选语言。
NSString * language = [[NSLocale preferredLanguages] objectAtIndex:0];

if ([language isEqualToString:@"fr"]){//French
    [do  your stuff]
}
else{//English

   [do  your stuff]
}

ISO 639-1代码列表

希望这能帮到你。


如上所述,这将为您提供iPhone系统语言。[[NSBundle mainBundle] preferredLocalizations].firstObject会给出应用程序语言与用户优先语言列表的“最佳匹配”。 - osxdirk

0
解决方案比提出的方案简单得多:
设备语言 let deviceLanguage = NSLocale.preferredLanguages.first
实际应用程序翻译 let language = Bundle.main.preferredLocalizations.first
例如,我将我的iPhone设置为英语-印度,但我的应用程序没有英语-印度翻译,只有英语-英国翻译:
Printing description of language:
"en-GB"
Printing description of deviceLanguage:
"en-IN"

1
由于某种原因, Locale.preferredLanguages [0] 只返回 en,没有国家代码。 - Parth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接