X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=lang.c;h=e50e752741e1a2a54e6812c6c96b2d09b16c2d05;hb=795115bf680185ae01043bd1222b78bfed8c1d87;hp=f10292dd462cc041276fc80c93aa5e0020345859;hpb=bf0d723076f9be776723b4fe20f9e9a80938f204;p=NeonServV5.git diff --git a/lang.c b/lang.c index f10292d..e50e752 100644 --- a/lang.c +++ b/lang.c @@ -1,6 +1,7 @@ #include "lang.h" #include "UserNode.h" #include "DBHelper.h" +#include "mysqlConn.h" #define DEFAULT_LANG_TAG "EN" #define DEFAULT_LANG_NAME "English" @@ -16,6 +17,16 @@ void free_lang() { } +void load_languages() { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `lang`, `text` FROM `language` WHERE `ident` = 'name'"); + res = mysql_use(); + while((row = mysql_fetch_row(res)) != NULL) { + load_language(row[0], row[1]); + } +} + static struct language* add_language(char *langtag, char *langname) { int cindex; for(cindex = 0; cindex < MAXLANGUAGES; cindex++) { @@ -33,6 +44,7 @@ static struct language* add_language(char *langtag, char *langname) { lang->langname = strdup(langname); struct language_table **entrys = calloc(27, sizeof(*entrys)); lang->entrys = entrys; + langdict[cindex] = lang; return lang; } @@ -42,11 +54,39 @@ static int get_entry_index(const char *ident) { return (underscore[1] - 'A'); } +void load_language(char *tag, char *name) { + struct language *lang = get_language_by_tag(tag); + if(lang == get_default_language()) return; + if(lang) { + //remove all entrys + int cindex; + struct language_table *entry, *next; + for(cindex = 0; cindex < 27; cindex++) { + for(entry = lang->entrys[cindex]; entry; entry = next) { + next = entry->next; + free(entry->ident); + free(entry->text); + free(entry); + } + lang->entrys[cindex] = NULL; + } + } else + lang = add_language(tag, name); + if(!lang) return; + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `ident`, `text` FROM `language` WHERE `lang` = '%s' AND `ident` != 'name'", escape_string(tag)); + res = mysql_use(); + while((row = mysql_fetch_row(res)) != NULL) { + register_language_string(lang, row[0], row[1]); + } +} + struct language* get_language_by_tag(char *tag) { int cindex; for(cindex = 0; cindex < MAXLANGUAGES; cindex++) { if(langdict[cindex] == NULL) break; - if(!strcmp(langdict[cindex]->langtag, tag)) + if(!stricmp(langdict[cindex]->langtag, tag)) return langdict[cindex]; } return NULL; @@ -56,7 +96,7 @@ struct language* get_language_by_name(char *name) { int cindex; for(cindex = 0; cindex < MAXLANGUAGES; cindex++) { if(langdict[cindex] == NULL) break; - if(!strcmp(langdict[cindex]->langname, name)) + if(!stricmp(langdict[cindex]->langname, name)) return langdict[cindex]; } return NULL; @@ -71,23 +111,53 @@ struct language* get_default_language() { void register_default_language_table(const struct default_language_entry *msgtab) { if(lang_c == NULL) lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME); - struct language_table *lang_entry; - int cindex; while(msgtab->ident) { - cindex = get_entry_index(msgtab->ident); - lang_entry = malloc(sizeof(*lang_entry)); - if (!lang_entry) { - perror("malloc() failed"); - return; - } - lang_entry->ident = strdup(msgtab->ident); - lang_entry->text = strdup(msgtab->text); - lang_entry->next = lang_c->entrys[cindex]; - lang_c->entrys[cindex] = lang_entry; + register_language_string(lang_c, msgtab->ident, msgtab->text); msgtab++; } } +void register_language_string(struct language *lang, char *ident, char *text) { + int cindex = get_entry_index(ident); + struct language_table *lang_entry = malloc(sizeof(*lang_entry)); + if (!lang_entry) { + perror("malloc() failed"); + return; + } + + lang_entry->ident = strdup(ident); + //replace all: + //$b to \002 + //$k to \003 + char txt[MAXLEN]; + strcpy(txt, text); + char tmp[MAXLEN]; + int tmppos = 0; + char *a, *b = txt; + do { + a = strstr(b, "$"); + if(a) *a = '\0'; + tmppos += sprintf(tmp + tmppos, "%s", b); + if(a) { + switch(a[1]) { + case 'b': + tmp[tmppos++] = '\002'; + break; + case 'k': + tmp[tmppos++] = '\003'; + break; + default: + //unknown - just write it + tmppos += sprintf(tmp + tmppos, "$%c", a[1]); + } + b = a+2; + } + } while(a); + lang_entry->text = strdup(tmp); + lang_entry->next = lang->entrys[cindex]; + lang->entrys[cindex] = lang_entry; +} + char *get_language_string(struct UserNode *user, const char* msg_ident) { struct language* lang; if((user->flags & USERFLAG_ISAUTHED)) { @@ -101,5 +171,31 @@ char *get_language_string(struct UserNode *user, const char* msg_ident) { if(!strcmp(entry->ident, msg_ident)) return entry->text; } + if(lang == lang_c) return NULL; + for(entry = lang_c->entrys[cindex]; entry; entry = entry->next) { + if(!strcmp(entry->ident, msg_ident)) + return entry->text; + } return NULL; } + +char *build_language_string(struct UserNode *user, char *buffer, const char *msg_ident, ...) { + char *formatStr = get_language_string(user, msg_ident); + if(!formatStr) return NULL; + if(buffer == NULL) { + buffer = (char *)malloc((MAXLEN+1) * sizeof(char)); + if (!buffer) { + perror("malloc() failed"); + return NULL; + } + } + int pos; + va_list arg_list; + buffer[0] = '\0'; + va_start(arg_list, msg_ident); + pos = vsnprintf(buffer, MAXLEN - 2, formatStr, arg_list); + va_end(arg_list); + if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2; + buffer[pos] = '\0'; + return buffer; +}