446

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

我希望这是一个NSString完整的格式。(不是@“en_US”)

编辑:对于那些开车的人来说,这里有很多有用的评论,因为答案随着新的 iOS 版本而发展。

4

32 回答 32

821

提供的解决方案实际上将返回设备的当前区域 - 而不是当前选择的语言。这些通常是相同的。但是,如果我在北美并且我将语言设置为日语,我的地区仍将是英语(美国)。为了检索当前选择的语言,您可以执行以下操作:

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

这将为当前选择的语言返回一个两个字母的代码。“en”表示英语,“es”表示西班牙语,“de”表示德语等。更多示例,请参阅此 Wikipedia 条目(特别是 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 的回答

于 2010-11-19T01:41:14.150 回答
287

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

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

[[NSBundle mainBundle] preferredLocalizations];

例子:

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

迅速:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
于 2012-05-08T11:02:46.603 回答
88

iOS 9 的解决方案:

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

语言 = "en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic 将具有所需的组件

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

国家代码 = "美国"

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

语言代码 = "en"

于 2015-11-02T10:45:49.107 回答
65

这可能会给你你想要的:

NSLocale *locale = [NSLocale currentLocale];

NSString *language = [locale displayNameForKey:NSLocaleIdentifier 
                                         value:[locale localeIdentifier]];

它将以语言本身显示语言的名称。例如:

Français (France)
English (United States)
于 2010-10-11T22:04:52.050 回答
37

警告接受的和其他答案都没有考虑到首选语言可以是设备语言之外的另一种语言

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

首选语言是用户希望应用程序本地化的语言。Apple 仅提供一组有限的翻译。如果首选语言是 Apple 将其应用程序翻译成的一种语言,它也将是设备语言。但是,如果用户喜欢 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 -> 常规 -> 语言和地区 -> 首选语言顺序


您可以使用设备语言代码并将其翻译成语言名称。以下行将以设备语言打印设备语言。例如,如果设备设置为西班牙语,则为“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)
    }
} 
于 2015-05-18T01:29:48.440 回答
15

iOS13、Swift 5+、WWDC2019 https://developer.apple.com/videos/play/wwdc2019/403/

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

你可以使用这些:

    // 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
于 2019-10-18T08:56:21.957 回答
12

我用这个

    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
于 2013-03-02T12:39:41.643 回答
12

将诸如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);

印刷品:英语、德语、瑞典语

于 2013-07-24T14:14:26.530 回答
8

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

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

Abizern建议在这里

于 2013-10-23T13:01:39.367 回答
7

您可以使用以下displayNameForKey:value:方法NSLocale

// 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)

如果您为 theinitWithLocaleIdentifier:displayNameForKey:value:方法指定相同的语言环境标识符,那么它将为您提供语言的本机名称。我发现如果您删除国家代码并仅使用frand en,它也会从显示名称中省略国家(至少在 Mac OS X 上,不确定 iOS)。

于 2010-10-11T22:05:41.153 回答
7

我试图为自己找到正确的解决方案。当我使用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
    }
}
于 2016-12-27T17:07:42.073 回答
6

迅速

获取设备的当前语言

NSLocale.preferredLanguages()[0] as String

获取应用程序语言

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

笔记:

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

如果CFBundleAllowMixedLocalizations在 info.plist 中为真,则返回 info.plist中CFBundleLocalizations的第一项

于 2016-02-01T06:05:40.813 回答
5

要获取用户设备的当前语言,请使用以下对我有用的代码。

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
于 2013-06-27T12:34:45.063 回答
4

如果您正在寻找首选语言代码(“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)!
    }
}
于 2017-12-14T23:48:44.757 回答
3

对于 MonoTouch C# 开发人员,请使用:

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

注意:我知道这是一个 iOS 问题,但由于我是 MonoTouch 开发人员,因此此页面上的答案引导我朝着正确的方向前进,我想我会分享结果。

于 2012-04-10T19:51:50.683 回答
3

Swift

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
于 2016-10-06T07:40:36.833 回答
3

斯威夫特 3

let locale = Locale.current
let code = (locale as NSLocale).object(forKey: NSLocale.Key.countryCode) as! String?
print(code!)
于 2017-01-05T00:06:39.200 回答
3

简单的 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
}
于 2017-05-24T12:22:07.160 回答
2
-(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;

}
于 2013-10-08T13:39:28.097 回答
2

如果您只想在这里获得语言是我建议的答案:

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

就我而言,我只想要区域设置语言而不是区域设置区域。

输出:如果您的区域设置语言是日语并且区域设置区域是日本,那么:

langplusreg = ja-JP

langonly = ja

于 2015-10-08T05:45:44.930 回答
2

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

[[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] 现在返回正确的值。

希望这有帮助。

于 2017-03-07T12:20:42.847 回答
2

在 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
于 2019-04-10T10:31:07.107 回答
1

@amir 在 Swift 中的回应:

// Get language prefered by user
let langageRegion = NSLocale.preferredLanguages().first!
let languageDic = NSLocale.componentsFromLocaleIdentifier(langageRegion)
let language = languageDic[NSLocaleLanguageCode]
于 2016-07-18T10:33:09.440 回答
1

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)
于 2017-12-17T13:48:15.500 回答
1

我实际上误读了最初的问题,认为它要求的是“应用程序 UI”语言(这就是我用谷歌搜索的),而不是“设备 UI”,在这种情况下,最好的答案将是使用的那些preferredLocalizations,但这些答案仍然给出你是一个代码,还有一个步骤可以显示一个漂亮的字符串。因此,虽然已经回答了“设备 UI”语言,但如果您想显示一个漂亮的字符串,说明您当前正在使用您支持的哪种 UI 语言,显然最简单的解决方案是:

NSLocalizedString(@"currentLanguage", @"")

在您的每一个 UI 本地化中,您都已完全按照您希望的方式指定它。例如,在en您拥有的文件版本中.strings

"currentLanguage"="English";

在您拥有的文件fr版本中:.strings

"currentLanguage"="Francais";

等等。不要乱用代码等,您可以自己制作字符串以很好地匹配您的 UI。

于 2020-10-24T14:48:56.740 回答
0

根据苹果文档

NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
NSArray* languages = [defs objectForKey:@"AppleLanguages"];
NSString* preferredLang = [languages objectAtIndex:0];
于 2013-06-16T11:32:44.523 回答
0

两个字母格式。Apple 使用ISO 标准 ISO-3166

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
于 2016-01-31T08:51:44.007 回答
0

对于斯威夫特 3:

NSLocale.preferredLanguages[0] 作为字符串

于 2016-11-04T16:31:35.387 回答
0

从 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;
}
于 2017-01-24T00:07:21.390 回答
0

Swift 4 的更新答案

let language = Bundle.main.preferredLocalizations.first
于 2017-12-26T11:51:01.580 回答
0

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

 let language = Bundle.main.preferredLocalizations.first! as NSString
于 2018-04-10T07:08:39.360 回答
-1

Swift中,有一种更简单的方法来获取当前的应用程序语言:

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
    }
}

我希望这有帮助!

于 2019-12-06T11:44:58.120 回答