From 527dc867225ae815356d2d1a72213abe981bd067 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 21 Aug 2011 23:48:07 -0400 Subject: [PATCH] GDateTime: use nl_langinfo() when available This makes g_date_time_format() react to LC_TIME, which is what people expect. Translators: this change means that the GDateTime strings are only used when the C library does not already provide suitable translated strings for these (month names, etc). --- configure.ac | 17 +++++++++++++++++ glib/gdatetime.c | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 2158831..5ef55ce 100644 --- a/configure.ac +++ b/configure.ac @@ -1309,6 +1309,23 @@ if test x$glib_cv_langinfo_codeset = xyes; then AC_DEFINE(HAVE_CODESET,1,[Have nl_langinfo (CODESET)]) fi +dnl Check for nl_langinfo and LC_TIME parts that are needed in gdatetime.c +AC_CACHE_CHECK([for nl_langinfo (PM_STR)],glib_cv_langinfo_time,[ + AC_TRY_COMPILE([#include ], + [char *str; + str = nl_langinfo (PM_STR); + str = nl_langinfo (D_FMT); + str = nl_langinfo (T_FMT); + str = nl_langinfo (MON_1); + str = nl_langinfo (ABMON_12); + str = nl_langinfo (DAY_1); + str = nl_langinfo (ABDAY_7);], + [glib_cv_langinfo_time=yes], + [glib_cv_langinfo_time=no])]) +if test x$glib_cv_langinfo_time = xyes; then + AC_DEFINE(HAVE_LANGINFO_TIME,1,[Have nl_langinfo (PM_STR)]) +fi + dnl **************************************** dnl *** posix_memalign *** dnl **************************************** diff --git a/glib/gdatetime.c b/glib/gdatetime.c index aa55ede..e92c68c 100644 --- a/glib/gdatetime.c +++ b/glib/gdatetime.c @@ -163,6 +163,34 @@ static const guint16 days_in_year[2][13] = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 } }; +#ifdef HAVE_LANGINFO_TIME + +#define GET_AMPM(d) ((g_date_time_get_hour (d) < 12) ? \ + nl_langinfo (AM_STR) : \ + nl_langinfo (PM_STR)) + +#define PREFERRED_DATE_FMT nl_langinfo (D_FMT) +#define PREFERRED_TIME_FMT nl_langinfo (T_FMT) + +static const gint weekday_item[2][7] = +{ + { ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, ABDAY_7, ABDAY_1 }, + { DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7, DAY_1 } +}; + +static const gint month_item[2][12] = +{ + { ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6, ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12 }, + { MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8, MON_9, MON_10, MON_11, MON_12 }, +}; + +#define WEEKDAY_ABBR(d) nl_langinfo (weekday_item[0][g_date_time_get_day_of_week (d) - 1]) +#define WEEKDAY_FULL(d) nl_langinfo (weekday_item[1][g_date_time_get_day_of_week (d) - 1]) +#define MONTH_ABBR(d) nl_langinfo (month_item[0][g_date_time_get_month (d) - 1]) +#define MONTH_FULL(d) nl_langinfo (month_item[1][g_date_time_get_month (d) - 1]) + +#else + #define GET_AMPM(d) ((g_date_time_get_hour (d) < 12) \ /* Translators: 'before midday' indicator */ \ ? C_("GDateTime", "am") \ @@ -175,11 +203,11 @@ static const guint16 days_in_year[2][13] = /* Translators: this is the preferred format for expressing the time */ #define PREFERRED_TIME_FMT C_("GDateTime", "%H:%M:%S") -#define WEEKDAY_ABBR(d) (get_weekday_name_abbr (g_date_time_get_day_of_week (datetime))) -#define WEEKDAY_FULL(d) (get_weekday_name (g_date_time_get_day_of_week (datetime))) -#define MONTH_ABBR(d) (get_month_name_abbr (g_date_time_get_month (datetime))) -#define MONTH_FULL(d) (get_month_name (g_date_time_get_month (datetime))) +#define WEEKDAY_ABBR(d) (get_weekday_name_abbr (g_date_time_get_day_of_week (d))) +#define WEEKDAY_FULL(d) (get_weekday_name (g_date_time_get_day_of_week (d))) +#define MONTH_ABBR(d) (get_month_name_abbr (g_date_time_get_month (d))) +#define MONTH_FULL(d) (get_month_name (g_date_time_get_month (d))) static const gchar * get_month_name (gint month) @@ -309,6 +337,8 @@ get_weekday_name_abbr (gint day) return NULL; } +#endif /* HAVE_LANGINFO_TIME */ + static inline gint ymd_to_days (gint year, gint month, -- 2.7.4