Разбор языковых кодов ISO-639 для отображения полных названий английского языка - PullRequest
2 голосов
/ 09 ноября 2011

У меня есть приложение в магазине приложений, которое позволяет запускать приложения на разных языках. Вы можете увидеть скриншот здесь: http://linguaswitch.com/

Вы не можете видеть его на этом скриншоте, но приложение использует NSBundle -localizations в качестве массива для заполнения всплывающего меню.

Apple перешла от «английского» к «en» в более поздних версиях Xcode. NSBundle -localizations возвращает все, что находится в пакете. Поэтому, если приложение старое (например, iCal / Pages), вы получаете «Dutch», «English», «pt», «es», «it», то есть смесь в зависимости от того, когда была добавлена ​​локализация.

Apple попросила разобрать этот список. Так что это "удобно для пользователя". Мне нужно, чтобы он создал массив, который снова разбирает двухбуквенные коды ISO-639 на полные английские имена.

Есть какие-нибудь намеки на то, как я могу подойти к этому? Спасибо!

Ответы [ 4 ]

8 голосов
/ 10 ноября 2011

Я предполагаю, что Apple хочет, чтобы вы отобразили список

  • английский
  • португальская
  • Французский

Или по французской системе

  • Anglais
  • Portugais
  • Francais

Таким образом, вам нужно превратить языковые коды 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);
        }
    }
}
3 голосов
/ 09 ноября 2011

Здесь записывается английское отображаемое имя кода языка fr.

NSLocale *enLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en"] autorelease];
NSString *displayNameString = [enLocale displayNameForKey:NSLocaleIdentifier value:@"fr"];
NSLog(displayNameString);
1 голос
/ 23 марта 2018

Swift 4 : получение имени языка для кода на основе текущего языка устройства пользователя

let language = Locale.current.localizedString(forLanguageCode: "ar")
print(language) // Arabic (if the user's device language is English)
1 голос
/ 10 января 2018

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 (код: "ar")

выход: арабский

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...