bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

nl_langinfo and localized day/month names


From: Eli Zaretskii
Subject: nl_langinfo and localized day/month names
Date: Tue, 10 Jun 2014 21:08:08 +0300

Currently, gnulib's nl_langinfo provides on C-locale names for week
days and months, thus any program that uses it can only speak English
in these contexts.

How about the following patch, which uses strftime to produce
localized names for these?

--- lib/nl_langinfo.c~0 2014-02-15 01:00:33 +0200
+++ lib/nl_langinfo.c   2014-06-10 19:23:54 +0300
@@ -129,10 +129,19 @@ rpl_nl_langinfo (nl_item item)
 # endif
 
 # include <locale.h>
+# include <time.h>
 
 char *
 nl_langinfo (nl_item item)
 {
+  static struct tm known_tm = {
+    0, 0, 0,   /* 00:00:00 */
+    5, 0, 114, /* Sunday January 5, 2014 */
+    0, 4, -1
+  };
+  struct tm tmm;
+  static char tbuf[100];
+
   switch (item)
     {
     /* nl_langinfo items of the LC_CTYPE category */
@@ -170,85 +179,253 @@ nl_langinfo (nl_item item)
     case T_FMT_AMPM:
       return "%I:%M:%S %p";
     case AM_STR:
-      return "AM";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_hour = 10;
+      if (!strftime (tbuf, sizeof(tbuf), "%p", &tmm))
+       return "AM";
+      return tbuf;
     case PM_STR:
-      return "PM";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_hour = 22;
+      if (!strftime (tbuf, sizeof(tbuf), "%p", &tmm))
+       return "PM";
+      return tbuf;
     case DAY_1:
-      return "Sunday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Sunday";
+      return tbuf;
     case DAY_2:
-      return "Monday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 1;
+      tmm.tm_wday += 1;
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Monday";
+      return tbuf;
     case DAY_3:
-      return "Tuesday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 2;
+      tmm.tm_wday += 2;
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Tuesday";
+      return tbuf;
     case DAY_4:
-      return "Wednesday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 3;
+      tmm.tm_wday += 3;
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Wednesday";
+      return tbuf;
     case DAY_5:
-      return "Thursday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 4;
+      tmm.tm_wday += 4;
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Thursday";
+      return tbuf;
     case DAY_6:
-      return "Friday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 5;
+      tmm.tm_wday += 5;
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Friday";
+      return tbuf;
     case DAY_7:
-      return "Saturday";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 6;
+      tmm.tm_wday += 6;
+      if (!strftime (tbuf, sizeof(tbuf), "%A", &tmm))
+       return "Saturday";
+      return tbuf;
     case ABDAY_1:
-      return "Sun";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Sun";
+      return tbuf;
     case ABDAY_2:
-      return "Mon";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 1;
+      tmm.tm_wday += 1;
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Mon";
+      return tbuf;
     case ABDAY_3:
-      return "Tue";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 2;
+      tmm.tm_wday += 2;
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Tue";
+      return tbuf;
     case ABDAY_4:
-      return "Wed";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 3;
+      tmm.tm_wday += 3;
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Wed";
+      return tbuf;
     case ABDAY_5:
-      return "Thu";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 4;
+      tmm.tm_wday += 4;
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Thu";
+      return tbuf;
     case ABDAY_6:
-      return "Fri";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 5;
+      tmm.tm_wday += 5;
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Fri";
+      return tbuf;
     case ABDAY_7:
-      return "Sat";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mday += 6;
+      tmm.tm_wday += 6;
+      if (!strftime (tbuf, sizeof(tbuf), "%a", &tmm))
+       return "Sat";
+      return tbuf;
     case MON_1:
-      return "January";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "January";
+      return tbuf;
     case MON_2:
-      return "February";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 1;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "February";
+      return tbuf;
     case MON_3:
-      return "March";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 2;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "March";
+      return tbuf;
     case MON_4:
-      return "April";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 3;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "April";
+      return tbuf;
     case MON_5:
-      return "May";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 4;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "May";
+      return tbuf;
     case MON_6:
-      return "June";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 5;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "June";
+      return tbuf;
     case MON_7:
-      return "July";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 6;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "July";
+      return tbuf;
     case MON_8:
-      return "August";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 7;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "August";
+      return tbuf;
     case MON_9:
-      return "September";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 8;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "September";
+      return tbuf;
     case MON_10:
-      return "October";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 9;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "October";
+      return tbuf;
     case MON_11:
-      return "November";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 10;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "November";
+      return tbuf;
     case MON_12:
-      return "December";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 11;
+      if (!strftime (tbuf, sizeof(tbuf), "%B", &tmm))
+       return "December";
+      return tbuf;
     case ABMON_1:
-      return "Jan";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Jan";
+      return tbuf;
     case ABMON_2:
-      return "Feb";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 1;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Feb";
+      return tbuf;
     case ABMON_3:
-      return "Mar";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 2;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Mar";
+      return tbuf;
     case ABMON_4:
-      return "Apr";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 3;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Apr";
+      return tbuf;
     case ABMON_5:
-      return "May";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 4;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "May";
+      return tbuf;
     case ABMON_6:
-      return "Jun";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 5;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Jun";
+      return tbuf;
     case ABMON_7:
-      return "Jul";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 6;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Jul";
+      return tbuf;
     case ABMON_8:
-      return "Aug";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 7;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Aug";
+      return tbuf;
     case ABMON_9:
-      return "Sep";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 8;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Sep";
+      return tbuf;
     case ABMON_10:
-      return "Oct";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 9;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Oct";
+      return tbuf;
     case ABMON_11:
-      return "Nov";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 10;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Nov";
+      return tbuf;
     case ABMON_12:
-      return "Dec";
+      memcpy (&tmm, &known_tm, sizeof (known_tm));
+      tmm.tm_mon += 11;
+      if (!strftime (tbuf, sizeof(tbuf), "%b", &tmm))
+       return "Dec";
+      return tbuf;
     case ERA:
       return "";
     case ALT_DIGITS:





reply via email to

[Prev in Thread] Current Thread [Next in Thread]