7 static const char *AvailLang[] = {
13 typedef struct _lang_pref{
20 /* TODO: we skip the language weightening so far. */
21 /* Accept-Language: 'de-de,en-us;q=0.7,en;q=0.3' */
22 /* Accept-Language: de,en-ph;q=0.8,en-us;q=0.5,de-at;q=0.3 */
23 void httplang_to_locale(const char *LocaleString)
26 LangStruct wanted_locales[20];
29 size_t len = strlen(LocaleString);
32 const int nAvail = 1; /* Number of members in AvailLang */
33 char *search = (char *) malloc(len);
35 locale_t my_Empty_Locale;
37 memcpy(search, LocaleString, len);
39 nParts=num_tokens(search,',');
40 for (i=0; ((i<nParts)&&(i<10)); i++)
46 extract_token(&buf[0],search, 0,',',16);
47 /* we are searching, if this list item has something like ;q=n*/
48 if (num_tokens(&buf[0],'=')>1) {
49 extract_token(&sbuf[0],&buf[0], 1,'=',16);
50 wanted_locales[i].Priority=atof(&sbuf[0]);
53 wanted_locales[i].Priority=1.0;
55 /* get the locale part */
56 extract_token(&sbuf[0],&buf[0],0,';',16);
57 /* get the lang part, which should be allways there */
58 extract_token(&wanted_locales[i].lang[0],&sbuf[0],0,'-',16);
59 /* get the area code if any. */
60 if (num_tokens(&sbuf[0],'-')>1) {
61 extract_token(&wanted_locales[i].region[0],&sbuf[0],1,'-',16);
63 else { /* no ara code? use lang code */
64 blen=strlen(&wanted_locales[i].lang[0]);
65 memcpy(&wanted_locales[i].region[0], wanted_locales[i].lang,blen);
66 wanted_locales[i].region[blen]='\0';
67 } /* area codes are uppercase */
68 blen=strlen(&wanted_locales[i].region[0]);
69 for (j=0; j<blen; j++)
71 int chars=toupper(wanted_locales[i].region[j]);
72 wanted_locales[i].region[j]=(char)chars;/*todo ?! */
78 for (i = 0; i <= nFound; i++) {
79 for (j = 0; j < nAvail; j++) {
80 int ret = strncasecmp(&wanted_locales[i].lang[0],
82 strlen(&wanted_locales[i].lang[0]));
84 locale = (char *) AvailLang[j]; //wanted_locales[i];
95 memcpy(search, locale, len);
96 memcpy(&search[len], ".UTF8", 5);
97 search[len + 5] = '\0';
98 my_Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL); /* create default locale */
99 my_Locale = newlocale(LC_MESSAGES_MASK /*|LC_TIME_MASK FIXME */ ,
100 search, my_Empty_Locale);
102 uselocale(my_Locale);
103 // freelocale(my_Locale);
104 // freelocale(my_Empty_Locale);
112 // the web browser sends '-', we need '_'
114 for (i = 0; i < len; i++)
115 if (search[i] == '-')
119 nParts=num_tokens(search,',');
122 extract_token(prefers,search, 1,';',len);
123 extract_token(langs,search, 0,';',len);
133 while ( !done && (nFound < 10)) {
134 if ((search[i] == ',') || (search[i] == ';') || (search[i] == '\0'))
136 if ((search[i] == ';') || (search[i] == '\0'))
139 wanted_locales[nFound] = (char *) &search[j];