在iOS中获取当前的设备语言?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在iOS中获取当前的设备语言?相关的知识,希望对你有一定的参考价值。
我想显示设备UI正在使用的当前语言。我会用什么代码?
我希望这是一个完全拼写格式的NSString
。 (不是@“en_US”)
编辑:对于那些开车的人来说,这里有很多有用的评论,因为答案随着新的ios版本的发展而演变。
提供的解决方案实际上将返回设备的当前区域 - 而不是当前选定的语言。这些往往是同一个。但是,如果我在北美并将语言设为日语,我的地区仍将是英语(美国)。要检索当前选择的语言,您可以执行以下操作:
NSString * language = [[NSLocale preferredLanguages] firstObject];
这将返回当前所选语言的双字母代码。英语为“en”,西班牙语为“es”,德语为“de”等。有关更多示例,请参阅此Wikipedia条目(特别是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
对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中获取当前的设备语言?的主要内容,如果未能解决你的问题,请参考以下文章