#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»)
вывод: арабский