在iOS中获取当前设备语言?

我想要显示设备UI使用的当前语言。我应该使用什么代码?

我想把它作为一个完整拼写格式的NSString。(@ en_US)

编辑:对于那些开车路过的人来说,这里有大量有用的评论,因为随着新iOS版本的发布,答案也在不断变化。

260491 次浏览

这可能会给你你想要的:

NSLocale *locale = [NSLocale currentLocale];


NSString *language = [locale displayNameForKey:NSLocaleIdentifier
value:[locale localeIdentifier]];
它将在语言本身中显示语言的名称。 例如:< / p >
Français (France)
English (United States)

你可以使用NSLocaledisplayNameForKey:value:方法:

// get a French locale instance
NSLocale *frLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"] autorelease];


// use it to get translated display names of fr_FR and en_US
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"fr_FR"]);
NSLog(@"%@", [frLocale displayNameForKey:NSLocaleIdentifier value:@"en_US"]);

这将打印出:

français (France)
anglais (États-Unis)

如果你为initWithLocaleIdentifier:displayNameForKey:value:方法指定了相同的区域设置标识符,那么它将为你提供该语言的本机名称。我发现,如果你删除国家代码,只使用fren,它也会从显示名称中省略国家(至少在Mac OS X上,不确定iOS)。

提供的解决方案实际上会返回设备的当前区域——而不是当前选择的语言。这些通常是同一件事。但是,如果我在北美,我将我的语言设置为日语,我的区域仍然是英语(美国)。为了检索当前选择的语言,你可以这样做:

NSString * language = [[NSLocale preferredLanguages] firstObject];

这将为当前选择的语言返回两个字母的代码。“en"对于英语,"es"对于西班牙语,"de"德语,等等。更多例子,请参阅维基百科的条目(特别是639-1列):

ISO 639-1编码列表

然后,将这两个字母的代码转换为您想要显示的字符串就很简单了。所以如果是“en"”,显示“English"”。

编辑

值得引用NSLocale.h中的头信息:

+ (NSArray *)preferredLanguages NS_AVAILABLE(10_5, 2_0); // note that this list does not indicate what language the app is actually running in; the [NSBundle mainBundle] object determines that at launch and knows that information

对应用程序语言感兴趣的人可以看看@mindvision的回答

对于MonoTouch c#开发人员使用:

NSLocale.PreferredLanguages.FirstOrDefault() ?? "en"

注:我知道这是一个iOS问题,但作为MonoTouch开发者,这个页面上的答案引导我走向正确的方向,我想分享一下结果。

选择的答案返回当前设备语言,但不是应用程序中使用的实际语言。如果你没有在应用程序中为用户的首选语言提供本地化,则使用第一个可用的本地化,按用户的首选顺序排序。

要发现在本地化中选择的当前语言,请使用

[[NSBundle mainBundle] preferredLocalizations];

例子:

NSString *language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];

迅速:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString

我用这个

    NSArray *arr = [NSLocale preferredLanguages];
for (NSString *lan in arr) {
NSLog(@"%@: %@ %@",lan, [NSLocale canonicalLanguageIdentifierFromString:lan], [[[NSLocale alloc] initWithLocaleIdentifier:lan] displayNameForKey:NSLocaleIdentifier value:lan]);
}

忽略内存泄漏..

结果是

2013-03-02 20:01:57.457 xx[12334:907] zh-Hans: zh-Hans 中文(简体中文)
2013-03-02 20:01:57.460 xx[12334:907] en: en English
2013-03-02 20:01:57.462 xx[12334:907] ja: ja 日本語
2013-03-02 20:01:57.465 xx[12334:907] fr: fr français
2013-03-02 20:01:57.468 xx[12334:907] de: de Deutsch
2013-03-02 20:01:57.472 xx[12334:907] nl: nl Nederlands
2013-03-02 20:01:57.477 xx[12334:907] it: it italiano
2013-03-02 20:01:57.481 xx[12334:907] es: es español

根据苹果文档

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];

对于获得用户设备当前语言使用以下它的代码,它为我工作。

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];

将诸如en_US这样的语言代码翻译成英语(美国)NSLocale的内置特性,而NSLocale并不关心你从哪里获得语言代码。因此,确实没有理由像公认的答案所建议的那样实现自己的翻译。

// Example code - try changing the language codes and see what happens
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
NSString *l1 = [locale displayNameForKey:NSLocaleIdentifier value:@"en"];
NSString *l2 = [locale displayNameForKey:NSLocaleIdentifier value:@"de"];
NSString *l3 = [locale displayNameForKey:NSLocaleIdentifier value:@"sv"];
NSLog(@"%@, %@, %@", l1, l2, l3);

打印:英语,德语,瑞典语

-(NSString *)returnPreferredLanguage { //as written text


NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
NSArray *preferredLanguages = [defaults objectForKey:@"AppleLanguages"];
NSString *preferredLanguageCode = [preferredLanguages objectAtIndex:0]; //preferred device language code
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"]; //language name will be in English (or whatever)
NSString *languageName = [enLocale displayNameForKey:NSLocaleIdentifier value:preferredLanguageCode]; //name of language, eg. "French"
return languageName;


}

甚至还有更好的方法来获取当前设备语言。让我们试试下面的代码-

NSLog(@"Current Language - %@", [[NSLocale preferredLanguages] firstObject]);

Abizern在这里上建议

warning被接受的,和其他的答案都不考虑首选语言可以是设备语言以外的其他语言

设备的语言是用来表示操作系统元素和Apple应用程序的语言。

首选语言是用户希望将应用程序本地化的语言。苹果只提供有限的一组翻译。如果首选语言是苹果将其应用程序翻译成的一种语言,那么它也将是设备语言。设备和首选语言不匹配. 然而(如果用户更喜欢苹果没有提供翻译的语言)。设备语言将不在首选语言列表的第一位置。

下面的函数将遍历首选语言列表,并检查Apple框架中是否有翻译。第一种有翻译的语言是设备语言。函数将返回其语言代码。

func deviceLanguage() -> String? {
let systemBundle: NSBundle = NSBundle(forClass: UIView.self)
let englishLocale: NSLocale = NSLocale(localeIdentifier: "en")


let preferredLanguages: [String] = NSLocale.preferredLanguages()


for language: String in preferredLanguages {
let languageComponents: [String : String] = NSLocale.componentsFromLocaleIdentifier(language)


guard let languageCode: String = languageComponents[NSLocaleLanguageCode] else {
continue
}


// ex: es_MX.lproj, zh_CN.lproj
if let countryCode: String = languageComponents[NSLocaleCountryCode] {
if systemBundle.pathForResource("\(languageCode)_\(countryCode)", ofType: "lproj") != nil {
// returns language and country code because it appears that the actual language is coded within the country code aswell
// for example: zh_CN probably mandarin, zh_HK probably cantonese
return language
}
}


// ex: English.lproj, German.lproj
if let languageName: String = englishLocale.displayNameForKey(NSLocaleIdentifier, value: languageCode) {
if systemBundle.pathForResource(languageName, ofType: "lproj") != nil {
return languageCode
}
}


// ex: pt.lproj, hu.lproj
if systemBundle.pathForResource(languageCode, ofType: "lproj") != nil {
return languageCode
}
}


return nil
}

如果首选语言列表是:

  1. 南非荷兰语(iOS系统未翻译成南非荷兰语)
  2. 西班牙(设备语言)

首选语言列表可以是编辑在: Settings。app ->通用->语言&Region ->首选语言顺序


您可以使用设备语言代码并将其转换为语言名称。下面几行将以设备语言打印设备语言。例如,如果设备设置为西班牙语,则为“Español”。

if let deviceLanguageCode: String = deviceLanguage() {
let printOutputLanguageCode: String = deviceLanguageCode
let printOutputLocale: NSLocale = NSLocale(localeIdentifier: printOutputLanguageCode)


if let deviceLanguageName: String = printOutputLocale.displayNameForKey(NSLocaleIdentifier, value: deviceLanguageCode) {
// keep in mind that for some localizations this will print a language and a country
// see deviceLanguage() implementation above
print(deviceLanguageName)
}
}

如果你只想得到语言,这里是我建议的答案:

NSString *langplusreg = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString * langonly = [[langplusreg componentsSeparatedByString:@"-"]
objectAtIndex:0];

在我的情况下,我只是想Locale语言而不是Locale区域。

< p >输出: 如果你的区域语言是日语,区域区域是日本,那么:

langplusreg = ja-JP

Langonly = ja

iOS13, Swift 5+

Locale.preferredLanguages.first

iOS 9的解决方案:

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic将拥有所需的组件

NSString *countryCode = [languageDic objectForKey:@"kCFLocaleCountryCodeKey"];

countryCode = "美国"

NSString *languageCode = [languageDic objectForKey:@"kCFLocaleLanguageCodeKey"];

languageCode = "en"

两封信的格式。苹果使用ISO标准ISO-3166

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];

斯威夫特

获取设备的当前语言

NSLocale.preferredLanguages()[0] as String

获取应用程序语言

NSBundle.mainBundle().preferredLocalizations[0] as NSString

注意:

它获取你在info.plist的CFBundleDevelopmentRegion中给出的语言

如果info中的CFBundleAllowMixedLocalizations为真。plist info中CFBundleLocalizations的第一项。返回Plist

@amir在Swift中的回应:

// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]

Swift:

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String

对于Swift 3:

NSLocale。preferredLanguages[0]作为字符串

我试图为自己找出正确的解决办法。当我使用Locale.preferredLanguages.first返回首选语言从你的应用程序设置。

如果你想从用户设备设置中了解语言,你应该使用下面的字符串:

斯威夫特3

let currentDeviceLanguage = Locale.current.languageCode
// Will return the optional String

要展开并使用,请看下面这行:

if let currentDeviceLanguage = Locale.current.languageCode {
print("currentLanguage", currentDeviceLanguage)


// For example
if currentDeviceLanguage == "he" {
UIView.appearance().semanticContentAttribute = .forceRightToLeft
} else {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
}

斯威夫特3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)

从iOS 9开始,如果你只想要语言代码而不需要国家代码,你将需要这种帮助函数——因为语言将包含国家代码。

// gets the language code without country code in uppercase format, i.e. EN or DE
NSString* GetLanguageCode()
{
static dispatch_once_t onceToken;
static NSString* lang;
dispatch_once(&onceToken, ^
{
lang = [[[NSLocale preferredLanguages] objectAtIndex:0] uppercaseString];
NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^[A-Za-z]+" options:0 error:nil];
NSTextCheckingResult* match = [regex firstMatchInString:lang options:0 range:NSMakeRange(0, lang.length)];
if (match.range.location != NSNotFound)
{
lang = [lang substringToIndex:match.range.length];
}
});
return lang;
}

显然,解决方案依赖于,例如

[[NSLocale preferredLanguages] objectAtIndex:0]

通常工作正常,并返回当前设备语言。

但在某些情况下,它可能会产生误导:

如果你想要获取这个值的应用程序已经改变了语言,例如使用这样的代码:

NSString *lg = @"en"; // or anything like @"en", @"fr", etc.
[[NSUserDefaults standardUserDefaults]
setObject:[NSArray arrayWithObjects:lg, nil]
forKey:@"AppleLanguages"]

在本例中,[NSLocale preferredLanguages] 实际上返回这个特定应用程序的首选语言集(和使用的),而不是当前设备语言!

和…在这种情况下,正确获得实际当前设备语言(而不是之前在应用程序中设置的语言)的唯一方法是首先清除NSUserDefaults中的@"appleLanguages"键,像这样:

[[NSUserDefaults standardUserDefaults]removeObjectForKey:@"AppleLanguages"];

然后,[NSLocale preferredLanguages]现在返回正确的值。

希望这对你有所帮助。

简单Swift 3功能:

@discardableResult
func getLanguageISO() -> String {
let locale = Locale.current
guard let languageCode = locale.languageCode,
let regionCode = locale.regionCode else {
return "de_DE"
}
return languageCode + "_" + regionCode
}

如果您正在寻找首选语言代码(“&;en", &;de", &;es"…),和本地化的首选语言名称(当前地区),这是一个简单的扩展在Swift:

extension Locale {
static var preferredLanguageIdentifier: String {
let id = Locale.preferredLanguages.first!
let comps = Locale.components(fromIdentifier: id)
return comps.values.first!
}


static var preferredLanguageLocalizedString: String {
let id = Locale.preferredLanguages.first!
return Locale.current.localizedString(forLanguageCode: id)!
}
}

SWIFT-4

 // To get device default selected language. It will print like short name of zone. For english, en or spain, es.


let language = Bundle.main.preferredLocalizations.first! as NSString
print("device language",language)

Swift 4的更新答案

let language = Bundle.main.preferredLocalizations.first

对于Swift 3.0,下面的代码可以用来回答你的问题:

 let language = Bundle.main.preferredLocalizations.first! as NSString

在Swift 4.2和Xcode 10.1中

let language = NSLocale.preferredLanguages[0]
debugPrint(language)//en

在Swift 5.x中

let langStr = Locale.current.languageCode
debugPrint(langStr ?? "") //en  el

iOS13, Swift 5+, WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/ < / p >

用户可以独立于操作系统语言选择应用程序的首选语言。

你可以使用这些:

    // Returns a list of the user's preferred languages.
// Maybe more than (or none of) your app supports!
Locale.preferredLanguages


// a subset of this bundle's localizations, re-ordered into the preferred order
// for this process's current execution environment; the main bundle's preferred localizations
// indicate the language (of text) the user is most likely seeing in the UI
Bundle.main.preferredLocalizations






// The current running app language
Bundle.main.preferredLocalizations.first


// list of language names this bundle appears to be localized to
Bundle.main.localizations

斯威夫特中,有一种方法简单的回答来获取当前应用程序语言:

Locale(identifier: Bundle.main.preferredLocalizations[0]).languageCode!

它可以像这样切换,例如:

let supportUrl: URL = {
switch Locale(identifier: Bundle.main.preferredLocalizations[0]).languageCode {
case "de":
return Constants.supportUrlGerman


default:
return Constants.supportUrlEnglish
}
}

我希望这能有所帮助!

我实际上误解了原来的问题,以为它要求“应用程序ui”;语言(这是我在谷歌上搜索的),而不是“设备ui”,在这种情况下,最好的答案将是使用preferredLocalizations的答案,但这些答案仍然会给你一个代码,还有一个步骤来获得一个漂亮的字符串来显示。 所以,当“设备ui”;如果你想显示当前正在使用的你支持的UI语言的字符串,显然最简单的解决方案是:

NSLocalizedString(@"currentLanguage", @"")

在你的每一个UI本地化中你都指定了你想要的显示方式。例如,在你的.strings文件的en版本中,你会有:

"currentLanguage"="English";

在你的fr版本的.strings文件中,你会有:

"currentLanguage"="Francais";

等。不要混淆代码等,你可以让你自己的字符串很好地匹配你的UI。

< p > 快5.倍 < br > 我们可以使用设备语言 Locale.current.languageCode,但它将返回
en(英文),
zh(简体中文),
zh(繁体中文)

实际上,当我们得到一些像这样的东西时会更有帮助。
zh-Hans为简体中文,和
zh-Hant为中文-繁体

这里zh是语言代码,Hans是scriptCode。

解决方案:

extension Locale {
    

static var preferredLanguageNScripCodes: [String] {
Locale.preferredLanguages.compactMap {
if let scriptCode = Locale(identifier: $0).scriptCode,
let languageCode = Locale(identifier: $0).languageCode {
return languageCode + "-" + scriptCode
}
return Locale(identifier: $0).languageCode
}
}
}

例如:["zh-Hant", "en", "zh-Hans", "ko", "ja", "es", "de", "it", "fr", "en"]