Objective c 解析ISO-639语言代码以显示完整的英语语言名称

Objective c 解析ISO-639语言代码以显示完整的英语语言名称,objective-c,Objective C,我在app store上有一个应用程序,可以让你启动不同语言的应用程序。您可以在此处看到屏幕截图: 你在屏幕截图中看不到它,但应用程序使用NSBundle-localizations作为数组来填充弹出菜单 在Xcode的后续版本中,苹果从“英语”改为“英语”。NSBundle-本地化返回bundle中的任何内容。因此,如果一个应用程序是旧的(如iCal/Pages),那么你会得到“Dutch”、“English”、“pt”、“es”、“it”,也就是说,根据本地化添加的时间不同,它是一种混合 苹

我在app store上有一个应用程序,可以让你启动不同语言的应用程序。您可以在此处看到屏幕截图:

你在屏幕截图中看不到它,但应用程序使用NSBundle-localizations作为数组来填充弹出菜单

在Xcode的后续版本中,苹果从“英语”改为“英语”。NSBundle-本地化返回bundle中的任何内容。因此,如果一个应用程序是旧的(如iCal/Pages),那么你会得到“Dutch”、“English”、“pt”、“es”、“it”,也就是说,根据本地化添加的时间不同,它是一种混合

苹果要求我解析这个列表。因此,它是“用户友好的”。我需要它创建某种数组,将ISO-639两个字母的代码再次解析为英文全名


有没有关于我如何处理这个问题的提示?谢谢

这将记录fr语言代码的英文显示名称

NSLocale *enLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en"] autorelease];
NSString *displayNameString = [enLocale displayNameForKey:NSLocaleIdentifier value:@"fr"];
NSLog(displayNameString);

我假设苹果希望您显示

  • 英式
  • 葡萄牙语
  • 法语的
还是在法国系统上

  • 英国人
  • 葡萄牙
  • 法兰西
因此,您需要将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];
然后

Swift 3.2+:

用法: 让language=LanguageHelper.getLanguageStringFrom(代码:“ar”)


输出:阿拉伯语

Swift 4:根据用户设备的当前语言获取代码的语言名称

let language = Locale.current.localizedString(forLanguageCode: "ar")
print(language) // Arabic (if the user's device language is English)

系统不区分黑白简体中文和繁体中文。它只给出了zh作为标识符,diplayName是中文。不管怎样,谢谢你的想法。可能是iso没有区分它们。
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 = Locale.current.localizedString(forLanguageCode: "ar")
print(language) // Arabic (if the user's device language is English)