From 3dd2aaba8cf0ace3925a11aea4026313ecabdd17 Mon Sep 17 00:00:00 2001 From: Gabriele Barbero Date: Mon, 23 Jun 2025 18:49:25 +0200 Subject: [PATCH 1/2] dialogs: respect time/date system format on macOS When the time or date format is changed from macOS system settings, these changes do not affect the locale but the user preferences. This commit ensures that the date and time are retrieved directly from those settings, respecting the selected format. --- app/dialogs/about-dialog.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/app/dialogs/about-dialog.c b/app/dialogs/about-dialog.c index 612e689b28..da6215e1b1 100644 --- a/app/dialogs/about-dialog.c +++ b/app/dialogs/about-dialog.c @@ -22,6 +22,10 @@ #include #include +#ifdef PLATFORM_OSX +#include +#endif /* PLATFORM_OSX */ + #include "libgimpbase/gimpbase.h" #include "libgimpmath/gimpmath.h" #include "libgimpwidgets/gimpwidgets.h" @@ -508,9 +512,39 @@ about_dialog_add_update (GimpAboutDialog *dialog, gchar *time; datetime = g_date_time_new_from_unix_local (config->check_update_timestamp); +#if defined(PLATFORM_OSX) + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + NSDate *current_date = [NSDate date]; + NSString *formatted_date; + NSString *formatted_time; + + formatter.locale = [NSLocale currentLocale]; + + formatter.dateStyle = NSDateFormatterShortStyle; + formatter.timeStyle = NSDateFormatterNoStyle; + formatted_date = [formatter stringFromDate:current_date]; + + formatter.dateStyle = NSDateFormatterNoStyle; + formatter.timeStyle = NSDateFormatterMediumStyle; + formatted_time = [formatter stringFromDate:current_date]; + + if (formatted_date) + date = g_strdup ([formatted_date UTF8String]); + else + date = g_date_time_format (datetime, "%x"); + + if (formatted_time) + time = g_strdup ([formatted_time UTF8String]); + else + time = g_date_time_format (datetime, "%X"); + + [formatter release]; + [pool drain]; +#else date = g_date_time_format (datetime, "%x"); time = g_date_time_format (datetime, "%X"); - +#endif if (config->last_known_release != NULL) /* Translators: first string is the date in the locale's date * representation (e.g., 12/31/99), second is the time in the From 5b251ccf0e97e9aa8fd626573a0014eee727bdf6 Mon Sep 17 00:00:00 2001 From: Gabriele Barbero Date: Thu, 26 Jun 2025 00:24:14 +0200 Subject: [PATCH 2/2] dialogs: respect time/date system format on Windows Fetch date and time via GetDateFormatEx/GetTimeFormatEx to respect the user's custom formats from Windows Region settings instead of falling back to C locale defaults. --- app/dialogs/about-dialog.c | 48 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/app/dialogs/about-dialog.c b/app/dialogs/about-dialog.c index da6215e1b1..89868c7223 100644 --- a/app/dialogs/about-dialog.c +++ b/app/dialogs/about-dialog.c @@ -25,6 +25,10 @@ #ifdef PLATFORM_OSX #include #endif /* PLATFORM_OSX */ +#ifdef G_OS_WIN32 +#include +#include +#endif /* G_OS_WIN32 */ #include "libgimpbase/gimpbase.h" #include "libgimpmath/gimpmath.h" @@ -541,6 +545,50 @@ about_dialog_add_update (GimpAboutDialog *dialog, [formatter release]; [pool drain]; +#elif defined(G_OS_WIN32) + SYSTEMTIME st; + int date_len, time_len; + wchar_t *date_buf = NULL + wchar_t *time_buf = NULL; + + GetLocalTime (&st); + + date_len = GetDateFormatEx (LOCALE_NAME_USER_DEFAULT, 0, &st, + NULL, NULL, 0, NULL); + if (date_len > 0) + { + date_buf = g_malloc (date_len * sizeof (wchar_t)); + if (! GetDateFormatEx(LOCALE_NAME_USER_DEFAULT, 0, &st, NULL, date_buf, date_len, NULL)) + { + g_free (date_buf); + date_buf = NULL; + } + } + + time_len = GetTimeFormatEx (LOCALE_NAME_USER_DEFAULT, 0, &st, + NULL, NULL, 0); + if (time_len > 0) + { + time_buf = g_malloc (time_len * sizeof (wchar_t)); + if (! GetTimeFormatEx (LOCALE_NAME_USER_DEFAULT, 0, &st, NULL, time_buf, time_len)) + { + g_free (time_buf); + time_buf = NULL; + } + } + + if (date_buf) + date = g_utf16_to_utf8 ((gunichar2*) date_buf, -1, NULL, NULL, NULL); + else + date = g_date_time_format (datetime, "%x"); + + if (time_buf) + time = g_utf16_to_utf8 ((gunichar2*) time_buf, -1, NULL, NULL, NULL); + else + time = g_date_time_format (datetime, "%X"); + + g_free (date_buf); + g_free (time_buf); #else date = g_date_time_format (datetime, "%x"); time = g_date_time_format (datetime, "%X");