X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fgettext.c;h=1bc40c8f40a5dbe18f08331d85dd8a8ccf46578f;hb=7951b4c0cec7352cf233588e21ce68915c199830;hp=1e51e93acfc075106e1b5af2bd01205bbc5b300a;hpb=9f62c4f0bfb9aae26df35ada6c755886b8eb7f02;p=citadel.git diff --git a/webcit/gettext.c b/webcit/gettext.c index 1e51e93ac..1bc40c8f4 100644 --- a/webcit/gettext.c +++ b/webcit/gettext.c @@ -15,7 +15,36 @@ #define SEARCH_LANG 20 /* how many langs should we parse? */ #ifdef ENABLE_NLS -#include "language_list.h" +/* actual supported locales */ +const char *AvailLang[] = { + "en_US", + "ar_AE", + "bg_BG", + "cs_CZ", + "en_US", + "da_DK", + "de_DE", + "el_GR", + "en_GB", + "es_ES", + "et_EE", + "fi_FI", + "fr_FR", + "hu_HU", + "it_IT", + "ko_KO", + "nl_NL", + "pl_PL", + "pt_BR", + "ru_RU", + "zh_CN", + "he_IL", + "kk_KK", + "ro_RO", + "sl_SL", + "tr_TR", + "" +}; const char **AvailLangLoaded; long nLocalesLoaded = 0; @@ -25,7 +54,7 @@ locale_t *wc_locales; /* here we keep the parsed stuff */ #endif /* Keep information about one locale */ -typedef struct _lang_pref{ +typedef struct _lang_pref { char lang[16]; /* the language locale string */ char region[16]; /* the region locale string */ long priority; /* which priority does it have */ @@ -49,6 +78,7 @@ void httplang_to_locale(StrBuf *LocaleString, wcsession *sess) LangStruct wanted_locales[SEARCH_LANG]; LangStruct *ls; + long len; int i = 0; int j = 0; /* size_t len = strlen(LocaleString); */ @@ -97,22 +127,22 @@ void httplang_to_locale(StrBuf *LocaleString, wcsession *sess) StrBufExtract_token(SBuf, Buf, 0, ';'); /* get the lang part, which should be allways there */ - extract_token(&ls->lang[0], + extract_token(ls->lang, ChrPtr(SBuf), 0, '-', sizeof(ls->lang)); /* get the area code if any. */ if (StrBufNum_tokens(SBuf, '-') > 1) { - extract_token(&ls->region[0], + extract_token(ls->region, ChrPtr(SBuf), 1, '-', sizeof(ls->region) ); } else { /* no ara code? use lang code */ - blen=strlen(&ls->lang[0]); - memcpy(&ls->region[0], ls->lang, blen); + blen = strlen(ls->lang); + memcpy(ls->region, ls->lang, blen); ls->region[blen] = '\0'; } @@ -124,25 +154,26 @@ void httplang_to_locale(StrBuf *LocaleString, wcsession *sess) chars = toupper(ls->region[j]); ls->region[j] = (char)chars; /* todo ? */ } - snprintf(&lbuf[0], + snprintf(lbuf, sizeof(lbuf), "%s_%s", - &ls->lang[0], - &ls->region[0]); + ls->lang, + ls->region); /* check if we have this lang */ ls->availability = 1; ls->selectedlang = -1; + len = strlen(ls->lang); for (j = 0; j < nLocalesLoaded; j++) { int result; /* match against the LANG part */ - result = strcasecmp(&ls->lang[0], AvailLangLoaded[j]); - if ((result < 0) && (result < ls->availability)){ + result = strncasecmp(ls->lang, AvailLangLoaded[j], len); + if ((result == 0) && (result < ls->availability)){ ls->availability = result; ls->selectedlang = j; } /* match against lang and locale */ - if (0 == strcasecmp(&lbuf[0], AvailLangLoaded[j])){ + if (0 == strcasecmp(lbuf, AvailLangLoaded[j])){ ls->availability = 0; ls->selectedlang = j; j = nLocalesLoaded; @@ -170,7 +201,7 @@ void httplang_to_locale(StrBuf *LocaleString, wcsession *sess) nBest=0; } sess->selected_language = nBest; - syslog(9, "language found: %s", AvailLangLoaded[WC->selected_language]); + syslog(LOG_DEBUG, "language found: %s", AvailLangLoaded[sess->selected_language]); FreeStrBuf(&Buf); FreeStrBuf(&SBuf); } @@ -183,12 +214,25 @@ void httplang_to_locale(StrBuf *LocaleString, wcsession *sess) */ void tmplput_offer_languages(StrBuf *Target, WCTemplputParams *TP) { -#ifdef HAVE_USELOCALE int i; +#ifndef HAVE_USELOCALE + char *Lang = getenv("LANG"); + + if (Lang == NULL) + Lang = "C"; +#endif + + if (nLocalesLoaded == 1) { + wc_printf("

%s

", AvailLangLoaded[0]); + return; + } wc_printf("\n"); -#else - wc_printf("%s", (getenv("LANG") ? getenv("LANG") : "C")); -#endif } /* @@ -223,7 +264,12 @@ void set_selected_language(const char *lang) { void go_selected_language(void) { #ifdef HAVE_USELOCALE wcsession *WCC = WC; - if (WCC->selected_language < 0) return; + if (WCC->selected_language < 0) + { + httplang_to_locale(WCC->Hdr->HR.browser_language, WCC); + if (WCC->selected_language < 0) + return; + } uselocale(wc_locales[WCC->selected_language]); /* switch locales */ textdomain(textdomain(NULL)); /* clear the cache */ #else @@ -244,6 +290,9 @@ void stop_selected_language(void) { #endif } +#ifdef HAVE_USELOCALE + locale_t Empty_Locale; +#endif /* * Create a locale_t for each available language @@ -251,22 +300,16 @@ void stop_selected_language(void) { void initialize_locales(void) { int nLocales; int i; + char buf[32]; char *language = NULL; -#ifdef ENABLE_NLS - setlocale(LC_ALL, ""); - syslog(9, "Text domain: %s", textdomain("webcit")); - syslog(9, "Message catalog directory: %s", bindtextdomain(textdomain(NULL), LOCALEDIR"/locale")); - syslog(9, "Text domain Charset: %s", bind_textdomain_codeset("webcit","UTF8")); -#endif - nLocales = 0; while (!IsEmptyStr(AvailLang[nLocales])) nLocales++; language = getenv("WEBCIT_LANG"); if ((language) && (!IsEmptyStr(language)) && (strcmp(language, "UNLIMITED") != 0)) { - syslog(9, "Nailing locale to %s", language); + syslog(LOG_INFO, "Nailing locale to %s", language); } else language = NULL; @@ -275,47 +318,70 @@ void initialize_locales(void) { #ifdef HAVE_USELOCALE wc_locales = malloc (sizeof(locale_t) * nLocales); memset(wc_locales,0, sizeof(locale_t) * nLocales); - wc_locales[0] = newlocale(LC_ALL_MASK, NULL, NULL); + /* create default locale */ + Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL); #endif - for (i = 1; i < nLocales; ++i) { + for (i = 0; i < nLocales; ++i) { + if ((language != NULL) && (strcmp(AvailLang[i], language) != 0)) + continue; + if (i == 0) { + sprintf(buf, "C"); /* locale 0 (C) is ascii, not utf-8 */ + + } + else { + sprintf(buf, "%s.UTF8", AvailLang[i]); + } #ifdef HAVE_USELOCALE wc_locales[nLocalesLoaded] = newlocale( (LC_MESSAGES_MASK|LC_TIME_MASK), - AvailLang[i], - wc_locales[0] + buf, + (((i > 0) && (wc_locales[0] != NULL)) ? wc_locales[0] : Empty_Locale) ); if (wc_locales[nLocalesLoaded] == NULL) { - syslog(1, "locale for %s disabled: %s", AvailLang[i], strerror(errno)); + syslog(LOG_NOTICE, "locale for %s disabled: %s", buf, strerror(errno)); } else { - syslog(3, "Found locale: %s", AvailLang[i]); + syslog(LOG_INFO, "Found locale: %s - %s", buf, AvailLang[i]); AvailLangLoaded[nLocalesLoaded] = AvailLang[i]; nLocalesLoaded++; } #else if ((language != NULL) && (strcmp(language, AvailLang[i]) == 0)) { - setenv("LANG", AvailLang[i], 1); + setenv("LANG", buf, 1); AvailLangLoaded[nLocalesLoaded] = AvailLang[i]; setlocale(LC_MESSAGES, AvailLang[i]); nLocalesLoaded++; } else if (nLocalesLoaded == 0) { - setenv("LANG", AvailLang[i], 1); + setenv("LANG", buf, 1); AvailLangLoaded[nLocalesLoaded] = AvailLang[i]; nLocalesLoaded++; } #endif } if ((language != NULL) && (nLocalesLoaded == 0)) { - syslog(1, "Your selected locale [%s] isn't available on your system. falling back to C", language); -#ifndef HAVE_USELOCALE + syslog(LOG_WARNING, "Your selected locale [%s] isn't available on your system. falling back to C", language); +#ifdef HAVE_USELOCALE + wc_locales[0] = newlocale( + (LC_MESSAGES_MASK|LC_TIME_MASK), + AvailLang[0], + Empty_Locale + ); +#else setlocale(LC_MESSAGES, AvailLang[0]); setenv("LANG", AvailLang[0], 1); #endif AvailLangLoaded[0] = AvailLang[0]; nLocalesLoaded = 1; } + +#ifdef ENABLE_NLS + setlocale(LC_ALL, ""); + syslog(LOG_DEBUG, "Text domain: %s", textdomain("webcit")); + syslog(LOG_DEBUG, "Text domain Charset: %s", bind_textdomain_codeset("webcit", "UTF8")); + syslog(LOG_DEBUG, "Message catalog directory: %s", bindtextdomain(textdomain(NULL), LOCALEDIR"/locale")); +#endif } @@ -326,7 +392,9 @@ ServerShutdownModule_GETTEXT #ifdef HAVE_USELOCALE int i; for (i = 0; i < nLocalesLoaded; ++i) { - freelocale(wc_locales[i]); + if (Empty_Locale != wc_locales[i]) { + freelocale(wc_locales[i]); + } } free(wc_locales); #endif @@ -340,6 +408,13 @@ const char *AvailLang[] = { }; /* dummy for non NLS enabled systems */ +void +ServerShutdownModule_GETTEXT +(void) +{ +} + + void tmplput_offer_languages(StrBuf *Target, WCTemplputParams *TP) { wc_printf("English (US)"); @@ -362,10 +437,11 @@ void initialize_locales(void) { #endif /* ENABLE_NLS */ - void TmplGettext(StrBuf *Target, WCTemplputParams *TP) { - StrBufAppendBufPlain(Target, _(TP->Tokens->Params[0]->Start), -1, 0); + const char *Text = _(TP->Tokens->Params[0]->Start); + + StrBufAppendTemplateStr(Target, TP, Text, 1); } @@ -376,7 +452,7 @@ void TmplGettext(StrBuf *Target, WCTemplputParams *TP) const char *get_selected_language(void) { #ifdef ENABLE_NLS #ifdef HAVE_USELOCALE - return AvailLang[WC->selected_language]; + return AvailLangLoaded[WC->selected_language]; #else return "en"; #endif