Unter iOS 7 oder 8, die Stock Calendar App tut etwas, was ich nicht herausfinden konnte.Wissen, wann Kurz- oder Vollmonatsnamen zu verwenden sind
Unter einigen Gebietsschemas wie zeigt die Kalender-App die kurzen (3-Buchstaben) Monatsnamen an.
Unter anderen Gebietsschemas wie de_DE
zeigt die Kalender-App die vollständigen Monatsnamen. Interessanterweise zeigt das Gebietsschema en_DE
die Namen der kurzen Monate an, so dass es anscheinend mehr an die Sprache gebunden ist als das Region-Format.
Was ich nicht herausfinden kann, ist, wie man das zu verwendende Monatsformat erkennt.
Unabhängig von der Ländereinstellung meines Geräts, NSDateFormatter standaloneShortMonthSymbols
gibt mir die 3-Buchstaben-Monatsnamen und NSDateFormatter standaloneMonthSymbols
gibt mir die vollständigen Monatsnamen.
Ist auch versucht:
NSString *monthformat = [NSDateFormatter dateFormatFromTemplate:@"LLL" options:0 locale:[NSLocale currentLocale]];
und das gibt die gleiche LLL
sowohl für en_US
und de_DE
zurück.
Mit Blick auf NSLocale
scheint es keinen Wert zu geben, der bestimmt, ob kurze oder vollständige Monatsnamen verwendet werden sollen.
In NSCalendar
, NSDateFormatter
oder NSLocale
scheint nichts zu sein, um festzustellen, welches Monatsformat verwendet werden soll.
Hat jemand eine Idee, wie man diese Bestimmung macht?
Update:
Ich dachte, ich eine Lösung gefunden, aber es funktioniert nicht für alle Gegenden, die ich versucht. Ich lief den folgenden Code mit verschiedenen Schauplätzen, um zu sehen, ob ich etwas gemeinsam zwischen Lokalisierungen, die den kurzen und langen Monate Namen in dem Kalender-App zeigen, finden kann:
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]);
ich mit en_US
, getestet hatte en_GB
, es_ES
, de_DE
, fr_FR
und it_IT
. Die französischen und deutschen Gebietsschemas zeigen den vollständigen Monatsnamen in der Kalender-App an, während der Rest den Kurznamen anzeigt.
Die eine Sache, die vielversprechend mit dem Test-Code sah, ist, dass nur die Französisch und Deutsch Gebietsschemas eine Periode am Ende der shortMonthSymbols
haben.
Also lief ich den folgenden Code alle Gegenden zu finden, die Zeichensetzung in den kurzen Monat Symbole und solche verwenden, die dies nicht tun:
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:)]);
Scanning durch die Ergebnisse sah ich, dass die niederländischen Gegenden einen Zeitraum verwendet in den kurzen Monatszeichen. Ein kurzer Test der Kalender-App ergab jedoch, dass die Kalender-App kurze Monatsnamen enthielt, als das Gerät auf Niederländisch eingestellt war (nl_NL
). Pfui.
Update 2:
ich ein paar mehr locales getestet haben.Die folgenden zeigen lange Monatsnamen:
fr_FR, de_DE, ru_RU, sv_SE (eigentlich alle Schauplätze für jede dieser Sprachen)
die folgenden (und ich bin sicher, dass viele mehr) zeigen die Kurz Monat:
en_US, de_DE, es_ES, it_IT, nl_NL, ca_ES, uk_UA, ro_RO (eigentlich alle Schauplätze für jede dieser Sprachen)
Ich glaube, ich dachte immer, dass NSDateFormatterStyle gesteuert, dass, wenn Sie nicht ein volles Datumsformat geben hat. Ich würde vermuten, dass NSDateFormatterMediumStyle die kurzen Monatsnamen geben würde. –
Die verschiedenen 'NSDateFormatterXXXStyle' dienen zum Formatieren eines vollständigen Datums (Tag, Monat und Jahr). Ich brauche nur die Monatsnamen wie in der Kalender App. – rmaddy
Sie möchten also den Monatsnamen im Standardgebietsschema-Format ohne etwas anderes? "Mar" für en_US und "Marts" für de_DE? –