我需要在iOS中获得类似en_US
或es_ES
的字符串。
显而易见的方法是使用[NSLocale currentLocale]
并从那里获取语言信息。但是,这会为您提供“区域格式”而不是实际的设备语言,这意味着如果您使用英语设备语言但区域格式为“西班牙”,则会错误地报告es_ES
。
如果您需要设备语言,则必须执行以下操作:
[[NSLocale preferredLanguages] objectAtIndex:0]
但是,这只会为您提供语言,因此您可以获得en
或es
之类的内容,而不会使用国家/地区代码。
如何像Safari一样正确获取国家/地区代码?
答案 0 :(得分:3)
尝试使用此代码:
NSString *locale = [[NSLocale currentLocale] localeIdentifier];
NSRange startRange = [locale rangeOfString:@"_"];
NSString *result = [locale stringByReplacingCharactersInRange:NSMakeRange(0, startRange.length+1) withString:[[NSLocale preferredLanguages] objectAtIndex:0]];
DebugLog(@"current locale: %@", result);
答案 1 :(得分:2)
好的,看到从iOS获取正确的信息可能是不可能的,这是一个hackish解决方案,但它提供了我需要的输出。它不完整,在某些情况下不会给出精确的输出(比如阿拉伯语),但它是我能得到的最好的。
const string lang = [[[NSLocale preferredLanguages] objectAtIndex:0] UTF8String];
// Search the language with country code in the langs map
static std::map<string, string> langMap;
static bool initialized = false;
if(!initialized) {
#define LANG(l, c) langMap.insert(std::make_pair(#l, #c))
LANG(en, en-us); LANG(es, es-es); LANG(fr, fr-fr); LANG(de, de-de);
LANG(ja, ja-jp); LANG(nl, nl-nl); LANG(it, it-it); LANG(pt, pt-br);
LANG(da, da-dk); LANG(fi, fi-fi); LANG(nb, nb-no); LANG(sv, sv-se);
LANG(ko, ko-kr); LANG(ru, ru-ru); LANG(pl, pl-pl); LANG(tr, tr-tr);
LANG(uk, uk-ua); LANG(hr, hr-hr); LANG(cs, cs-cz); LANG(el, el-gr);
LANG(he, he-il); LANG(ro, ro-ro); LANG(sk, sk-sk); LANG(th, th-th);
LANG(ca, ca-es); LANG(hu, hu-hu); LANG(vi, vi-vn);
LANG(zh-Hans, zh-cn); LANG(pt-PT, pt-pt); LANG(id, id); LANG(ms, ms);
LANG(zh-Hant, zh-tw); LANG(en-GB, en-gb); LANG(ar, ar);
#undef LANG
initialized = true;
}
map<string,string>::iterator it = langMap.find(lang);
if( it != langMap.end() ){
return it->second;
}
// Didn't find a country code, default to the lang name
return lang;
答案 2 :(得分:1)
检查以下代码:
NSArray *langs = [NSLocale preferredLanguages];
for (NSString *lang in langs) {
NSLog(@"%@: %@ %@",lang, [NSLocale canonicalLanguageIdentifierFromString:lang], [[[NSLocale alloc] initWithLocaleIdentifier:lang] displayNameForKey:NSLocaleIdentifier value:lang]);
}
答案 3 :(得分:1)
答案 4 :(得分:0)
我现在正在使用它。我运行了一些测试用例似乎没问题,但我不相信它是一个强大的解决方案。我很惊讶没有找到这个简单问题的明确答案。我不推荐我的解决方案,但我希望它可以产生讨论。
NSLocale *locale = [NSLocale currentLocale];
NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];
NSString *language = [[NSLocale preferredLanguages] firstObject];
NSString *myLocale = [NSString stringWithFormat:@"%@_%@",language,countryCode];
NSLocale *userLocale = [[NSLocale alloc] initWithLocaleIdentifier:myLocale];
NSDate* now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"E MMM d yyyy HH:mm" options:0 locale:userLocale];
答案 5 :(得分:0)
只需这样做:
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
NSString *formattedStr = [NSString stringWithFormat:@"%@_%@",language, locale];
NSLog(@"%@", formattedStr); // Display en_US for example
答案 6 :(得分:0)
一种替代方法是从当前语言环境的组件中重建语言环境,交换所需的语言。
例如,要获取当前语言环境,但已修改为使用UIKit当前用于显示应用程序的语言:
let languageCode = Bundle.main.preferredLocalizations.first ?? "en"
var components = Locale.components(fromIdentifier: Locale.current.identifier)
components[NSLocale.Key.languageCode.rawValue] = languageCode
let locale = Locale(identifier: Locale.identifier(fromComponents: components))