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

时间:2010-10-11 21:58:09

标签: ios objective-c cocoa-touch nslocale

我想显示设备用户界面正在使用的当前语言。我会用什么代码?

我希望将其作为完全拼写格式的NSString。 (不是@“en_US”)

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

32 个答案:

答案 0 :(得分:782)

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

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

这将返回当前所选语言的双字母代码。英语为“en”,西班牙语为“es”,德语为“de”等。有关更多示例,请参阅此维基百科条目(特别是639-1专栏):

List of ISO 639-1 codes

然后将两个字母代码转换为您想要显示的字符串就可以了。所以如果它是“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's answer

答案 1 :(得分:272)

所选答案将返回当前设备语言,但不会返回应用中使用的实际语言。如果您未在应用中为用户的首选语言提供本地化,则会使用按用户首选订单排序的第一个可用本地化。

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

[[NSBundle mainBundle] preferredLocalizations];

示例:

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

夫特:

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

答案 2 :(得分:83)

iOS 9解决方案:

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

语言=" en-US"

NSDictionary *languageDic = [NSLocale componentsFromLocaleIdentifier:language];

languageDic将拥有所需的组件

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

countryCode =" US"

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

languageCode =" en"

答案 3 :(得分:63)

这可能会给你你想要的东西:

NSLocale *locale = [NSLocale currentLocale];

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

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

Français (France)
English (United States)

答案 4 :(得分:33)

warning所接受的答案和其他答案均未考虑首选语言可能是设备语言以外的其他语言

设备语言是显示操作系统元素和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. 西班牙语(设备语言)
  3. 首选语言列表可以中进行编辑: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)
        }
    } 
    

答案 5 :(得分: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

答案 6 :(得分: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);

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

答案 7 :(得分:8)

即使有更好的方法来获取当前的设备语言。让我们通过以下代码尝试 -

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

Abizernhere

的建议

答案 8 :(得分:7)

您可以使用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)

答案 9 :(得分:5)

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

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

答案 10 :(得分:5)

我试图为自己找到合适的解决方案。当我使用Locale.preferredLanguages.first时,您的应用设置会返回首选语言。

如果您想通过用户设备设置了解语言,则应使用以下字符串:

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

答案 11 :(得分:5)

夫特

获取设备的当前语言

String.valueOf

获取应用程序语言

quoteAsString

注意:

它获取您在info.plist的 CFBundleDevelopmentRegion 中提供的语言

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

答案 12 :(得分:3)

如果您正在寻找首选语言代码(“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)!
}

}

答案 13 :(得分:3)

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

答案 14 :(得分:3)

Swift 3

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

答案 15 :(得分:3)

Swift

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

答案 16 :(得分:3)

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

答案 17 :(得分:3)

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

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

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

答案 18 :(得分:2)

如果你想在这里得到唯一的语言是我建议的答案:

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

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

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

langplusreg = ja-JP

langonly = ja

答案 19 :(得分: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;

}

答案 20 :(得分:1)

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

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

答案 21 :(得分:1)

更新了Swift 4的答案

let language = Bundle.main.preferredLocalizations.first

答案 22 :(得分:0)

在Swift 4.2和Xcode 10.1中

{{1}}

答案 23 :(得分:0)

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)

答案 24 :(得分:0)

我实际上误读了原始问题,以为它询问的是“应用程序用户界面”语言(这就是我用谷歌搜索的语言),而不是“设备用户界面”,在这种情况下,最佳答案应该是使用{{1 }},但是这些答案仍然为您提供了代码,还需要执行一个步骤来显示漂亮的字符串。 因此,虽然已经回答了“设备UI”语言,但是如果您想显示一个漂亮的字符串,则说明您当前正在使用哪种UI语言,显然最简单的解决方案是:

preferredLocalizations

在您的每个UI本地化版本中,都按照您希望的显示方式进行了指定。例如。在NSLocalizedString(@"currentLanguage", @"") 文件的en版本中,您将拥有:

.strings

在您拥有的"currentLanguage"="English"; 文件的fr版本中:

.strings

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

答案 25 :(得分:0)

显然,解决方案依赖于

[[NSLocale preferredLanguages] objectAtIndex:0]

通常可以正常工作并返回当前的设备语言。

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

如果您想要获取此值的应用已经更改了语言,例如使用此类代码:

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

在这种情况下,[NSLocale preferredLanguages] 实际上会返回此特定应用中的首选语言集(并使用),而不是当前的设备语言!

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

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

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

希望得到这个帮助。

答案 26 :(得分: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;
}

答案 27 :(得分:0)

对于Swift 3:

NSLocale.preferredLanguages [0] as String

答案 28 :(得分:0)

Swift中的@amir响应:

onRefreshToken

答案 29 :(得分:0)

两种字母格式。 Apple使用ISO standard ISO-3166

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

答案 30 :(得分:0)

根据Apple documentation

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

答案 31 :(得分:-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
    }
}

我希望这会有所帮助!