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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在iOS中获取当前的设备语言?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

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

对app语言感兴趣的人看看@mindvision's answer

另一答案

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

NSString * myString = [[NSLocale preferredlanguage]objectAtIndex:0];
另一答案

迅速

获取设备的当前语言

NSLocale.preferredLanguages()[0] as String

获取应用程序语言

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

注意:

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

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

另一答案

我试图为自己找到合适的解决方案。当我使用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
    }
}
另一答案

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

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

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

另一答案

Swift

let languageCode = NSLocale.currentLocale().objectForKey(NSLocaleLanguageCode) as? String
另一答案

斯威夫特3

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

简单的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)!
}

}

另一答案
-(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;

}
另一答案

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

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

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

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

langplusreg = ja-JP

langonly = ja

另一答案

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

要发现在本地化中使用的当前语言

[[NSBundle mainBundle] preferredLocalizations];

例:

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

迅速:

let language = NSBundle.mainBundle().preferredLocalizations.first as NSString
另一答案

更新了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]
print(language)//en
另一答案

根据Apple documentation

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

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

NSString *localeCountryCode = [[NSLocale autoupdatingCurrentLocale] objectForKey:NSLocaleCountryCode];
另一答案

Swift中的@amir响应:

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

对于Swift 3:

NSLocale.preferredLanguages [0] as String

另一答案

从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]

通常工作正常并返回当前的设备语言。以上是关于在iOS中获取当前的设备语言?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何获取设备当前语言设置?

如何在 IOS 中获取 ISO 语言代码?

iOS ---------- 获取设备的各种信息

iOS 获取设备的各种信息的方法

如何在 iOS 6 中以编程方式获取设备的当前方向?

如何获取系统设备语言,swift iOS