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

时间:2011-11-09 14:38:07

标签: objective-c

我在应用商店中有一个应用,可让您以不同语言启动应用。您可以在此处看到屏幕截图:http://linguaswitch.com/

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

Apple在Xcode的更高版本中从“英语”转移到“en”。 NSBundle -localizations返回bundle中的任何内容。因此,如果一个应用程序是旧的(如iCal / Pages),那么你得到“荷兰语”,“英语”,“pt”,“es”,“它”,即混合取决于添加本地化的时间。

Apple请求我解析此列表。所以它“用户友好”。我需要它创建某种类型的数组,再次将ISO-639双字母代码解析为完整的英文名称。

有关我如何处理此问题的任何提示?谢谢!

4 个答案:

答案 0 :(得分:8)

我认为Apple希望您显示

列表
  • 葡萄牙语

或者在法国系统上

  • 英语
  • Portugais
  • 的语言

因此,您需要将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);
        }
    }
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

Swift 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(代码:&#34; ar&#34;)

输出:阿拉伯语

答案 3 :(得分:1)

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

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