wmitime: Improve locale support.

Previously, wmitime only had support for English, French, and (in Debian
only) Hungarian.  In addition, the choice was made at compile time.

This patch adds run-time support for any language using the Latin alphabet.
The locale is determined by the user's environment or may be specified on
the command line with the "-l" option.  Note that users whose environment
specifies a non-Latin locale may wish to use, e.g., "-l C", as otherwise
no date will appear.

Note that, for simplicity, the month and day are now displayed as "01 JAN"
as opposed to "JAN 01".  (Previously, the former format was used for English
and the latter for French.)
This commit is contained in:
Doug Torrance 2014-12-20 01:57:04 -06:00 committed by Carlos R. Mafra
parent 0fbe3d839a
commit cc801880a5
4 changed files with 42 additions and 91 deletions

View file

@ -1,4 +1,3 @@
#LANG = fr
LIBS = -lXpm -lXext -lX11 -lm LIBS = -lXpm -lXext -lX11 -lm
CFLAGS = -O2 -Wall CFLAGS = -O2 -Wall
OBJS = wmitime.o \ OBJS = wmitime.o \
@ -10,7 +9,7 @@ PREFIX = /usr/local
BINDIR = $(PREFIX)/bin BINDIR = $(PREFIX)/bin
.c.o: .c.o:
$(CC) $(CPPFLAGS) $(CFLAGS) -D$(LANG) -c $< -o $*.o $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $*.o
wmitime: $(OBJS) wmitime: $(OBJS)
$(CC) $(LDFLAGS) -o wmitime $^ $(LIBS) $(CC) $(LDFLAGS) -o wmitime $^ $(LIBS)

View file

@ -1,30 +0,0 @@
// french.h
// Created by Pierre-Marie.Allemand@capway.com
// 08-jan-1999
static char daynames[7][3] =
{
{"Di"},
{"Lu"},
{"Ma"},
{"Me"},
{"Je"},
{"Ve"},
{"Sa"}
};
static char monthnames[12][4] =
{
{"Jan"},
{"Fev"},
{"Mar"},
{"Avr"},
{"Mai"},
{"Jun"},
{"Jui"},
{"Aou"},
{"Sep"},
{"Oct"},
{"Nov"},
{"Dec"}
};

View file

@ -1,35 +0,0 @@
// language.h
static char daynames[7][3] =
{
{"Su"},
{"Mo"},
{"Tu"},
{"We"},
{"Th"},
{"Fr"},
{"Sa"}
};
static char monthnames[12][4] =
{
{"Jan"},
{"Feb"},
{"Mar"},
{"Apr"},
{"May"},
{"Jun"},
{"Jul"},
{"Aug"},
{"Sep"},
{"Oct"},
{"Nov"},
{"Dec"}
};

View file

@ -16,6 +16,9 @@
#include <unistd.h> #include <unistd.h>
#include <ctype.h> #include <ctype.h>
#include <math.h> #include <math.h>
#include <locale.h>
#include <langinfo.h>
#include <iconv.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -31,16 +34,6 @@
#include "wmgeneral/wmgeneral.h" #include "wmgeneral/wmgeneral.h"
#include "wmgeneral/misc.h" #include "wmgeneral/misc.h"
#ifdef fr_FR
#define fr
#endif
#ifdef fr
#include "french.h"
#else
#include "language.h"
#endif
#include "wmitime-master.xpm" #include "wmitime-master.xpm"
char wmitime_mask_bits[64*64]; char wmitime_mask_bits[64*64];
int wmitime_mask_width = 64; int wmitime_mask_width = 64;
@ -61,6 +54,7 @@ extern char **environ;
char *ProgName; char *ProgName;
char uconfig_file[256]; char uconfig_file[256];
char locale[256];
time_t curtime; time_t curtime;
time_t prevtime; time_t prevtime;
@ -95,6 +89,7 @@ int main(int argc, char *argv[]) {
int i; int i;
uconfig_file[0] = 0; uconfig_file[0] = 0;
locale[0] = 0;
/* Parse Command Line */ /* Parse Command Line */
@ -137,6 +132,13 @@ int main(int argc, char *argv[]) {
TwelveHour = 1; TwelveHour = 1;
} }
break; break;
case 'l' :
if (argc > (i+1))
{
strcpy(locale, argv[i+1]);
i++;
}
break;
default: default:
usage(); usage();
exit(0); exit(0);
@ -145,6 +147,11 @@ int main(int argc, char *argv[]) {
} }
} }
if (setlocale(LC_ALL, locale) == NULL)
fprintf(stderr,
"warning: locale '%s' not recognized; defaulting to '%s'.",
locale, setlocale(LC_ALL, NULL));
wmitime_routine(argc, argv); wmitime_routine(argc, argv);
return 0; return 0;
@ -365,28 +372,37 @@ void DrawStdTime(void)
void DrawDate(void) void DrawDate(void)
{ {
char BlitStr[20]; char OrigBlitStr[20], BlitStr[20];
char *inbuf, *outbuf;
size_t inbytesleft, outbytesleft;
iconv_t cd;
sprintf(BlitStr, "%s", daynames[clk->tm_wday]); cd = iconv_open("ASCII//TRANSLIT", nl_langinfo(CODESET));
inbuf = OrigBlitStr;
outbuf = BlitStr;
inbytesleft = sizeof OrigBlitStr;
outbytesleft = sizeof BlitStr;
sprintf(OrigBlitStr, "%s", nl_langinfo(ABDAY_1 + clk->tm_wday));
iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
BlitStr[2] = 0;
BlitString( BlitStr, 6, 50); BlitString( BlitStr, 6, 50);
#ifdef fr inbuf = OrigBlitStr;
outbuf = BlitStr;
inbytesleft = sizeof OrigBlitStr;
outbytesleft = sizeof BlitStr;
// French date model sprintf(OrigBlitStr, "%s", nl_langinfo(ABMON_1 + clk->tm_mon));
sprintf(BlitStr, "%s", monthnames[clk->tm_mon]); iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
BlitStr[3] = 0;
BlitString( BlitStr, 40, 50); BlitString( BlitStr, 40, 50);
sprintf(BlitStr, "%02i", clk->tm_mday); iconv_close(cd);
BlitString( BlitStr, 25, 50);
#else
sprintf(BlitStr, "%s", monthnames[clk->tm_mon]);
BlitString( BlitStr, 25, 50);
sprintf(BlitStr, "%02i", clk->tm_mday); sprintf(BlitStr, "%02i", clk->tm_mday);
BlitString( BlitStr, 45, 50); BlitString( BlitStr, 25, 50);
#endif
} }
void DrawInetWheel(void) void DrawInetWheel(void)
@ -706,6 +722,7 @@ void usage(void)
fprintf(stderr, " -display <display name>\n"); fprintf(stderr, " -display <display name>\n");
fprintf(stderr, " -geometry +XPOS+YPOS initial window position\n"); fprintf(stderr, " -geometry +XPOS+YPOS initial window position\n");
// fprintf(stderr, " -c <filename> use specified config file\n"); // fprintf(stderr, " -c <filename> use specified config file\n");
fprintf(stderr, " -l <locale> specify locale\n");
fprintf(stderr, " -h this help screen\n"); fprintf(stderr, " -h this help screen\n");
fprintf(stderr, " -v print the version number\n"); fprintf(stderr, " -v print the version number\n");
fprintf(stderr, "\n"); fprintf(stderr, "\n");