提问人:ApplinguaRob 提问时间:11/9/2011 更新时间:3/24/2018 访问量:2960
解析 ISO-639 语言代码以显示完整的英语语言名称
Parsing ISO-639 language codes to show full English language names
问:
我在应用商店里有一个应用程序,可以让你启动不同语言的应用程序。您可以在此处查看屏幕截图:http://linguaswitch.com/
在该屏幕截图中看不到它,但该应用使用 NSBundle -localizations 作为数组来填充弹出菜单。
Apple 在更高版本的 Xcode 中从“英语”改为“en”。NSBundle -localizations 返回捆绑包中的任何内容。因此,如果一个应用程序是旧的(如 iCal / Pages),那么你会得到“荷兰语”、“英语”、“pt”、“es”、“it”,即根据添加本地化的时间混合而成。
苹果已经要求我解析这个列表。所以它是“用户友好”的。我需要它创建某种数组,将 ISO-639 双字母代码再次解析为全英文名称。
关于我如何处理这个问题的任何提示?谢谢!
答:
3赞
Jef
11/9/2011
#1
这将记录 fr 语言代码的英文显示名称。
NSLocale *enLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en"] autorelease];
NSString *displayNameString = [enLocale displayNameForKey:NSLocaleIdentifier value:@"fr"];
NSLog(displayNameString);
8赞
puzzle
11/10/2011
#2
我假设 Apple 希望您显示一个列表
- 英语
- 葡萄牙
- 法语
或者在法国系统上
- 盎格鲁人
- 葡萄牙人
- 弗朗西斯
因此,您需要将 ISO 语言代码转换为用户友好的本地化显示名称。此外,还需要获取未使用 ISO 语言代码命名的 .lproj 捆绑包的 ISO语言代码。为此,您需要一个查找表,例如:
NSLocale *englishLocale;
NSMutableDictionary *reverseLookupTable;
englishLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en"];
reverseLookupTable = [NSMutableDictionary dictionaryWithCapacity:
[[NSLocale ISOLanguageCodes] count]
];
for (NSString *languageCode in [NSLocale ISOLanguageCodes]) {
NSString *displayName;
displayName = [[englishLocale
displayNameForKey:NSLocaleLanguageCode
value:languageCode
] lowercaseString];
if (displayName) {
[reverseLookupTable setObject:languageCode forKey:displayName];
}
}
[englishLocale release];
然后
// Find a pretty display name for a few sample languages
NSArray *testLanguages;
testLanguages = [NSArray arrayWithObjects:
@"en", @"fr", @"German", @"de", @"Italian", @"Some non-existing language", nil
];
for (NSString *language in testLanguages) {
if ([[NSLocale ISOLanguageCodes] containsObject:[language lowercaseString]]) {
// seems this already is a valid ISO code
NSLog(
@"%@ - %@",
language,
[[NSLocale currentLocale] displayNameForKey:NSLocaleLanguageCode value:language]
);
} else {
// try finding an ISO code from our table
NSString *isoCode;
isoCode = [reverseLookupTable objectForKey:[language lowercaseString]];
if (isoCode) {
// yay
NSLog(
@"%@ - %@",
language,
[[NSLocale currentLocale] displayNameForKey:NSLocaleLanguageCode value:isoCode]
);
} else {
// no result ... chances are this is not a real language, but hey
NSLog(@"%@ - no result", language);
}
}
}
评论
0赞
bikram990
5/29/2015
系统不区分黑白、简体中文和繁体。它只是给出 zh 作为标识符,diplayName 是中文。无论如何,感谢您的想法。
0赞
bikram990
5/29/2015
可能是 ISO 不区分黑白。
1赞
abhimuralidharan
1/10/2018
#3
斯威夫特 3.2+:
import Foundation
struct LanguageHelper {
static func getLanguageStringFrom(code:String) -> String? {
let locale: NSLocale? = NSLocale(localeIdentifier: "en")
return locale?.displayName(forKey: .identifier, value: code)
}
}
用法: let language = LanguageHelper.getLanguageStringFrom(code: “ar”)
输出:阿拉伯语
3赞
fethica
3/24/2018
#4
Swift 4:根据用户设备当前语言获取代码的语言名称
let language = Locale.current.localizedString(forLanguageCode: "ar")
print(language) // Arabic (if the user's device language is English)
评论