#if defined(__WXOSX__)
#include "wx/osx/core/cfref.h"
#include <CoreFoundation/CFLocale.h>
+ #include <CoreFoundation/CFDateFormatter.h>
#include "wx/osx/core/cfstring.h"
#endif
#elif defined(__UNIX__)
// Test if setting the locale works, then set it back.
- const char *oldLocale = wxSetlocale(LC_ALL, "");
- const char *tmp = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName);
- if ( !tmp )
+ const char *oldLocale = wxSetlocaleTryUTF8(LC_ALL, info->CanonicalName);
+ if ( !oldLocale )
{
// Some C libraries don't like xx_YY form and require xx only
- tmp = wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName));
- if ( !tmp )
+ oldLocale = wxSetlocaleTryUTF8(LC_ALL, ExtractLang(info->CanonicalName));
+ if ( !oldLocale )
return false;
}
// restore the original locale
char chLast = '\0';
size_t lastCount = 0;
+
+ const char* formatchars =
+ "dghHmMsSy"
+#ifdef __WXMSW__
+ "t"
+#else
+ "EawD"
+#endif
+ ;
for ( wxString::const_iterator p = fmt.begin(); /* end handled inside */; ++p )
{
if ( p != fmt.end() )
}
const wxUniChar ch = (*p).GetValue();
- if ( ch.IsAscii() && strchr("dghHmMsSy", ch) )
+ if ( ch.IsAscii() && strchr(formatchars, ch) )
{
// these characters come in groups, start counting them
chLast = ch;
// between 1 and 2 digits for days
fmtWX += "%d";
break;
-
+#ifdef __WXMSW__
case 3: // ddd
fmtWX += "%a";
break;
case 4: // dddd
fmtWX += "%A";
break;
-
+#endif
default:
wxFAIL_MSG( "too many 'd's" );
}
break;
+#ifndef __WXMSW__
+ case 'D':
+ switch ( lastCount )
+ {
+ case 1: // D
+ case 2: // DD
+ case 3: // DDD
+ fmtWX += "%j";
+ break;
+
+ default:
+ wxFAIL_MSG( "wrong number of 'D's" );
+ }
+ break;
+ case 'w':
+ switch ( lastCount )
+ {
+ case 1: // w
+ case 2: // ww
+ fmtWX += "%W";
+ break;
+
+ default:
+ wxFAIL_MSG( "wrong number of 'w's" );
+ }
+ break;
+ case 'E':
+ switch ( lastCount )
+ {
+ case 1: // E
+ case 2: // EE
+ case 3: // EEE
+ fmtWX += "%a";
+ break;
+ case 4: // EEEE
+ fmtWX += "%A";
+ break;
+ case 5: // EEEEE
+ fmtWX += "%a";
+ break;
+ default:
+ wxFAIL_MSG( "wrong number of 'E's" );
+ }
+ break;
+#endif
case 'M':
switch ( lastCount )
{
{
case 1: // h
case 2: // hh
- fmtWX += "%h";
+ fmtWX += "%I";
break;
default:
// strftime() doesn't have era string,
// ignore this format
wxASSERT_MSG( lastCount <= 2, "too many 'g's" );
+
+ break;
+#ifndef __WXMSW__
+ case 'a':
+ fmtWX += "%p";
break;
+#endif
+#ifdef __WXMSW__
+ case 't':
+ switch ( lastCount )
+ {
+ case 1: // t
+ case 2: // tt
+ fmtWX += "%p";
+ break;
+ default:
+ wxFAIL_MSG( "too many 't's" );
+ }
+ break;
+#endif
default:
wxFAIL_MSG( "unreachable" );
}
case wxLOCALE_LONG_DATE_FMT:
case wxLOCALE_DATE_TIME_FMT:
case wxLOCALE_TIME_FMT:
- // TODO
- return wxString();
+ {
+ CFDateFormatterStyle dateStyle = kCFDateFormatterNoStyle;
+ CFDateFormatterStyle timeStyle = kCFDateFormatterNoStyle;
+ switch (index )
+ {
+ case wxLOCALE_SHORT_DATE_FMT:
+ dateStyle = kCFDateFormatterShortStyle;
+ break;
+ case wxLOCALE_LONG_DATE_FMT:
+ dateStyle = kCFDateFormatterFullStyle;
+ break;
+ case wxLOCALE_DATE_TIME_FMT:
+ dateStyle = kCFDateFormatterFullStyle;
+ timeStyle = kCFDateFormatterMediumStyle;
+ break;
+ case wxLOCALE_TIME_FMT:
+ timeStyle = kCFDateFormatterMediumStyle;
+ break;
+ default:
+ wxFAIL_MSG( "unexpected time locale" );
+ return wxString();
+ }
+ wxCFRef<CFDateFormatterRef> dateFormatter( CFDateFormatterCreate
+ (NULL, userLocaleRef, dateStyle, timeStyle));
+ wxCFStringRef cfs = wxCFRetain( CFDateFormatterGetFormat(dateFormatter ));
+ wxString format = TranslateFromUnicodeFormat(cfs.AsString());
+ // we always want full years
+ format.Replace("%y","%Y");
+ return format;
+ }
+ break;
default:
wxFAIL_MSG( "Unknown locale info" );