NSLocale загруженного языка в приложении
В моем интерфейсе я показываю отображаемое имя локали с этим:
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: identifier]
Но это дает отображаемое имя, используя языковой стандарт системы, который не всегда совпадает с языковым стандартом приложения. Например, если я установил систему на французском языке, а мое приложение не имеет французской локализации, оно отобразит французское отображаемое имя в английском интерфейсе. Вместо этого я хотел бы иметь английское отображаемое имя в английском интерфейсе, чтобы я не смешивал языки.
2 ответа
Я не уверен, что это то, что вам нужно... Но это отличный способ узнать, на каком языке / локализации работает ваше приложение:
[[NSBundle mainBundle] preferredLocalizations]
Если ваше приложение поддерживает английский и французский языки, оно вернет массив обоих в предпочтительном порядке. При тестировании, то, что в 0, кажется, XIB, который загружен и работает.
Вы должны создать plist-файл, который вы локализуете, в вашем plist-хранилище правильный идентификатор локали для соответствующей локализации, когда вы используете свой фрагмент кода, вы должны загрузить локаль из этого локализованного plist-файла и использовать ее для получения отображаемого имени.
Таким образом, ваш язык всегда будет соответствовать языку интерфейса на экране. Мне нужно было сделать это для некоторых дат, которые я хотел отформатировать, и не полагаться на систему, так как формат календаря мог быть установлен на другом языке для системы...
надеюсь, это поможет...
- (NSDictionary*)getLocalizedCalendarStrings{
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"calendar" ofType:@"plist"]; // will return the path of the plist in the right language-specific .lproj directory)
NSDictionary* calendar = [NSDictionary dictionaryWithContentsOfFile:plistPath];
return calendar;
}
И используйте это так:
NSDictionary * calendar = [self getLocalizedCalendarStrings];
NSString * localeIdentifier = [calendar objectForKey:@"locale_identifier"];
[[NSLocale currentLocale] displayNameForKey: NSLocaleIdentifier value: localeIdentifier]
Чтобы избежать риска того, что эти строки локали будут введены с ошибкой и т. Д., Или если вы хотите получить более качественное решение, ориентированное на код, вы, конечно, можете использовать свойство с именем default_language в качестве BOOL в plist и установить его в YES только для английского языка., в вашем коде просто проверьте это значение и, если оно НЕТ, то получите локаль устройства, если это ДА, тогда вы знаете, что приложение либо на английском, потому что это настройка устройства, либо на английском, потому что оно не поддерживать текущую локаль устройства и, следовательно, по умолчанию переключиться на английский... поэтому "default_language" должно быть YES, жестко закодировать локаль в en_US или en_UK, если вы патриотичный британец...
Нечто подобное этому примеру может решить вашу проблему, категорию для NSLocale, но, конечно, это заставит вас иметь локализованный список для каждого языка, который вы поддерживаете...
@implementation NSLocale (AppLocale)
+(NSString*)applicationCurrentLocale{
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"currentLocale" ofType:@"plist"];
NSDictionary* currentLocaleData = [NSDictionary dictionaryWithContentsOfFile:plistPath];
if([[currentLocaleData objectForKey:@"english_default"] boolValue] == YES){
return @"en_US";
}else{
NSString * deviceLocaleIdentifier = [[NSLocale currentLocale] localeIdentifier];
return [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:deviceLocaleIdentifier];
}
}
@end