* Detect the browser language, and use it as the default language selection.
[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         strcpy(selected_locale, "C");
34         num_accept = num_tokens(LocaleString, ',');
35
36         for (i=num_accept-1; i>=0; --i) {
37                 extract_token(lang, LocaleString, i, ',', sizeof lang);
38
39                 /* Strip out the weights; we don't use them.  Also convert
40                  * hyphens to underscores.
41                  */
42                 for (j=0; j<strlen(lang); ++j) {
43                         if (lang[j] == '-') lang[j] = '_';
44                         if (lang[j] == ';') lang[j] = 0;
45                 }
46
47                 for (j=0; j<NUM_LANGS; ++j) {
48                         if (!strcasecmp(lang, AvailLang[j])) {
49                                 strcpy(selected_locale, AvailLang[j]);
50                         }
51                 }
52         }
53
54         lprintf(9, "language found: %s\n", selected_locale);
55         set_selected_language(selected_locale);
56 }
57
58
59 void offer_languages(void) {
60         int i;
61
62         wprintf("<select name=\"language\" size=\"1\">\n");
63
64         for (i=0; i < NUM_LANGS; ++i) {
65                 wprintf("<option %s value=%s>%s</option>\n",
66                         ((WC->selected_language == i) ? "selected" : ""),
67                         AvailLang[i],
68                         AvailLang[i]
69                 );
70         }
71
72         wprintf("</select>\n");
73 }
74
75 /*
76  * Set the selected language for this session.
77  */
78 void set_selected_language(char *lang) {
79         int i;
80
81         for (i=0; i<NUM_LANGS; ++i) {
82                 if (!strcasecmp(lang, AvailLang[i])) {
83                         WC->selected_language = i;
84                 }
85         }
86 }
87
88 /*
89  * Activate and deactivate the selected language for this session.
90  */
91 void go_selected_language(void) {
92         if (WC->selected_language < 0) return;
93         uselocale(wc_locales[WC->selected_language]);   /* switch locales */
94         textdomain(textdomain(NULL));                   /* clear the cache */
95 }
96
97 void stop_selected_language(void) {
98         uselocale(LC_GLOBAL_LOCALE);                    /* switch locales */
99         textdomain(textdomain(NULL));                   /* clear the cache */
100 }
101
102
103 /*
104  * Create a locale_t for each available language
105  */
106 void initialize_locales(void) {
107         int i;
108         locale_t Empty_Locale;
109         char buf[32];
110
111         /* create default locale */
112         Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL);
113
114         for (i = 0; i < NUM_LANGS; ++i) {
115                 sprintf(buf, "%s.UTF8", AvailLang[i]);
116                 wc_locales[i] = newlocale(LC_MESSAGES_MASK /* |LC_TIME_MASK FIXME */ ,
117                         buf,
118                         Empty_Locale
119                 );
120         }
121 }
122
123
124 #else   /* ENABLE_NLS */
125
126 void offer_languages(void) {
127         wprintf("English (US)");
128 }
129
130 void set_selected_language(char *lang) {
131 }
132
133 void go_selected_language(void) {
134 }
135
136 void stop_selected_language(void) {
137 }
138
139 #endif  /* ENABLE_NLS */