В приложении 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
). Тьфу.
Update 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 (фактически все языки для каждого из этих языков)
Я предполагаю, что я всегда полагал, что NSDateFormatterStyle под контролем, что, если вы не дали полный формат даты. Я бы предположил, что NSDateFormatterMediumStyle даст короткие имена месяцев. –
Различные 'NSDateFormatterXXXStyle' предназначены для форматирования полной даты (день, месяц и год). Мне просто нужны месячные имена, как показано в приложении «Календарь». – rmaddy
Итак, вы хотите, чтобы название месяца, в стандартном формате локали, не имело ничего другого? «Мар» для en_US и «Marts» для de_DE? –