Анализ языковых кодов ISO-639 для отображения полных названий на английском языке

#objective-c

#objective-c

Вопрос:

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

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

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

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

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

Ответ №1:

Я предполагаю, что 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);
        }
    }
}
  

Комментарии:

1. Система не различает ч / б китайский упрощенный и традиционный. В качестве идентификатора просто указывается zh, а diplayName — китайский. В любом случае, спасибо за идею.

2. возможно, iso не различает их ч / б.

Ответ №2:

При этом регистрируется отображаемое на английском языке имя кода языка fr.

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

Ответ №3:

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

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

Ответ №4:

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)
    }
}
  

Использование:
пусть language = LanguageHelper.getLanguageStringFrom(код: «ar»)

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