Kevin,

I have a patch that I believe does what's needed.  It passed all my
testing, including running with my default config, setting locale,
unsetting locale, adding or removing a ! to the date format in
index_format.

Note that:

 - The default locale is now "" allowing it to be set from OS settings
 - I removed setlocale() calls from some places it seemed superfluous
 - Wherever the "!" is relevant, I set locale to C immediately before,
   and reset it to Locale immediately after.
 - I ADDED a call to setlocale() before the index is redrawn
 - I suggested in the manual to not set locale. :)

The last I did so that if the user changes locale in the running mutt,
the index will be redrawn and "notice" the change.

Patch attached.

-- 
Derek D. Martin    http://www.pizzashack.org/   GPG Key ID: 0xDFBEAD02
-=-=-=-=-
This message is posted from an invalid address.  Replying to it will result in
undeliverable mail due to spam prevention.  Sorry for the inconvenience.

diff -ur mutt-1.7.0/browser.c mutt-1.7.0.locale_patch/browser.c
--- mutt-1.7.0/browser.c        2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/browser.c   2016-08-19 15:37:37.136603655 -0400
@@ -176,12 +176,16 @@
          tnow = time (NULL);
          t_fmt = tnow - folder->ff->mtime < 31536000 ? "%b %d %H:%M" : "%b %d  
%Y";
        }
-       if (do_locales)
-         setlocale(LC_TIME, NONULL (Locale)); /* use environment if $locale is 
not set */
-       else
-         setlocale(LC_TIME, "C");
+        /* if user doesn't want locales on dates, temporarily disable */
+       if (!do_locales) 
+            setlocale(LC_TIME, "C");
+
        strftime (date, sizeof (date), t_fmt, localtime (&folder->ff->mtime));
 
+        /* Reset locale to whatever user configured, via $locale or the OS */
+       if (!do_locales)
+            setlocale(LC_TIME, NONULL(Locale));
+
        mutt_format_s (dest, destlen, fmt, date);
       }
       else
diff -ur mutt-1.7.0/crypt-gpgme.c mutt-1.7.0.locale_patch/crypt-gpgme.c
--- mutt-1.7.0/crypt-gpgme.c    2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/crypt-gpgme.c       2016-08-19 16:00:42.971473117 
-0400
@@ -869,13 +869,11 @@
 {
   char p[STRING];
 
-  setlocale (LC_TIME, "");
 #ifdef HAVE_LANGINFO_D_T_FMT
   strftime (p, sizeof (p), nl_langinfo (D_T_FMT), localtime (&t));
 #else
   strftime (p, sizeof (p), "%c", localtime (&t));
 #endif
-  setlocale (LC_TIME, "C");
   state_attach_puts (p, s);
 }
 
@@ -2815,9 +2813,6 @@
        }
        *p = 0;
 
-       if (do_locales && Locale)
-         setlocale (LC_TIME, Locale);
-        
         {
          time_t tt = 0;
 
@@ -2826,10 +2821,13 @@
 
           tm = localtime (&tt);
         }
+        if (!do_locales)
+         setlocale (LC_TIME, "C");
+
        strftime (buf2, sizeof (buf2), dest, tm);
 
-       if (do_locales)
-         setlocale (LC_TIME, "C");
+       if (!do_locales)
+         setlocale (LC_TIME, NONULL(Locale));
         
        snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
        snprintf (dest, destlen, fmt, buf2);
@@ -3371,9 +3369,6 @@
   int i;
   gpgme_user_id_t uid = NULL;
 
-  if (Locale)
-    setlocale (LC_TIME, Locale);
-
   is_pgp = key->protocol == GPGME_PROTOCOL_OpenPGP;
 
   for (idx = 0, uid = key->uids; uid; idx++, uid = uid->next)
@@ -3613,9 +3608,6 @@
           putc ('\n', fp);
         }
     }
-
-  if (Locale)
-    setlocale (LC_TIME, "C");
 }
 
 
diff -ur mutt-1.7.0/crypt.c mutt-1.7.0.locale_patch/crypt.c
--- mutt-1.7.0/crypt.c  2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/crypt.c     2016-08-19 16:02:45.171730698 -0400
@@ -64,9 +64,7 @@
   if (option (OPTCRYPTTIMESTAMP))
   {
     t = time(NULL);
-    setlocale (LC_TIME, "");
     strftime (p, sizeof (p), _(" (current time: %c)"), localtime (&t));
-    setlocale (LC_TIME, "C");
   }
   else
     *p = '\0';
diff -ur mutt-1.7.0/hdrline.c mutt-1.7.0.locale_patch/hdrline.c
--- mutt-1.7.0/hdrline.c        2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/hdrline.c   2016-08-19 16:03:34.923835398 -0400
@@ -383,9 +383,6 @@
        }
        *p = 0;
 
-       if (do_locales && Locale)
-         setlocale (LC_TIME, Locale);
-
        if (op == '[' || op == 'D')
          tm = localtime (&hdr->date_sent);
        else if (op == '(')
@@ -406,10 +403,13 @@
          tm = gmtime (&T);
        }
 
+        if (!do_locales)
+         setlocale (LC_TIME, "C");
+
        strftime (buf2, sizeof (buf2), dest, tm);
 
-       if (do_locales)
-         setlocale (LC_TIME, "C");
+       if (!do_locales)
+         setlocale (LC_TIME, Locale);
 
        mutt_format_s (dest, destlen, prefix, buf2);
        if (len > 0 && op != 'd' && op != 'D') /* Skip ending op */
diff -ur mutt-1.7.0/init.h mutt-1.7.0.locale_patch/init.h
--- mutt-1.7.0/init.h   2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/init.h      2016-08-19 16:11:20.928811531 -0400
@@ -1395,11 +1395,13 @@
   ** from your spool mailbox to your $$mbox mailbox, or as a result of
   ** a ``$mbox-hook'' command.
   */
-  { "locale",          DT_STR,  R_BOTH, UL &Locale, UL "C" },
+  { "locale",          DT_STR,  R_BOTH, UL &Locale, UL "" },
   /*
   ** .pp
   ** The locale used by \fCstrftime(3)\fP to format dates. Legal values are
-  ** the strings your system accepts for the locale environment variable 
\fC$$$LC_TIME\fP.
+  ** the strings your system accepts for the locale environment variable 
\fC$$$LC_TIME\fP.  
+  ** In general, avoid setting this; just set LC_TIME directly in your 
+  ** environment instead.
   */
   { "mail_check",      DT_NUM,  R_NONE, UL &BuffyTimeout, 5 },
   /*
diff -ur mutt-1.7.0/main.c mutt-1.7.0.locale_patch/main.c
--- mutt-1.7.0/main.c   2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/main.c      2016-08-19 15:12:53.133585104 -0400
@@ -597,15 +597,14 @@
     exit(1);
   }
 
+  setlocale (LC_ALL, "");
+
 #ifdef ENABLE_NLS
   /* FIXME what about init.c:1439 ? */
-  setlocale (LC_ALL, "");
   bindtextdomain (PACKAGE, MUTTLOCALEDIR);
   textdomain (PACKAGE);
 #endif
 
-  setlocale (LC_CTYPE, "");
-
   mutt_error = mutt_nocurses_error;
   mutt_message = mutt_nocurses_error;
   SRAND (time (NULL));
diff -ur mutt-1.7.0/pgpkey.c mutt-1.7.0.locale_patch/pgpkey.c
--- mutt-1.7.0/pgpkey.c 2016-08-10 21:47:00.000000000 -0400
+++ mutt-1.7.0.locale_patch/pgpkey.c    2016-08-19 16:04:29.731950626 -0400
@@ -195,15 +195,16 @@
        }
        *p = 0;
 
-       if (do_locales && Locale)
-         setlocale (LC_TIME, Locale);
 
        tm = localtime (&key->gen_time);
 
+       if (!do_locales)
+         setlocale (LC_TIME, "C");
+
        strftime (buf2, sizeof (buf2), dest, tm);
 
-       if (do_locales)
-         setlocale (LC_TIME, "C");
+       if (!do_locales)
+         setlocale (LC_TIME, NONULL(Locale));
 
        snprintf (fmt, sizeof (fmt), "%%%ss", prefix);
        snprintf (dest, destlen, fmt, buf2);

Attachment: pgp7vLAhitiST.pgp
Description: PGP signature

Reply via email to