]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/intl.cpp
only use Mac-specific menu item under Mac
[wxWidgets.git] / src / common / intl.cpp
index 506009b981caf401c658de74c4cf4b0dca3f3aab..0960dfc57b9fbfb6007e3964d28522a1c7495455 100644 (file)
@@ -2517,13 +2517,12 @@ bool wxLocale::IsAvailable(int lang)
 #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
@@ -2613,6 +2612,15 @@ static wxString TranslateFromUnicodeFormat(const wxString& fmt)
 
     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() )
@@ -2624,7 +2632,7 @@ static wxString TranslateFromUnicodeFormat(const wxString& fmt)
             }
 
             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;
@@ -2647,7 +2655,7 @@ static wxString TranslateFromUnicodeFormat(const wxString& fmt)
                             // between 1 and 2 digits for days
                             fmtWX += "%d";
                             break;
-
+#ifdef __WXMSW__
                         case 3: // ddd
                             fmtWX += "%a";
                             break;
@@ -2655,12 +2663,57 @@ static wxString TranslateFromUnicodeFormat(const wxString& fmt)
                         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 )
                     {
@@ -2756,8 +2809,27 @@ static wxString TranslateFromUnicodeFormat(const wxString& fmt)
                     // 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" );
             }
@@ -2916,13 +2988,13 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
                 switch (index )
                 {
                     case wxLOCALE_SHORT_DATE_FMT:
-                        dateStyle = kCFDateFormatterMediumStyle;
+                        dateStyle = kCFDateFormatterShortStyle;
                         break;
                     case wxLOCALE_LONG_DATE_FMT:
-                        dateStyle = kCFDateFormatterLongStyle;
+                        dateStyle = kCFDateFormatterFullStyle;
                         break;
                     case wxLOCALE_DATE_TIME_FMT:
-                        dateStyle = kCFDateFormatterMediumStyle;
+                        dateStyle = kCFDateFormatterFullStyle;
                         timeStyle = kCFDateFormatterMediumStyle;
                         break;
                     case wxLOCALE_TIME_FMT:
@@ -2935,7 +3007,10 @@ wxString wxLocale::GetInfo(wxLocaleInfo index, wxLocaleCategory WXUNUSED(cat))
                 wxCFRef<CFDateFormatterRef> dateFormatter( CFDateFormatterCreate
                     (NULL, userLocaleRef, dateStyle, timeStyle));
                 wxCFStringRef cfs = wxCFRetain( CFDateFormatterGetFormat(dateFormatter ));
-                return TranslateFromUnicodeFormat(cfs.AsString());
+                wxString format = TranslateFromUnicodeFormat(cfs.AsString());
+                // we always want full years
+                format.Replace("%y","%Y");
+                return format;
             }
             break;