* Slightly more intelligent language detection.
[citadel.git] / webcit / gettext.c
1 #define _GNU_SOURCE
2 #include "webcit.h"
3 #include "webserver.h"
4
5 #ifdef ENABLE_NLS
6
7 #define NUM_LANGS 3
8 char *AvailLang[NUM_LANGS] = {
9         "en_US",
10         "de_DE",
11         "it_IT"
12 };
13
14 locale_t wc_locales[NUM_LANGS];
15
16 typedef struct _lang_pref{
17         char lang[16];
18         char region[16];
19         char *match;
20         double Priority;
21 } LangStruct;
22
23 /* TODO: we skip the language weightening so far. */
24 /* Accept-Language: 'de-de,en-us;q=0.7,en;q=0.3' */
25 /* Accept-Language: de,en-ph;q=0.8,en-us;q=0.5,de-at;q=0.3 */
26 void httplang_to_locale(char *LocaleString)
27 {
28         char selected_locale[16];
29         int i, j;
30         char lang[64];
31         int num_accept = 0;
32
33         lprintf(9, "languageAccept: %s\n", LocaleString);
34
35         strcpy(selected_locale, "C");
36         num_accept = num_tokens(LocaleString, ',');
37
38         for (i=num_accept-1; i>=0; --i) {
39                 extract_token(lang, LocaleString, i, ',', sizeof lang);
40
41                 /* Strip out the weights; we don't use them.  Also convert
42                  * hyphens to underscores.
43                  */
44                 for (j=0; j<strlen(lang); ++j) {
45                         if (lang[j] == '-') lang[j] = '_';
46                         if (lang[j] == ';') lang[j] = 0;
47                 }
48
49                 for (j=0; j<NUM_LANGS; ++j) {
50                         if (!strncasecmp(lang, AvailLang[j], strlen(lang))) {
51                                 strcpy(selected_locale, AvailLang[j]);
52                         }
53                 }
54         }
55
56         lprintf(9, "language found: %s\n", selected_locale);
57         set_selected_language(selected_locale);
58 }
59
60
61 void offer_languages(void) {
62         int i;
63
64         wprintf("<select name=\"language\" size=\"1\">\n");
65
66         for (i=0; i < NUM_LANGS; ++i) {
67                 wprintf("<option %s value=%s>%s</option>\n",
68                         ((WC->selected_language == i) ? "selected" : ""),
69                         AvailLang[i],
70                         AvailLang[i]
71                 );
72         }
73
74         wprintf("</select>\n");
75 }
76
77 /*
78  * Set the selected language for this session.
79  */
80 void set_selected_language(char *lang) {
81         int i;
82
83         for (i=0; i<NUM_LANGS; ++i) {
84                 if (!strcasecmp(lang, AvailLang[i])) {
85                         WC->selected_language = i;
86                 }
87         }
88 }
89
90 /*
91  * Activate and deactivate the selected language for this session.
92  */
93 void go_selected_language(void) {
94         if (WC->selected_language < 0) return;
95         uselocale(wc_locales[WC->selected_language]);   /* switch locales */
96         textdomain(textdomain(NULL));                   /* clear the cache */
97 }
98
99 void stop_selected_language(void) {
100         uselocale(LC_GLOBAL_LOCALE);                    /* switch locales */
101         textdomain(textdomain(NULL));                   /* clear the cache */
102 }
103
104
105 /*
106  * Create a locale_t for each available language
107  */
108 void initialize_locales(void) {
109         int i;
110         locale_t Empty_Locale;
111         char buf[32];
112
113         /* create default locale */
114         Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL);
115
116         for (i = 0; i < NUM_LANGS; ++i) {
117                 sprintf(buf, "%s.UTF8", AvailLang[i]);
118                 wc_locales[i] = newlocale(LC_MESSAGES_MASK /* |LC_TIME_MASK FIXME */ ,
119                         buf,
120                         Empty_Locale
121                 );
122         }
123 }
124
125
126 #else   /* ENABLE_NLS */
127
128 void offer_languages(void) {
129         wprintf("English (US)");
130 }
131
132 void set_selected_language(char *lang) {
133 }
134
135 void go_selected_language(void) {
136 }
137
138 void stop_selected_language(void) {
139 }
140
141 #endif  /* ENABLE_NLS */