8 static const char *AvailLang[NUM_LANGS] = {
14 locale_t wc_locales[NUM_LANGS];
16 typedef struct _lang_pref{
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(const char *LocaleString)
29 LangStruct wanted_locales[20];
32 size_t len = strlen(LocaleString);
35 const int nAvail = 1; /* Number of members in AvailLang */
36 char *search = (char *) malloc(len);
37 // locale_t my_Locale;
38 // locale_t my_Empty_Locale;
40 memcpy(search, LocaleString, len);
42 nParts=num_tokens(search,',');
43 for (i=0; ((i<nParts)&&(i<10)); i++)
49 extract_token(&buf[0],search, 0,',',16);
50 /* we are searching, if this list item has something like ;q=n*/
51 if (num_tokens(&buf[0],'=')>1) {
52 extract_token(&sbuf[0],&buf[0], 1,'=',16);
53 wanted_locales[i].Priority=atof(&sbuf[0]);
56 wanted_locales[i].Priority=1.0;
58 /* get the locale part */
59 extract_token(&sbuf[0],&buf[0],0,';',16);
60 /* get the lang part, which should be allways there */
61 extract_token(&wanted_locales[i].lang[0],&sbuf[0],0,'-',16);
62 /* get the area code if any. */
63 if (num_tokens(&sbuf[0],'-')>1) {
64 extract_token(&wanted_locales[i].region[0],&sbuf[0],1,'-',16);
66 else { /* no ara code? use lang code */
67 blen=strlen(&wanted_locales[i].lang[0]);
68 memcpy(&wanted_locales[i].region[0], wanted_locales[i].lang,blen);
69 wanted_locales[i].region[blen]='\0';
70 } /* area codes are uppercase */
71 blen=strlen(&wanted_locales[i].region[0]);
72 for (j=0; j<blen; j++)
74 int chars=toupper(wanted_locales[i].region[j]);
75 wanted_locales[i].region[j]=(char)chars;/*todo ?! */
81 for (i = 0; i <= nFound; i++) {
82 for (j = 0; j < nAvail; j++) {
83 int ret = strncasecmp(&wanted_locales[i].lang[0],
85 strlen(&wanted_locales[i].lang[0]));
87 locale = (char *) AvailLang[j]; //wanted_locales[i];
98 memcpy(search, locale, len);
99 memcpy(&search[len], ".UTF8", 5);
100 search[len + 5] = '\0';
103 // my_Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL); /* create default locale */
104 // my_Locale = newlocale(LC_MESSAGES_MASK /*|LC_TIME_MASK FIXME */ ,
105 // search, my_Empty_Locale);
107 // uselocale(my_Locale);
108 // // freelocale(my_Locale);
109 // // freelocale(my_Empty_Locale);
116 // the web browser sends '-', we need '_'
118 for (i = 0; i < len; i++)
119 if (search[i] == '-')
123 nParts=num_tokens(search,',');
126 extract_token(prefers,search, 1,';',len);
127 extract_token(langs,search, 0,';',len);
137 while ( !done && (nFound < 10)) {
138 if ((search[i] == ',') || (search[i] == ';') || (search[i] == '\0'))
140 if ((search[i] == ';') || (search[i] == '\0'))
143 wanted_locales[nFound] = (char *) &search[j];
154 void offer_languages(void) {
157 wprintf("<select name=\"language\" size=\"1\">\n");
159 for (i=0; i < NUM_LANGS; ++i) {
160 wprintf("<option value=%s>%s</option>\n", AvailLang[i], AvailLang[i]);
163 wprintf("</select>\n");
167 * Set the selected language for this session.
169 void set_selected_language(char *lang) {
172 for (i=0; i<NUM_LANGS; ++i) {
173 if (!strcasecmp(lang, AvailLang[i])) {
174 WC->selected_language = i;
180 * Activate and deactivate the selected language for this session.
182 void go_selected_language(void) {
183 uselocale(wc_locales[WC->selected_language]);
186 void stop_selected_language(void) {
187 uselocale(LC_GLOBAL_LOCALE);
192 * Create a locale_t for each available language
194 void initialize_locales(void) {
196 locale_t Empty_Locale;
199 /* create default locale */
200 Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL);
202 for (i = 0; i < NUM_LANGS; ++i) {
203 sprintf(buf, "%s.UTF8", AvailLang[i]);
204 wc_locales[i] = newlocale(LC_MESSAGES_MASK /* |LC_TIME_MASK FIXME */ ,
212 #else /* ENABLE_NLS */
214 void offer_languages(void) {
215 wprintf("English (US)");
218 void set_selected_language(char *lang) {
221 void go_selected_language(void) {
224 void stop_selected_language(void) {
227 #endif /* ENABLE_NLS */