В iOS 7 или 8 приложение Calendar Calendar делает то, что мне не удалось выяснить.
В некоторых локалях, таких как en_US
, приложение "Календарь" показывает короткие (3-буквенные) месячные имена.
В других локалях, таких как de_DE
, приложение "Календарь" показывает полные имена месяцев. Интересно, что в локали en_DE
указаны короткие имена месяцев, поэтому, похоже, он привязан к языку больше, чем формат региона.
Я не могу понять, как узнать, какой формат месяца использовать.
Независимо от моего локали моего устройства, NSDateFormatter standaloneShortMonthSymbols
дает мне 3-буквенные месячные имена и NSDateFormatter standaloneMonthSymbols
дает мне полные месячные имена.
Также проверяется:
NSString *monthformat = [NSDateFormatter dateFormatFromTemplate:@"LLL" options:0 locale:[NSLocale currentLocale]];
и возвращает те же LLL
для en_US
и de_DE
.
Глядя на NSLocale
, не существует никакого значения, которое определяет, следует ли использовать короткие или полные имена месяцев.
В NSCalendar
, NSDateFormatter
или NSLocale
ничего не найдено, чтобы определить, какой формат месяца использовать.
Кто-нибудь знает, как это сделать?
Update:
Я думал, что нашел решение, но он не работает для всех локалей, которые я пробовал. Я выполнил следующий код с различными локалями, чтобы узнать, могу ли я найти что-то общее между локалями, которые показывают имена коротких и длинных месяцев в приложении "Календарь" :
NSLocale *locale = [NSLocale currentLocale];
NSString *locid = [locale localeIdentifier];
NSLog(@"Locale = %@", locid);
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSLog(@"monthSymbols = %@", [formatter monthSymbols]);
NSLog(@"shortMonthSymbols = %@", [formatter shortMonthSymbols]);
NSLog(@"veryShortMonthSymbols = %@", [formatter veryShortMonthSymbols]);
NSLog(@"monthStandaloneSymbols = %@", [formatter standaloneMonthSymbols]);
NSLog(@"shortStandaloneMonthSymbols = %@", [formatter shortStandaloneMonthSymbols]);
NSLog(@"veryShortStandaloneMonthSymbols = %@", [formatter veryShortStandaloneMonthSymbols]);
NSDate *date = [NSDate date];
[formatter setDateStyle:NSDateFormatterShortStyle];
NSLog(@"short date style: %@", [formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterMediumStyle];
NSLog(@"medium date style: %@", [formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterLongStyle];
NSLog(@"long date style: %@", [formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterFullStyle];
NSLog(@"full date style: %@", [formatter stringFromDate:date]);
[formatter setDateStyle:NSDateFormatterNoStyle];
[formatter setDateFormat:@"M"];
NSLog(@"M date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"MM"];
NSLog(@"MM date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"MMM"];
NSLog(@"MMM date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"MMMM"];
NSLog(@"MMMM date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"MMMMM"];
NSLog(@"MMMMM date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"L"];
NSLog(@"L date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"LL"];
NSLog(@"LL date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"LLL"];
NSLog(@"LLL date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"LLLL"];
NSLog(@"LLLL date format: %@", [formatter stringFromDate:date]);
[formatter setDateFormat:@"LLLLL"];
NSLog(@"LLLLL date format: %@", [formatter stringFromDate:date]);
Я тестировал с en_US
, en_GB
, es_ES
, de_DE
, fr_FR
и it_IT
. Французские и немецкие локаторы показывают полное имя месяца в приложении "Календарь" , а остальные показывают короткое имя.
Единственное, что выглядело многообещающим с тестовым кодом, состоит в том, что только в французском и немецком языках есть период в конце shortMonthSymbols
.
Итак, я запустил следующий код, чтобы найти все локали, которые используют знаки препинания в символах короткого месяца, а те, которые этого не делают:
NSMutableArray *hasDot = [[NSMutableArray alloc] init];
NSMutableArray *noDot = [[NSMutableArray alloc] init];
NSCharacterSet *letters = [NSCharacterSet letterCharacterSet];
NSArray *locales = [NSLocale availableLocaleIdentifiers];
for (NSString *locid in locales) {
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:locid];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:locale];
NSArray *shortNames = [formatter shortMonthSymbols];
//NSLog(@"locale: %@, short names: %@", locid, shortNames[10]);
NSString *nov = shortNames[10];
unichar char1 = [nov characterAtIndex:0];
unichar charN = [nov characterAtIndex:nov.length - 1];
if ([letters characterIsMember:char1] && [letters characterIsMember:charN]) {
[noDot addObject:locid];
} else {
[hasDot addObject:locid];
}
}
NSLog(@"no dot: %@", [noDot sortedArrayUsingSelector:@selector(compare:)]);
NSLog(@"has dot: %@", [hasDot sortedArrayUsingSelector:@selector(compare:)]);
Сканирование результатов я увидел, что голландские локали использовали период в коротких символах месяца. Но быстрый тест приложения "Календарь" показал, что приложение "Календарь" показало короткие месячные имена, когда устройство было установлено на голландский (nl_NL
). Тьфу.
Обновление 2:
Я проверил еще несколько локалей. Следующие имена показывают длинные месяцы:
fr_FR, de_DE, ru_RU, sv_SE (фактически все локали для каждого из этих языков)
следующее (и я уверен еще много) показывает короткий месяц:
en_US, en_GB, es_ES, it_IT, nl_NL, ca_ES, uk_UA, ro_RO (фактически все локали для каждого из этих языков)