Subject: bug#39248: format-time-string ignores user's preferred locale

From: Paul Eggert <[email-masked]>
Date: Thu, 23 Jan 2020 23:35:20 -0800

On 1/23/20 7:17 PM, Paul W. Rankin wrote:
> The relationship doesn't appear as the same as on GNU/Linux.

It's similar, in that one can launch apps in various ways (e.g., via Gnome) 
without involving shell environment variables.

Looking into this a bit more, I see that Alan Third wrote a fix for this problem 
(which is apparently quite a zoo in macOS, as Apple keeps changing how to set 
environment variables!) into Emacs in master commit 
2016-02-11T02:26:[email-masked]. However, Emacs currently sets the LANG 
environment variable in ns_init_locale *after* Emacs uses LANG to set the 
LC_TIME locale, which is not what is wanted here. So, please try the attached 
patch to master. You'll need to grab the latest master as I recently installed a 
locale cleanup patch while looking into this mess.

If this patch doesn't work for you, perhaps you can write a small variant of it 
that does work.
>From 82821adea730dab5a42d24e49675ade1c2f5c1f3 Mon Sep 17 00:00:00 2001
From: Paul Eggert <[email-masked]>
Date: Thu, 23 Jan 2020 23:16:47 -0800
Subject: [PATCH] Propagate NSLocale into Emacs better

* src/emacs.c (main): Call ns_init_locale before using the
environment variable that ns_init_locale sets up (Bug#39248).
---
 src/emacs.c | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/src/emacs.c b/src/emacs.c
index 4b5d00a0e8..c170333e60 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -1242,6 +1242,9 @@ main (int argc, char **argv)
   char *lc_all = getenv ("LC_ALL");
   if (! (lc_all && strcmp (lc_all, "C") == 0))
     {
+      #ifdef HAVE_NS
+        ns_init_locale ();
+      #endif
       setlocale (LC_ALL, "");
       fixup_locale ();
     }
@@ -1610,10 +1613,6 @@ main (int argc, char **argv)
 
 #ifdef HAVE_NS
   ns_pool = ns_alloc_autorelease_pool ();
-#ifdef NS_IMPL_GNUSTEP
-  /* GNUstep stupidly resets our locale settings after we made them.  */
-  fixup_locale ();
-#endif
 
   if (!noninteractive)
     {
@@ -1724,11 +1723,6 @@ main (int argc, char **argv)
   globals_of_gfilenotify ();
 #endif
 
-#ifdef HAVE_NS
-  /* Initialize the locale from user defaults.  */
-  ns_init_locale ();
-#endif
-
   /* Initialize and GC-protect Vinitial_environment and
      Vprocess_environment before set_initial_environment fills them
      in.  */
-- 
2.24.1